I can partially answer my own questions here:

1) To avoid figuring out the type underlying npy_complex64 etc, the following 
macro seems to work:

          #define set_real(X, Y) _Generic((X), \
              npy_cfloat: npy_csetrealf, \
              npy_cdouble: npy_csetreal, \
              npy_clongdouble: npy_csetreall \
            )((X), (Y))

            #define set_imag(X, Y) _Generic((X), \
              npy_cfloat: npy_csetimagf, \
              npy_cdouble: npy_csetimag, \
              npy_clongdouble: npy_csetimagl \
            )((X), (Y))

            #define get_real(X) _Generic((X), \
              npy_cfloat: npy_crealf, \
              npy_cdouble: npy_creal, \
              npy_clongdouble: npy_creall \
            )(X)

            #define get_imag(X) _Generic((X), \
              npy_cfloat: npy_cimagf, \
              npy_cdouble: npy_cimag, \
              npy_clongdouble: npy_cimagl \
            )(X)

Since we're using C++ for pytensor, overloading inline functions for get_real, 
set_real, etc. would also be an option.

For 2), I realised that scalarmath.c.src already redefines the arithmetic of 
complex types. I was assuming that the built in C99 operations were being used 
(and if __cplusplus is defined, I guess I was assuming that the structs were 
cast to C complex types).

This post suggests this gives better performance than the built in C99 
operations: 
https://stackoverflow.com/questions/11076924/how-to-use-cx-limited-range-on-off

Using the compiler flag they suggest could mean that numpy doesn't need to 
redefine the arithmetic operators for complex numbers, although I don't know if 
there is a clang equivalent, and I suppose it isn't much code saved.
_______________________________________________
NumPy-Discussion mailing list -- numpy-discussion@python.org
To unsubscribe send an email to numpy-discussion-le...@python.org
https://mail.python.org/mailman3/lists/numpy-discussion.python.org/
Member address: arch...@mail-archive.com

Reply via email to