3
#include <fff_vector.h>
4
#include <fff_gen_stats.h>
7
#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API
11
/* Code pour la creation du module */
12
static char quantile_doc[] =
13
" q = quantile(data, ratio=.5, interp=False, axis=0)\n\
15
static char mahalanobis_doc[] =
16
" d2 = mahalanobis(data, vardata)\n\
17
data and vardata assumed C contiguous. More comments to follow";
18
static char module_doc[] =
19
" Basic statistical routines.\n\
20
Author: Alexis Roche (CEA, Orsay, France), 2004-2007.";
28
#define DEFAULT_RATIO 0.5
29
#define DEFAULT_INTERP 0
31
static PyObject* quantile(PyObject* self, PyObject* args, PyObject* kw)
33
double ratio = DEFAULT_RATIO;
34
int interp = DEFAULT_INTERP;
35
int axis = DEFAULT_AXIS;
38
PyArrayMultiIterObject* multi;
39
npy_intp ndim, dim_axis;
41
static char *kwlist[] = {"data", "ratio", "interp", "axis", NULL};
44
if ( !PyArg_ParseTupleAndKeywords( args, kw, "O!|dii:quantile", kwlist,
45
&PyArray_Type, &X, &ratio, &interp, &axis ) )
48
/* Get input dimensions */
49
ndim = PyArray_NDIM( X );
50
dim_axis = PyArray_DIM( X, axis );
51
dimAux = (npy_intp*) malloc( ndim*sizeof(npy_intp) );
52
memcpy( (void*)dimAux, (void*)PyArray_DIMS(X), ndim*sizeof(npy_intp) );
54
/* Allocate output array */
56
Y = (PyArrayObject*) PyArray_SimpleNew(ndim, dimAux, NPY_DOUBLE);
58
/* Create multi iterator */
59
multi = (PyArrayMultiIterObject*)PyArray_MultiIterAllButAxis(2, axis, X, Y);
61
/* Create fff vectors (copy or not) */
62
x = fff_vector_fromPyArrayIter(multi->iters[0], axis);
63
y = fff_vector_fromPyArrayIter(multi->iters[1], axis);
66
fprintf(stderr, "multi->index=%d multi->size=%d\n", multi->index, multi->size);
69
while(multi->index < multi->size) {
72
fprintf(stderr, "Everything fine.\n");
74
fff_vector_get_fromPyArrayIter(x, multi->iters[0], axis);
75
fff_vector_get_fromPyArrayIter(y, multi->iters[1], axis);
78
fprintf(stderr, "Everything okay.\n");
80
y->data[0] = fff_vector_quantile(x, ratio, interp);
83
fprintf(stderr, "So fine...\n");
85
fff_vector_const_toPyArrayIter(y, multi->iters[1], axis);
88
fprintf(stderr, "Hey hey... still alive!\n");
90
PyArray_MultiIter_NEXT(multi);
106
static PyObject* mahalanobis(PyObject* self, PyObject* args, PyObject* kw)
108
PyArrayObject *X, *VX, *D2;
109
fff_vector *x, *vx, *d2;
110
PyArrayMultiIterObject* multi;
111
int axis = DEFAULT_AXIS;
114
fff_vector *x_tmp, *vx_tmp;
117
static char *kwlist[] = {"data", "vardata", NULL};
120
if ( !PyArg_ParseTupleAndKeywords( args, kw, "O!O!:mahalanobis", kwlist,
122
&PyArray_Type, &VX ) )
127
n = PyArray_DIM(X, 0);
128
ndim = PyArray_NDIM(X);
130
/* Allocate output array */
131
dimAux = (npy_intp*) malloc( ndim*sizeof(npy_intp) );
132
memcpy( (void*)dimAux, (void*)PyArray_DIMS(X), ndim*sizeof(npy_intp) );
134
D2 = (PyArrayObject*) PyArray_SimpleNew( ndim, dimAux, NPY_DOUBLE );
136
/* Allocate local structures */
137
x_tmp = fff_vector_new(n);
138
vx_tmp = fff_vector_new(n*n);
139
Sf = fff_matrix_new(n, n);
141
/* Create multi iterator */
142
multi = (PyArrayMultiIterObject*)PyArray_MultiIterAllButAxis(3, axis, X, VX, D2);
144
/* Create fff vectors (copy or not) */
145
x = fff_vector_fromPyArrayIter(multi->iters[0], axis);
146
vx = fff_vector_fromPyArrayIter(multi->iters[1], axis);
147
d2 = fff_vector_fromPyArrayIter(multi->iters[2], axis);
150
while(multi->index < multi->size) {
152
fff_vector_get_fromPyArrayIter(x, multi->iters[0], axis);
153
fff_vector_get_fromPyArrayIter(vx, multi->iters[1], axis);
154
fff_vector_get_fromPyArrayIter(d2, multi->iters[2], axis);
156
fff_vector_memcpy(x_tmp, x);
157
fff_vector_memcpy(vx_tmp, vx);
158
Sview = fff_matrix_view(vx_tmp->data, n, n, n); /* OK because vx_tmp is contiguous */
159
d2->data[0] = fff_mahalanobis(x_tmp, &Sview, Sf);
161
fff_vector_const_toPyArrayIter(d2, multi->iters[2], axis);
162
PyArray_MultiIter_NEXT(multi);
168
fff_vector_delete(x_tmp);
169
fff_vector_delete(vx_tmp);
170
fff_matrix_delete(Sf);
174
return (PyObject*)D2;
181
static PyMethodDef module_methods[] = {
182
{"quantile", (PyCFunction)quantile, METH_KEYWORDS, quantile_doc},
183
{"mahalanobis", (PyCFunction)mahalanobis, METH_KEYWORDS, mahalanobis_doc},
184
{NULL, NULL, 0, NULL}
188
void initroutines(void)
190
Py_InitModule3("routines", module_methods, module_doc);
191
fffpy_import_array();
192
import_array(); /* required NumPy initialization */