numpy_popcount
This commit is contained in:
parent
ba9a8cccd1
commit
b3239a8ba4
|
@ -0,0 +1,7 @@
|
|||
/build
|
||||
/numpy_popcount/
|
||||
*.egg-info
|
||||
*.so
|
||||
*.pyc
|
||||
*.pyo
|
||||
__pycache__
|
|
@ -0,0 +1 @@
|
|||
from .numpy_popcount import popcount
|
|
@ -0,0 +1,87 @@
|
|||
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
|
||||
#include "Python.h"
|
||||
#include "math.h"
|
||||
#include "numpy/ndarraytypes.h"
|
||||
#include "numpy/ufuncobject.h"
|
||||
#include "numpy/npy_3kcompat.h"
|
||||
|
||||
static PyMethodDef PopcountMethods[] = {
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
#define CONCAT2(A, B) A##B
|
||||
#define CONCAT(A, B) CONCAT2(A, B)
|
||||
|
||||
#define MAKE_POPCOUNT(prefix, ty) \
|
||||
static void CONCAT(prefix,_popcount)(char** args, const npy_intp* dimensions, \
|
||||
const npy_intp* steps, void* data) { \
|
||||
npy_intp i; \
|
||||
npy_intp n = dimensions[0]; \
|
||||
char* in = args[0]; \
|
||||
char* out = args[1]; \
|
||||
npy_intp in_step = steps[0], out_step = steps[1]; \
|
||||
ty tmp; \
|
||||
for (i = 0; i < n; i++) { \
|
||||
tmp = *(ty*)in; \
|
||||
*((ty*)out) = __builtin_popcountl((unsigned long) tmp); \
|
||||
in += in_step; \
|
||||
out += out_step; \
|
||||
} \
|
||||
}
|
||||
|
||||
MAKE_POPCOUNT(u8, uint8_t)
|
||||
MAKE_POPCOUNT(u16, uint16_t)
|
||||
MAKE_POPCOUNT(u32, uint32_t)
|
||||
MAKE_POPCOUNT(u64, uint64_t)
|
||||
|
||||
PyUFuncGenericFunction funcs[4] = {
|
||||
&u8_popcount,
|
||||
&u16_popcount,
|
||||
&u32_popcount,
|
||||
&u64_popcount
|
||||
};
|
||||
|
||||
static char types[8] = {
|
||||
NPY_UINT8, NPY_UINT8,
|
||||
NPY_UINT16, NPY_UINT16,
|
||||
NPY_UINT32, NPY_UINT32,
|
||||
NPY_UINT64, NPY_UINT64,
|
||||
};
|
||||
|
||||
static void* data[4] = {NULL, NULL, NULL, NULL};
|
||||
|
||||
static struct PyModuleDef moduledef = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
"numpy_popcount",
|
||||
NULL,
|
||||
-1,
|
||||
PopcountMethods,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC PyInit_numpy_popcount(void) {
|
||||
PyObject* m;
|
||||
PyObject* numpy_popcount;
|
||||
PyObject* d;
|
||||
m = PyModule_Create(&moduledef);
|
||||
if (!m) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
import_array();
|
||||
import_umath();
|
||||
|
||||
numpy_popcount = PyUFunc_FromFuncAndData(funcs, data, types, 4, 1, 1,
|
||||
PyUFunc_None, "popcount",
|
||||
"numpy_popcount doc", 0);
|
||||
|
||||
d = PyModule_GetDict(m);
|
||||
|
||||
PyDict_SetItemString(d, "popcount", numpy_popcount);
|
||||
Py_DECREF(numpy_popcount);
|
||||
|
||||
return m;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
def configuration(parent_package='', top_path=None):
|
||||
import numpy
|
||||
from numpy.distutils.misc_util import Configuration
|
||||
|
||||
config = Configuration('numpy_popcount',
|
||||
parent_package,
|
||||
top_path)
|
||||
config.add_extension('numpy_popcount', ['numpy_popcount.c'])
|
||||
|
||||
return config
|
||||
|
||||
if __name__ == "__main__":
|
||||
from numpy.distutils.core import setup
|
||||
setup(configuration=configuration)
|
Loading…
Reference in New Issue