Skip to content

Commit d516de7

Browse files
committed
Update to NumPy C-API 1.7.
This fixes compiler warnings due to undefined version of NumPy API.
1 parent 2514c88 commit d516de7

File tree

2 files changed

+51
-45
lines changed

2 files changed

+51
-45
lines changed

srrealmodule/srreal_converters.cpp

+48-45
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@ void wrap_exceptions()
100100
/// helper for creating numpy array of doubles
101101
NumPyArray_DoublePtr createNumPyDoubleArray(int dim, const int* sz)
102102
{
103-
boost::python::object rvobj = newNumPyArray(dim, sz, PyArray_DOUBLE);
104-
double* rvdata = static_cast<double*>(PyArray_DATA(rvobj.ptr()));
103+
boost::python::object rvobj = newNumPyArray(dim, sz, NPY_DOUBLE);
104+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(rvobj.ptr());
105+
double* rvdata = static_cast<double*>(PyArray_DATA(a));
105106
NumPyArray_DoublePtr rv(rvobj, rvdata);
106107
return rv;
107108
}
@@ -110,14 +111,15 @@ NumPyArray_DoublePtr createNumPyDoubleArray(int dim, const int* sz)
110111
/// helper for creating numpy array of the same shape as the argument
111112
NumPyArray_DoublePtr createNumPyDoubleArrayLike(boost::python::object& obj)
112113
{
113-
PyObject* arr = obj.ptr();
114-
int dim = PyArray_NDIM(arr);
115-
npy_intp* shape = PyArray_DIMS(arr);
114+
assert(PyArray_Check(obj.ptr()));
115+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(obj.ptr());
116116
// create numpy array
117117
boost::python::object rvobj(
118118
boost::python::handle<>(
119-
PyArray_SimpleNew(dim, shape, PyArray_DOUBLE)));
120-
double* rvdata = static_cast<double*>(PyArray_DATA(rvobj.ptr()));
119+
PyArray_NewLikeArray(
120+
a, NPY_CORDER, PyArray_DescrFromType(NPY_DOUBLE), 0)));
121+
PyArrayObject* a1 = reinterpret_cast<PyArrayObject*>(rvobj.ptr());
122+
double* rvdata = static_cast<double*>(PyArray_DATA(a1));
121123
NumPyArray_DoublePtr rv(rvobj, rvdata);
122124
return rv;
123125
}
@@ -134,7 +136,7 @@ createNumPyDoubleView(double* data, int dim, const int* sz)
134136
copy(sz, sz + dim, npsz);
135137
python::object rv(
136138
python::handle<>(
137-
PyArray_SimpleNewFromData(dim, npsz, PyArray_DOUBLE, data)));
139+
PyArray_SimpleNewFromData(dim, npsz, NPY_DOUBLE, data)));
138140
return rv;
139141
}
140142

