Skip to content

Commit

Permalink
Remove unnecessary inline functions, use npy_c* inline functions instead
Browse files Browse the repository at this point in the history
  • Loading branch information
lysnikolaou committed Jul 25, 2023
1 parent 5757057 commit 7508afd
Show file tree
Hide file tree
Showing 18 changed files with 302 additions and 324 deletions.
1 change: 0 additions & 1 deletion numpy/core/include/numpy/ndarraytypes.h
Expand Up @@ -2,7 +2,6 @@
#define NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_

#include "npy_common.h"
#include "npy_math.h"
#include "npy_endian.h"
#include "npy_cpu.h"
#include "utils.h"
Expand Down
165 changes: 66 additions & 99 deletions numpy/core/include/numpy/npy_math.h
Expand Up @@ -360,147 +360,114 @@ NPY_INPLACE npy_longdouble npy_heavisidel(npy_longdouble x, npy_longdouble h0);
* Complex declarations
*/

typedef union {
double *arr;
const npy_cdouble *comp;
} _npy_cdouble_to_arr;

typedef union {
float *arr;
const npy_cfloat *comp;
} _npy_cfloat_to_arr;

typedef union {
longdouble_t *arr;
const npy_clongdouble *comp;
} _npy_clongdouble_to_arr;

static inline double NPY_CDOUBLE_GET_REAL(const npy_cdouble *c) {
_npy_cdouble_to_arr tmp;
tmp.comp = c;
return tmp.arr[0];
#define REAL 0
#define IMAG 1
#define CREATE_UNION(ctype, npy_ctype) \
typedef union { \
ctype *arr; \
const npy_ctype *comp; \
} _u;
#define NPY_COMPLEX_GET(ctype, npy_ctype, c, real_or_imag) \
CREATE_UNION(ctype, npy_ctype) \
_u tmp; \
tmp.comp = &c; \
return tmp.arr[real_or_imag]; \

#define NPY_COMPLEX_SET(ctype, npy_ctype, c, val, real_or_imag) \
CREATE_UNION(ctype, npy_ctype) \
_u tmp; \
tmp.comp = c; \
tmp.arr[real_or_imag] = val; \

static inline double npy_creal(npy_cdouble z)
{
NPY_COMPLEX_GET(double, npy_cdouble, z, REAL)
}

static inline double NPY_CDOUBLE_GET_IMAG(const npy_cdouble *c) {
_npy_cdouble_to_arr tmp;
tmp.comp = c;
return tmp.arr[1];
static inline void npy_csetreal(npy_cdouble *z, double r)
{
NPY_COMPLEX_SET(double, npy_cdouble, z, r, REAL)
}

static inline void NPY_CDOUBLE_SET_REAL(npy_cdouble *c, double real) {
_npy_cdouble_to_arr tmp;
tmp.comp = c;
tmp.arr[0] = real;
static inline double npy_cimag(npy_cdouble z)
{
NPY_COMPLEX_GET(double, npy_cdouble, z, IMAG)
}

static inline void NPY_CDOUBLE_SET_IMAG(npy_cdouble *c, double imag) {
_npy_cdouble_to_arr tmp;
tmp.comp = c;
tmp.arr[1] = imag;
static inline void npy_csetimag(npy_cdouble *z, double i)
{
NPY_COMPLEX_SET(double, npy_cdouble, z, i, IMAG)
}

static inline float NPY_CFLOAT_GET_REAL(const npy_cfloat *c) {
_npy_cfloat_to_arr tmp;
tmp.comp = c;
return tmp.arr[0];
static inline float npy_crealf(npy_cfloat z)

Check warning on line 402 in numpy/core/include/numpy/npy_math.h

View check run for this annotation

Codecov / codecov/patch

numpy/core/include/numpy/npy_math.h#L402

Added line #L402 was not covered by tests
{
NPY_COMPLEX_GET(float, npy_cfloat, z, REAL)
}

static inline float NPY_CFLOAT_GET_IMAG(const npy_cfloat *c) {
_npy_cfloat_to_arr tmp;
tmp.comp = c;
return tmp.arr[1];
static inline void npy_csetrealf(npy_cfloat *z, float r)
{
NPY_COMPLEX_SET(float, npy_cfloat, z, r, REAL)
}

static inline void NPY_CFLOAT_SET_REAL(npy_cfloat *c, float real) {
_npy_cfloat_to_arr tmp;
tmp.comp = c;
tmp.arr[0] = real;
static inline float npy_cimagf(npy_cfloat z)
{
NPY_COMPLEX_GET(float, npy_cfloat, z, IMAG)
}

static inline void NPY_CFLOAT_SET_IMAG(npy_cfloat *c, float imag) {
_npy_cfloat_to_arr tmp;
tmp.comp = c;
tmp.arr[1] = imag;
static inline void npy_csetimagf(npy_cfloat *z, float i)
{
NPY_COMPLEX_SET(float, npy_cfloat, z, i, IMAG)
}

static inline longdouble_t NPY_CLONGDOUBLE_GET_REAL(const npy_clongdouble *c) {
_npy_clongdouble_to_arr tmp;
tmp.comp = c;
return tmp.arr[0];
static inline npy_longdouble npy_creall(npy_clongdouble z)
{
NPY_COMPLEX_GET(longdouble_t, npy_clongdouble, z, REAL)
}

static inline longdouble_t NPY_CLONGDOUBLE_GET_IMAG(const npy_clongdouble *c) {
_npy_clongdouble_to_arr tmp;
tmp.comp = c;
return tmp.arr[1];
static inline void npy_csetreall(npy_clongdouble *z, longdouble_t r)
{
NPY_COMPLEX_SET(longdouble_t, npy_clongdouble, z, r, REAL)
}

static inline void NPY_CLONGDOUBLE_SET_REAL(npy_clongdouble *c, longdouble_t real) {
_npy_clongdouble_to_arr tmp;
tmp.comp = c;
tmp.arr[0] = real;
static inline npy_longdouble npy_cimagl(npy_clongdouble z)
{
NPY_COMPLEX_GET(longdouble_t, npy_clongdouble, z, IMAG)
}

static inline void NPY_CLONGDOUBLE_SET_IMAG(npy_clongdouble *c, longdouble_t imag) {
_npy_clongdouble_to_arr tmp;
tmp.comp = c;
tmp.arr[1] = imag;
static inline void npy_csetimagl(npy_clongdouble *z, longdouble_t i)
{
NPY_COMPLEX_SET(longdouble_t, npy_clongdouble, z, i, IMAG)
}
#undef REAL
#undef IMAG
#undef CREATE_UNION
#undef NPY_COMPLEX_GET
#undef NPY_COMPLEX_SET

static inline npy_cdouble npy_cpack(double x, double y)
{
npy_cdouble z;
NPY_CDOUBLE_SET_REAL(&z, x);
NPY_CDOUBLE_SET_IMAG(&z, y);
npy_csetreal(&z, x);
npy_csetimag(&z, y);
return z;
}

static inline npy_cfloat npy_cpackf(float x, float y)
{
npy_cfloat z;
NPY_CFLOAT_SET_REAL(&z, x);
NPY_CFLOAT_SET_IMAG(&z, y);
npy_csetrealf(&z, x);
npy_csetimagf(&z, y);
return z;
}

static inline npy_clongdouble npy_cpackl(npy_longdouble x, npy_longdouble y)
{
npy_clongdouble z;
NPY_CLONGDOUBLE_SET_REAL(&z, x);
NPY_CLONGDOUBLE_SET_IMAG(&z, y);
npy_csetreall(&z, x);
npy_csetimagl(&z, y);
return z;
}

static inline double npy_creal(npy_cdouble z)
{
return NPY_CDOUBLE_GET_REAL(&z);
}

static inline double npy_cimag(npy_cdouble z)
{
return NPY_CDOUBLE_GET_IMAG(&z);
}

static inline float npy_crealf(npy_cfloat z)
{
return NPY_CFLOAT_GET_REAL(&z);
}

static inline float npy_cimagf(npy_cfloat z)
{
return NPY_CFLOAT_GET_IMAG(&z);
}

static inline npy_longdouble npy_creall(npy_clongdouble z)
{
return NPY_CLONGDOUBLE_GET_REAL(&z);
}

static inline npy_longdouble npy_cimagl(npy_clongdouble z)
{
return NPY_CLONGDOUBLE_GET_IMAG(&z);
}

/*
* Double precision complex functions
*/
Expand Down
16 changes: 8 additions & 8 deletions numpy/core/src/common/cblasfuncs.c
Expand Up @@ -423,10 +423,10 @@ cblas_matrixproduct(int typenum, PyArrayObject *ap1, PyArrayObject *ap2,
ptr1 = (npy_cdouble *)PyArray_DATA(ap2);
ptr2 = (npy_cdouble *)PyArray_DATA(ap1);
res = (npy_cdouble *)PyArray_DATA(out_buf);
NPY_CDOUBLE_SET_REAL(res, NPY_CDOUBLE_GET_REAL(ptr1) * NPY_CDOUBLE_GET_REAL(ptr2)
- NPY_CDOUBLE_GET_IMAG(ptr1) * NPY_CDOUBLE_GET_IMAG(ptr2));
NPY_CDOUBLE_SET_IMAG(res, NPY_CDOUBLE_GET_REAL(ptr1) * NPY_CDOUBLE_GET_IMAG(ptr2)
+ NPY_CDOUBLE_GET_IMAG(ptr1) * NPY_CDOUBLE_GET_REAL(ptr2));
npy_csetreal(res, npy_creal(*ptr1) * npy_creal(*ptr2)
- npy_cimag(*ptr1) * npy_cimag(*ptr2));
npy_csetimag(res, npy_creal(*ptr1) * npy_cimag(*ptr2)
+ npy_cimag(*ptr1) * npy_creal(*ptr2));
}
else if (ap1shape != _matrix) {
CBLAS_FUNC(cblas_zaxpy)(l,
Expand Down Expand Up @@ -498,10 +498,10 @@ cblas_matrixproduct(int typenum, PyArrayObject *ap1, PyArrayObject *ap2,
ptr1 = (npy_cfloat *)PyArray_DATA(ap2);
ptr2 = (npy_cfloat *)PyArray_DATA(ap1);
res = (npy_cfloat *)PyArray_DATA(out_buf);
NPY_CFLOAT_SET_REAL(res, NPY_CFLOAT_GET_REAL(ptr1) * NPY_CFLOAT_GET_REAL(ptr2)
- NPY_CFLOAT_GET_IMAG(ptr1) * NPY_CFLOAT_GET_IMAG(ptr2));
NPY_CFLOAT_SET_IMAG(res, NPY_CFLOAT_GET_REAL(ptr1) * NPY_CFLOAT_GET_IMAG(ptr2)
+ NPY_CFLOAT_GET_IMAG(ptr1) * NPY_CFLOAT_GET_REAL(ptr2));
npy_csetrealf(res, npy_crealf(*ptr1) * npy_crealf(*ptr2)
- npy_cimagf(*ptr1) * npy_cimagf(*ptr2));
npy_csetimagf(res, npy_crealf(*ptr1) * npy_cimagf(*ptr2)
+ npy_cimagf(*ptr1) * npy_crealf(*ptr2));
}
else if (ap1shape != _matrix) {
CBLAS_FUNC(cblas_caxpy)(l,
Expand Down

0 comments on commit 7508afd

Please sign in to comment.