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