@@ -168,16 +170,16 @@ void assignR3Vector(
168170
// If value is numpy array, try direct data access
169171
if (PyArray_Check(value.ptr()))
170172
{
171-
PyObject* vobj = PyArray_ContiguousFromAny(
172-
value.ptr(), PyArray_DOUBLE, 1, 1);
173-
if (vobj && Ndim == PyArray_DIM(vobj, 0))
173+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(
174+
PyArray_ContiguousFromAny(value.ptr(), NPY_DOUBLE, 1, 1));
175+
if (a && Ndim == PyArray_DIM(a, 0))
174176
{
175-
double* p = static_cast<double*>(PyArray_DATA(vobj));
177+
double* p = static_cast<double*>(PyArray_DATA(a));
176178
std::copy(p, p + Ndim, dst.data().begin());
177-
Py_DECREF(vobj);
179+
Py_DECREF(a);
178180
return;
179181
}
180-
Py_XDECREF(vobj);
182+
Py_XDECREF(a);
181183
}
182184
// handle scalar assignment
183185
python::extract<double> getvalue(value);
@@ -201,17 +203,16 @@ void assignR3Matrix(
201203
// If value is numpy array, try direct data access
202204
if (PyArray_Check(value.ptr()))
203205
{
204-
PyObject* vobj = PyArray_ContiguousFromAny(
205-
value.ptr(), PyArray_DOUBLE, 2, 2);
206-
if (vobj && Ndim == PyArray_DIM(vobj, 0) &&
207-
Ndim == PyArray_DIM(vobj, 1))
206+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(
207+
PyArray_ContiguousFromAny(value.ptr(), NPY_DOUBLE, 2, 2));
208+
if (a && Ndim == PyArray_DIM(a, 0) && Ndim == PyArray_DIM(a, 1))
208209
{
209-
double* p = static_cast<double*>(PyArray_DATA(vobj));
210+
double* p = static_cast<double*>(PyArray_DATA(a));
210211
std::copy(p, p + Ndim * Ndim, dst.data().begin());
211-
Py_DECREF(vobj);
212+
Py_DECREF(a);
212213
return;
213214
}
214-
Py_XDECREF(vobj);
215+
Py_XDECREF(a);
215216
}
216217
// handle scalar assignment
217218
python::extract<double> getvalue(value);
@@ -229,8 +230,9 @@ void assignR3Matrix(
229230
/// helper for creating numpy array of integers
230231
NumPyArray_IntPtr createNumPyIntArray(int dim, const int* sz)
231232
{
232-
boost::python::object rvobj = newNumPyArray(dim, sz, PyArray_INT);
233-
int* rvdata = static_cast<int*>(PyArray_DATA(rvobj.ptr()));
233+
boost::python::object rvobj = newNumPyArray(dim, sz, NPY_INT);
234+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(rvobj.ptr());
235+
int* rvdata = static_cast<int*>(PyArray_DATA(a));
234236
NumPyArray_IntPtr rv(rvobj, rvdata);
235237
return rv;
236238
}
@@ -248,15 +250,16 @@ extractQuantityType(
248250
python::extract<QuantityType&> getqt(obj);
249251
if (getqt.check()) return getqt();
250252
// copy data directly if it is a numpy array of doubles
251-
PyObject* pobj = obj.ptr();
252-
bool isdoublenumpyarray = PyArray_Check(pobj) &&
253-
(1 == PyArray_NDIM(pobj)) &&
254-
(PyArray_DOUBLE == PyArray_TYPE(pobj));
253+
PyArrayObject* a = PyArray_Check(obj.ptr()) ?
254+
reinterpret_cast<PyArrayObject*>(obj.ptr()) : NULL;
255+
bool isdoublenumpyarray = a &&
256+
(1 == PyArray_NDIM(a)) &&
257+
(NPY_DOUBLE == PyArray_TYPE(a));
255258
if (isdoublenumpyarray)
256259
{
257-
double* src = static_cast<double*>(PyArray_DATA(pobj));
258-
npy_intp stride = PyArray_STRIDE(pobj, 0) / PyArray_ITEMSIZE(pobj);
259-
rv.resize(PyArray_SIZE(pobj));
260+
double* src = static_cast<double*>(PyArray_DATA(a));
261+
npy_intp stride = PyArray_STRIDE(a, 0) / PyArray_ITEMSIZE(a);
262+
rv.resize(PyArray_SIZE(a));
260263
QuantityType::iterator dst = rv.begin();
261264
for (; dst != rv.end(); ++dst, src += stride) *dst = *src;
262265
return rv;
@@ -271,16 +274,17 @@ extractQuantityType(
271274
/// efficient conversion of Python object to a numpy array of doubles
272275
NumPyArray_DoublePtr extractNumPyDoubleArray(::boost::python::object& obj)
273276
{
274-
PyObject* arr = PyArray_ContiguousFromAny(obj.ptr(), PyArray_DOUBLE, 0, 0);
275-
if (!arr)
277+
PyObject* pobj = PyArray_ContiguousFromAny(obj.ptr(), NPY_DOUBLE, 0, 0);
278+
if (!pobj)
276279
{
277280
const char* emsg = "Cannot convert this object to numpy array.";
278281
PyErr_SetString(PyExc_TypeError, emsg);
279282
boost::python::throw_error_already_set();
280283
abort();
281284
}
282-
boost::python::object rvobj((boost::python::handle<>(arr)));
283-
double* rvdata = static_cast<double*>(PyArray_DATA(arr));
285+
boost::python::object rvobj((boost::python::handle<>(pobj)));
286+
PyArrayObject* a = reinterpret_cast<PyArrayObject*>(pobj);
287+
double* rvdata = static_cast<double*>(PyArray_DATA(a));
284288
NumPyArray_DoublePtr rv(rvobj, rvdata);
285289
return rv;
286290
}
@@ -311,24 +315,23 @@ std::vector<int> extractintvector(boost::python::object obj)
311315
// iterable of integers
312316
if (isiterable(obj))
313317
{
314-
PyObject* pobj = obj.ptr();
318+
PyArrayObject* a = PyArray_Check(obj.ptr()) ?
319+
reinterpret_cast<PyArrayObject*>(obj.ptr()) : NULL;
315320
// handle numpy array of integers
316-
bool isintegernumpyarray = PyArray_Check(pobj) &&
317-
(1 == PyArray_NDIM(pobj)) && PyArray_ISINTEGER(pobj);
321+
bool isintegernumpyarray =
322+
a && (1 == PyArray_NDIM(a)) && PyArray_ISINTEGER(a);
318323
if (isintegernumpyarray)
319324
{
320325
object aobj = obj;
321-
if (PyArray_INT != PyArray_TYPE(pobj))
326+
if (NPY_INT != PyArray_TYPE(a))
322327
{
323-
object a1(handle<>(PyArray_Cast(
324-
reinterpret_cast<PyArrayObject*>(pobj),
325-
PyArray_INT)));
328+
object a1(handle<>(PyArray_Cast(a, NPY_INT)));
326329
aobj = a1;
327330
}
328-
PyObject* pa = aobj.ptr();
329-
assert(PyArray_INT == PyArray_TYPE(pa));
330-
int* pfirst = static_cast<int*>(PyArray_DATA(pa));
331-
int* plast = pfirst + PyArray_SIZE(pa);
331+
PyArrayObject* a1 = reinterpret_cast<PyArrayObject*>(aobj.ptr());
332+
assert(NPY_INT == PyArray_TYPE(a1));
333+
int* pfirst = static_cast<int*>(PyArray_DATA(a1));
334+
int* plast = pfirst + PyArray_SIZE(a1);
332335
rv.assign(pfirst, plast);
333336
return rv;
334337
}

srrealmodule/srreal_numpy_symbol.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
#ifndef SRREAL_NUMPY_SYMBOL_HPP_INCLUDED
2020
#define SRREAL_NUMPY_SYMBOL_HPP_INCLUDED
2121

22+
// Specify the version of NumPy API that will be used.
23+
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
24+
2225
// This macro is required for extension modules that are in several files.
2326
// It must be defined before inclusion of numpy/arrayobject.h
2427
#define PY_ARRAY_UNIQUE_SYMBOL DIFFPY_SRREAL_NUMPY_ARRAY_SYMBOL

0 commit comments

Comments
 (0)