1 #include "Python.h"
2 #include <stdlib.h>
3 #include "py2to3.h"
4 
5 #include "interpolate.h"
6 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
7 #include "numpy/arrayobject.h"
8 
9 
10 using namespace std;
11 
12 extern "C" {
13 
linear_method(PyObject * self,PyObject * args,PyObject * kywds)14 static PyObject* linear_method(PyObject*self, PyObject* args, PyObject* kywds)
15 {
16     const char *kwlist[] = {"x","y","new_x","new_y", NULL};
17     PyObject *py_x, *py_y, *py_new_x, *py_new_y;
18     py_x = py_y = py_new_x = py_new_y = NULL;
19     PyObject *arr_x, *arr_y, *arr_new_x, *arr_new_y;
20     arr_x = arr_y = arr_new_x = arr_new_y = NULL;
21 
22     if (!PyArg_ParseTupleAndKeywords(args, kywds, "OOOO:linear_dddd",
23                                      const_cast<char**>(kwlist), &py_x, &py_y,
24                                      &py_new_x, &py_new_y))
25        return NULL;
26     arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
27     if (!arr_x) {
28         PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
29         goto fail;
30     }
31     arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
32     if (!arr_y) {
33         PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
34         goto fail;
35     }
36     arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
37     if (!arr_new_x) {
38         PyErr_SetString(PyExc_ValueError,
39                         "new_x must be a 1-D array of floats");
40         goto fail;
41     }
42     arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
43                                 NPY_ARRAY_INOUT_ARRAY);
44     if (!arr_new_y) {
45         PyErr_SetString(PyExc_ValueError,
46                         "new_y must be a 1-D array of floats");
47         goto fail;
48     }
49 
50     linear((double*)PyArray_DATA((PyArrayObject*)arr_x),
51            (double*)PyArray_DATA((PyArrayObject*)arr_y),
52            PyArray_DIM((PyArrayObject*)arr_x, 0),
53            (double*)PyArray_DATA((PyArrayObject*)arr_new_x),
54            (double*)PyArray_DATA((PyArrayObject*)arr_new_y),
55            PyArray_DIM((PyArrayObject*)arr_new_x, 0));
56 
57     Py_DECREF(arr_x);
58     Py_DECREF(arr_y);
59     Py_DECREF(arr_new_x);
60     Py_DECREF(arr_new_y);
61 
62     Py_RETURN_NONE;
63 
64 fail:
65     Py_XDECREF(arr_x);
66     Py_XDECREF(arr_y);
67     Py_XDECREF(arr_new_x);
68     Py_XDECREF(arr_new_y);
69     return NULL;
70 }
71 
loginterp_method(PyObject * self,PyObject * args,PyObject * kywds)72 static PyObject* loginterp_method(PyObject*self, PyObject* args,
73                                   PyObject* kywds)
74 {
75     const char *kwlist[] = {"x","y","new_x","new_y", NULL};
76     PyObject *py_x, *py_y, *py_new_x, *py_new_y;
77     py_x = py_y = py_new_x = py_new_y = NULL;
78     PyObject *arr_x, *arr_y, *arr_new_x, *arr_new_y;
79     arr_x = arr_y = arr_new_x = arr_new_y = NULL;
80 
81     if (!PyArg_ParseTupleAndKeywords(args, kywds, "OOOO:loginterp_dddd",
82                                      const_cast<char **>(kwlist), &py_x, &py_y,
83                                      &py_new_x, &py_new_y))
84        return NULL;
85     arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
86     if (!arr_x) {
87         PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
88         goto fail;
89     }
90     arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
91     if (!arr_y) {
92         PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
93         goto fail;
94     }
95     arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
96     if (!arr_new_x) {
97         PyErr_SetString(PyExc_ValueError,
98                         "new_x must be a 1-D array of floats");
99         goto fail;
100     }
101     arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
102                                 NPY_ARRAY_INOUT_ARRAY);
103     if (!arr_new_y) {
104         PyErr_SetString(PyExc_ValueError,
105                         "new_y must be a 1-D array of floats");
106         goto fail;
107     }
108 
109     loginterp((double*)PyArray_DATA((PyArrayObject*)arr_x),
110               (double*)PyArray_DATA((PyArrayObject*)arr_y),
111               PyArray_DIM((PyArrayObject*)arr_x,0),
112               (double*)PyArray_DATA((PyArrayObject*)arr_new_x),
113               (double*)PyArray_DATA((PyArrayObject*)arr_new_y),
114               PyArray_DIM((PyArrayObject*)arr_new_x,0));
115 
116     Py_DECREF(arr_x);
117     Py_DECREF(arr_y);
118     Py_DECREF(arr_new_x);
119     Py_DECREF(arr_new_y);
120 
121     Py_RETURN_NONE;
122 
123 fail:
124     Py_XDECREF(arr_x);
125     Py_XDECREF(arr_y);
126     Py_XDECREF(arr_new_x);
127     Py_XDECREF(arr_new_y);
128     return NULL;
129 }
130 
window_average_method(PyObject * self,PyObject * args,PyObject * kywds)131 static PyObject* window_average_method(PyObject*self, PyObject* args,
132                                        PyObject* kywds)
133 {
134     const char *kwlist[] = {"x","y","new_x","new_y", NULL};
135     PyObject *py_x, *py_y, *py_new_x, *py_new_y;
136     py_x = py_y = py_new_x = py_new_y = NULL;
137     PyObject *arr_x, *arr_y, *arr_new_x, *arr_new_y;
138     arr_x = arr_y = arr_new_x = arr_new_y = NULL;
139     double width;
140 
141     if (!PyArg_ParseTupleAndKeywords(args, kywds, "OOOOd:loginterp_dddd",
142                                      const_cast<char **>(kwlist), &py_x, &py_y,
143                                      &py_new_x, &py_new_y, &width))
144        return NULL;
145     arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
146     if (!arr_x) {
147         PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
148         goto fail;
149     }
150     arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
151     if (!arr_y) {
152         PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
153         goto fail;
154     }
155     arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
156     if (!arr_new_x) {
157         PyErr_SetString(PyExc_ValueError,
158                         "new_x must be a 1-D array of floats");
159         goto fail;
160     }
161     arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
162                                 NPY_ARRAY_INOUT_ARRAY);
163     if (!arr_new_y) {
164         PyErr_SetString(PyExc_ValueError,
165                         "new_y must be a 1-D array of floats");
166         goto fail;
167     }
168 
169     window_average((double*)PyArray_DATA((PyArrayObject*)arr_x),
170                    (double*)PyArray_DATA((PyArrayObject*)arr_y),
171                    PyArray_DIM((PyArrayObject*)arr_x,0),
172                    (double*)PyArray_DATA((PyArrayObject*)arr_new_x),
173                    (double*)PyArray_DATA((PyArrayObject*)arr_new_y),
174                    PyArray_DIM((PyArrayObject*)arr_new_x,0), width);
175 
176     Py_DECREF(arr_x);
177     Py_DECREF(arr_y);
178     Py_DECREF(arr_new_x);
179     Py_DECREF(arr_new_y);
180 
181     Py_RETURN_NONE;
182 
183 fail:
184     Py_XDECREF(arr_x);
185     Py_XDECREF(arr_y);
186     Py_XDECREF(arr_new_x);
187     Py_XDECREF(arr_new_y);
188     return NULL;
189 }
190 
block_average_above_method(PyObject * self,PyObject * args,PyObject * kywds)191 static PyObject* block_average_above_method(PyObject*self, PyObject* args,
192                                             PyObject* kywds)
193 {
194     const char *kwlist[] = {"x","y","new_x","new_y", NULL};
195     PyObject *py_x, *py_y, *py_new_x, *py_new_y;
196     py_x = py_y = py_new_x = py_new_y = NULL;
197     PyObject *arr_x, *arr_y, *arr_new_x, *arr_new_y;
198     arr_x = arr_y = arr_new_x = arr_new_y = NULL;
199 
200     if (!PyArg_ParseTupleAndKeywords(args, kywds, "OOOO:loginterp_dddd",
201                                      const_cast<char **>(kwlist), &py_x, &py_y,
202                                      &py_new_x, &py_new_y))
203        return NULL;
204     arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
205     if (!arr_x) {
206         PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
207         goto fail;
208     }
209     arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
210     if (!arr_y) {
211         PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
212         goto fail;
213     }
214     arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
215     if (!arr_new_x) {
216         PyErr_SetString(PyExc_ValueError,
217                         "new_x must be a 1-D array of floats");
218         goto fail;
219     }
220     arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
221                                 NPY_ARRAY_INOUT_ARRAY);
222     if (!arr_new_y) {
223         PyErr_SetString(PyExc_ValueError,
224                         "new_y must be a 1-D array of floats");
225         goto fail;
226     }
227 
228     block_average_above((double*)PyArray_DATA((PyArrayObject*)arr_x),
229                         (double*)PyArray_DATA((PyArrayObject*)arr_y),
230                         PyArray_DIM((PyArrayObject*)arr_x,0),
231                         (double*)PyArray_DATA((PyArrayObject*)arr_new_x),
232                         (double*)PyArray_DATA((PyArrayObject*)arr_new_y),
233                         PyArray_DIM((PyArrayObject*)arr_new_x,0));
234 
235     Py_DECREF(arr_x);
236     Py_DECREF(arr_y);
237     Py_DECREF(arr_new_x);
238     Py_DECREF(arr_new_y);
239 
240     Py_RETURN_NONE;
241 
242 fail:
243     Py_XDECREF(arr_x);
244     Py_XDECREF(arr_y);
245     Py_XDECREF(arr_new_x);
246     Py_XDECREF(arr_new_y);
247     return NULL;
248 }
249 
250 static PyMethodDef interpolate_methods[] = {
251     {"linear_dddd", (PyCFunction)linear_method,
252      METH_VARARGS|METH_KEYWORDS, ""},
253     {"loginterp_dddd", (PyCFunction)loginterp_method,
254      METH_VARARGS|METH_KEYWORDS, ""},
255     {"window_average_ddddd", (PyCFunction)window_average_method,
256      METH_VARARGS|METH_KEYWORDS, ""},
257     {"block_average_above_dddd", (PyCFunction)block_average_above_method,
258      METH_VARARGS|METH_KEYWORDS, ""},
259     {NULL, NULL, 0, NULL}
260 };
261 
262 
Py2to3_MOD_INIT(_interpolate)263 Py2to3_MOD_INIT(_interpolate)
264 {
265     PyObject* m;
266     Py2to3_MOD_DEF(
267         m,
268         "_interpolate",
269         "A few interpolation routines.\n",
270         interpolate_methods
271     );
272     if (m == NULL)
273         return Py2to3_MOD_ERROR_VAL;
274 
275     import_array();
276 
277     return Py2to3_MOD_SUCCESS_VAL(m);
278 }
279 
280 } // extern "C"
281