123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- /////////////// Header.proto ///////////////
- //@proto_block: h_code
- #if !defined(CYTHON_CCOMPLEX)
- #if defined(__cplusplus)
- #define CYTHON_CCOMPLEX 1
- #elif (defined(_Complex_I) && !defined(_MSC_VER))
- // MSVC defines "_Complex_I" but not "_Complex". See https://github.com/cython/cython/issues/5512
- #define CYTHON_CCOMPLEX 1
- #else
- #define CYTHON_CCOMPLEX 0
- #endif
- #endif
- #if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- #include <complex>
- #else
- #include <complex.h>
- #endif
- #endif
- #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)
- #undef _Complex_I
- #define _Complex_I 1.0fj
- #endif
- /////////////// RealImag.proto ///////////////
- #if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- #define __Pyx_CREAL(z) ((z).real())
- #define __Pyx_CIMAG(z) ((z).imag())
- #else
- #define __Pyx_CREAL(z) (__real__(z))
- #define __Pyx_CIMAG(z) (__imag__(z))
- #endif
- #else
- #define __Pyx_CREAL(z) ((z).real)
- #define __Pyx_CIMAG(z) ((z).imag)
- #endif
- #if defined(__cplusplus) && CYTHON_CCOMPLEX \
- && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103)
- #define __Pyx_SET_CREAL(z,x) ((z).real(x))
- #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
- #else
- #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
- #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
- #endif
- /////////////// Declarations.proto ///////////////
- //@proto_block: complex_type_declarations
- #if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- typedef ::std::complex< {{real_type}} > {{type_name}};
- #else
- typedef {{real_type}} _Complex {{type_name}};
- #endif
- #else
- typedef struct { {{real_type}} real, imag; } {{type_name}};
- #endif
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}}, {{real_type}});
- /////////////// Declarations ///////////////
- #if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- return ::std::complex< {{real_type}} >(x, y);
- }
- #else
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- return x + y*({{type}})_Complex_I;
- }
- #endif
- #else
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- {{type}} z;
- z.real = x;
- z.imag = y;
- return z;
- }
- #endif
- /////////////// ToPy.proto ///////////////
- #define __pyx_PyComplex_FromComplex(z) \
- PyComplex_FromDoubles((double)__Pyx_CREAL(z), \
- (double)__Pyx_CIMAG(z))
- /////////////// FromPy.proto ///////////////
- static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject*);
- /////////////// FromPy ///////////////
- static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject* o) {
- Py_complex cval;
- #if !CYTHON_COMPILING_IN_PYPY
- if (PyComplex_CheckExact(o))
- cval = ((PyComplexObject *)o)->cval;
- else
- #endif
- cval = PyComplex_AsCComplex(o);
- return {{type_name}}_from_parts(
- ({{real_type}})cval.real,
- ({{real_type}})cval.imag);
- }
- /////////////// Arithmetic.proto ///////////////
- #if CYTHON_CCOMPLEX
- #define __Pyx_c_eq{{func_suffix}}(a, b) ((a)==(b))
- #define __Pyx_c_sum{{func_suffix}}(a, b) ((a)+(b))
- #define __Pyx_c_diff{{func_suffix}}(a, b) ((a)-(b))
- #define __Pyx_c_prod{{func_suffix}}(a, b) ((a)*(b))
- #define __Pyx_c_quot{{func_suffix}}(a, b) ((a)/(b))
- #define __Pyx_c_neg{{func_suffix}}(a) (-(a))
- #ifdef __cplusplus
- #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==({{real_type}})0)
- #define __Pyx_c_conj{{func_suffix}}(z) (::std::conj(z))
- #if {{is_float}}
- #define __Pyx_c_abs{{func_suffix}}(z) (::std::abs(z))
- #define __Pyx_c_pow{{func_suffix}}(a, b) (::std::pow(a, b))
- #endif
- #else
- #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==0)
- #define __Pyx_c_conj{{func_suffix}}(z) (conj{{m}}(z))
- #if {{is_float}}
- #define __Pyx_c_abs{{func_suffix}}(z) (cabs{{m}}(z))
- #define __Pyx_c_pow{{func_suffix}}(a, b) (cpow{{m}}(a, b))
- #endif
- #endif
- #else
- static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}});
- static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}});
- #if {{is_float}}
- static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}}, {{type}});
- #endif
- #endif
- /////////////// Arithmetic ///////////////
- #if CYTHON_CCOMPLEX
- #else
- static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}} a, {{type}} b) {
- return (a.real == b.real) && (a.imag == b.imag);
- }
- static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real + b.real;
- z.imag = a.imag + b.imag;
- return z;
- }
- static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real - b.real;
- z.imag = a.imag - b.imag;
- return z;
- }
- static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real * b.real - a.imag * b.imag;
- z.imag = a.real * b.imag + a.imag * b.real;
- return z;
- }
- #if {{is_float}}
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
- if (b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
- } else if (fabs{{m}}(b.real) >= fabs{{m}}(b.imag)) {
- if (b.real == 0 && b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.imag);
- } else {
- {{real_type}} r = b.imag / b.real;
- {{real_type}} s = ({{real_type}})(1.0) / (b.real + b.imag * r);
- return {{type_name}}_from_parts(
- (a.real + a.imag * r) * s, (a.imag - a.real * r) * s);
- }
- } else {
- {{real_type}} r = b.real / b.imag;
- {{real_type}} s = ({{real_type}})(1.0) / (b.imag + b.real * r);
- return {{type_name}}_from_parts(
- (a.real * r + a.imag) * s, (a.imag * r - a.real) * s);
- }
- }
- #else
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
- if (b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
- } else {
- {{real_type}} denom = b.real * b.real + b.imag * b.imag;
- return {{type_name}}_from_parts(
- (a.real * b.real + a.imag * b.imag) / denom,
- (a.imag * b.real - a.real * b.imag) / denom);
- }
- }
- #endif
- static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}} a) {
- {{type}} z;
- z.real = -a.real;
- z.imag = -a.imag;
- return z;
- }
- static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}} a) {
- return (a.real == 0) && (a.imag == 0);
- }
- static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}} a) {
- {{type}} z;
- z.real = a.real;
- z.imag = -a.imag;
- return z;
- }
- #if {{is_float}}
- static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}} z) {
- #if !defined(HAVE_HYPOT) || defined(_MSC_VER)
- return sqrt{{m}}(z.real*z.real + z.imag*z.imag);
- #else
- return hypot{{m}}(z.real, z.imag);
- #endif
- }
- static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- {{real_type}} r, lnr, theta, z_r, z_theta;
- if (b.imag == 0 && b.real == (int)b.real) {
- if (b.real < 0) {
- {{real_type}} denom = a.real * a.real + a.imag * a.imag;
- a.real = a.real / denom;
- a.imag = -a.imag / denom;
- b.real = -b.real;
- }
- switch ((int)b.real) {
- case 0:
- z.real = 1;
- z.imag = 0;
- return z;
- case 1:
- return a;
- case 2:
- return __Pyx_c_prod{{func_suffix}}(a, a);
- case 3:
- z = __Pyx_c_prod{{func_suffix}}(a, a);
- return __Pyx_c_prod{{func_suffix}}(z, a);
- case 4:
- z = __Pyx_c_prod{{func_suffix}}(a, a);
- return __Pyx_c_prod{{func_suffix}}(z, z);
- }
- }
- if (a.imag == 0) {
- if (a.real == 0) {
- return a;
- } else if ((b.imag == 0) && (a.real >= 0)) {
- z.real = pow{{m}}(a.real, b.real);
- z.imag = 0;
- return z;
- } else if (a.real > 0) {
- r = a.real;
- theta = 0;
- } else {
- r = -a.real;
- theta = atan2{{m}}(0.0, -1.0);
- }
- } else {
- r = __Pyx_c_abs{{func_suffix}}(a);
- theta = atan2{{m}}(a.imag, a.real);
- }
- lnr = log{{m}}(r);
- z_r = exp{{m}}(lnr * b.real - theta * b.imag);
- z_theta = theta * b.real + lnr * b.imag;
- z.real = z_r * cos{{m}}(z_theta);
- z.imag = z_r * sin{{m}}(z_theta);
- return z;
- }
- #endif
- #endif
|