itom  3.0.0
pythonDataObject.h
1 /* ********************************************************************
2  itom software
3  URL: http://www.uni-stuttgart.de/ito
4  Copyright (C) 2016, Institut fuer Technische Optik (ITO),
5  Universitaet Stuttgart, Germany
6 
7  This file is part of itom.
8 
9  itom is free software; you can redistribute it and/or modify it
10  under the terms of the GNU Library General Public Licence as published by
11  the Free Software Foundation; either version 2 of the Licence, or (at
12  your option) any later version.
13 
14  itom is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
17  General Public Licence for more details.
18 
19  You should have received a copy of the GNU Library General Public License
20  along with itom. If not, see <http://www.gnu.org/licenses/>.
21 *********************************************************************** */
22 
23 #ifndef PYTHONDATAOBJECT
24 #define PYTHONDATAOBJECT
25 
26 /* includes */
27 #include <string>
28 
29 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
30 
31 #ifndef Q_MOC_RUN
32  #define PY_ARRAY_UNIQUE_SYMBOL itom_ARRAY_API //see numpy help ::array api :: Miscellaneous :: Importing the api (this line must before including global.h)
33  #define NO_IMPORT_ARRAY
34 
35  //#define NPY_NO_DEPRECATED_API 0x00000007 //see comment in pythonNpDataObject.cpp
36  //python
37  // see http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=7f3f750596a105d48ea84ebfe1b1c4ca03e0bab3
38  #if (defined _DEBUG) && (defined WIN32)
39  #undef _DEBUG
40  #if (defined linux) | (defined CMAKE)
41  #include "Python.h"
42  #include "numpy/arrayobject.h"
43  #elif (defined __APPLE__) | (defined CMAKE)
44  #include "Python.h"
45  #include "numpy/arrayobject.h"
46  #else
47  #include "Python.h"
48  #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
49  #endif
50  #define _DEBUG
51  #else
52  #ifdef linux
53  #include "Python.h"
54  #include "numpy/arrayobject.h"
55  #elif (defined __APPLE__)
56  #include "Python.h"
57  #include "numpy/arrayobject.h"
58  #else
59  #include "Python.h"
60  #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
61  #endif
62  #endif
63 #endif
64 
65 #include "../../DataObject/dataobj.h"
66 //#include <qobject.h>
67 
68 namespace ito
69 {
71 {
72  public:
73  //-------------------------------------------------------------------------------------------------
74  // typedefs
75  //-------------------------------------------------------------------------------------------------
76  typedef struct
77  {
78  PyObject_HEAD
79  DataObject* dataObject;
80  PyObject* base;
81  }
83 
84  typedef struct
85  {
86  char *name;
87  int typeno;
88  }
90 
91  #define PyDataObject_Check(op) PyObject_TypeCheck(op, &PythonDataObject::PyDataObjectType)
92 
93  static inline void PyDataObject_SetBase( PyDataObject *op, PyObject *base )
94  {
95  PyObject* x = op->base;
96  Py_XINCREF(base);
97  op->base = base;
98  Py_XDECREF(x);
99  }
100 
101  //-------------------------------------------------------------------------------------------------
102  // constructor, deconstructor, alloc, dellaoc
103  //-------------------------------------------------------------------------------------------------
104 
105  static void PyDataObject_dealloc(PyDataObject *self);
106  static PyObject *PyDataObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
107  static int PyDataObject_init(PyDataObject *self, PyObject *args, PyObject *kwds);
108 
109  //-------------------------------------------------------------------------------------------------
110  // general members
111  //-------------------------------------------------------------------------------------------------
112  static PyObject *PyDataObject_name(PyDataObject *self);
113 
114  static PyObject* PyDataObject_repr(PyDataObject *self);
115 
116  static PyObject* PyDataObject_data(PyDataObject *self);
117  static PyObject* PyDataObject_conj(PyDataObject *self);
118  static PyObject* PyDataObject_conjugate(PyDataObject *self);
119  static PyObject* PyDataObject_adj(PyDataObject *self);
120  static PyObject* PyDataObject_adjugate(PyDataObject *self);
121  static PyObject* PyDataObject_trans(PyDataObject *self);
122  static PyObject* PyDataObject_copy(PyDataObject *self, PyObject* args);
123  static PyObject* PyDataObject_astype(PyDataObject *self, PyObject* args, PyObject* kwds);
124  static PyObject* PyDataObject_normalize(PyDataObject *self, PyObject* args, PyObject* kwds);
125  static PyObject* PyDataObject_size(PyDataObject *self, PyObject* args);
126  static PyObject* PyDataObject_makeContinuous(PyDataObject *self);
127  static PyObject* PyDataObject_locateROI(PyDataObject *self);
128  static PyObject* PyDataObject_adjustROI(PyDataObject *self, PyObject* args);
129  static PyObject* PyDataObject_squeeze(PyDataObject *self, PyObject* args);
130 
131  static PyObject* PyDataObject_mul(PyDataObject *self, PyObject *args);
132  static PyObject* PyDataObject_div(PyDataObject *self, PyObject *args);
133 
134  static PyObject* PyDataObject_reshape(PyDataObject *self, PyObject *args);
135 
136  static PyObject* PyDataObject_createMask(PyDataObject *self, PyObject *args, PyObject* kwds);
137 
138  // Get / Set metadata / objecttags
139  static PyObject* PyDataObj_SetAxisOffset(PyDataObject *self, PyObject *args);
140  static PyObject* PyDataObj_SetAxisScale(PyDataObject *self, PyObject *args);
141  static PyObject* PyDataObj_SetAxisDescription(PyDataObject *self, PyObject *args);
142  static PyObject* PyDataObj_SetAxisUnit(PyDataObject *self, PyObject *args);
143  static PyObject* PyDataObj_PhysToPix(PyDataObject *self, PyObject *args, PyObject *kwds);
144  static PyObject* PyDataObj_PixToPhys(PyDataObject *self, PyObject *args, PyObject *kwds);
145  static PyObject* PyDataObj_CopyMetaInfo(PyDataObject *self, PyObject *args, PyObject *kwds);
146 
147  static PyObject* PyDataObj_SetTag(PyDataObject *self, PyObject *args);
148  static PyObject* PyDataObj_DeleteTag(PyDataObject *self, PyObject *args);
149  static PyObject* PyDataObj_TagExists(PyDataObject *self, PyObject *args);
150  static PyObject* PyDataObj_GetTagListSize(PyDataObject *self);
151  static PyObject* PyDataObj_AddToProtocol(PyDataObject *self, PyObject *args);
152 
153  // end tags
154 
155  static PyObject* PyDataObject_RichCompare(PyDataObject *self, PyObject *other, int cmp_op);
156 
157  static PyGetSetDef PyDataObject_getseters[];
158  static PyObject* PyDataObj_GetDims(PyDataObject *self, void *closure);
159  static PyObject* PyDataObj_GetType(PyDataObject *self, void *closure);
160  static PyObject* PyDataObj_GetShape(PyDataObject *self, void *closure);
161  static PyObject* PyDataObj_GetContinuous(PyDataObject *self, void *closure);
162 
163  static PyObject* PyDataObject_getTagDict(PyDataObject *self, void *clousure);
164 
165  static PyObject* PyDataObject_getTags(PyDataObject *self, void *closure);
166  static int PyDataObject_setTags(PyDataObject *self, PyObject *value, void *closure);
167  static PyObject* PyDataObject_getAxisScales(PyDataObject *self, void *closure);
168  static int PyDataObject_setAxisScales(PyDataObject *self, PyObject *value, void *closure);
169  static PyObject* PyDataObject_getAxisOffsets(PyDataObject *self, void *closure);
170  static int PyDataObject_setAxisOffsets(PyDataObject *self, PyObject *value, void *closure);
171  static PyObject* PyDataObject_getAxisDescriptions(PyDataObject *self, void *closure);
172  static int PyDataObject_setAxisDescriptions(PyDataObject *self, PyObject *value, void *closure);
173  static PyObject* PyDataObject_getAxisUnits(PyDataObject *self, void *closure);
174  static int PyDataObject_setAxisUnits(PyDataObject *self, PyObject *value, void *closure);
175  static PyObject* PyDataObject_getValueUnit(PyDataObject *self, void *closure);
176  static int PyDataObject_setValueUnit(PyDataObject *self, PyObject *value, void *closure);
177  static PyObject* PyDataObject_getValueDescription(PyDataObject *self, void *closure);
178  static int PyDataObject_setValueDescription(PyDataObject *self, PyObject *value, void *closure);
179  static PyObject* PyDataObject_getValueScale(PyDataObject *self, void *closure);
180  static PyObject* PyDataObject_getValueOffset(PyDataObject *self, void *closure);
181 
182  static int PyDataObject_setXYRotationalMatrix(PyDataObject *self, PyObject *value, void *closure);
183  static PyObject* PyDataObject_getXYRotationalMatrix(PyDataObject *self, void *closure);
184 
185  static PyObject* PyDataObject_getValue(PyDataObject *self, void *closure);
186  static int PyDataObject_setValue(PyDataObject *self, PyObject *value, void *closure);
187 
188  static PyObject* PyDataObj_Array_StructGet(PyDataObject *self);
189  static PyObject* PyDataObj_Array_Interface(PyDataObject *self);
190  static PyObject* PyDataObj_Array_(PyDataObject *self, PyObject *args);
191 
192  static PyObject* PyDataObject_abs(PyDataObject *self);
193  static PyObject* PyDataObject_arg(PyDataObject *self);
194  static PyObject* PyDataObject_real(PyDataObject *self);
195  static PyObject* PyDataObject_imag(PyDataObject *self);
196 
197  static PyObject* PyDataObj_ToGray(PyDataObject *self, PyObject *args, PyObject *kwds);
198  static PyObject* PyDataObj_ToNumpyColor(PyDataObject *self, PyObject *args, PyObject *kwds);
199  static PyObject* PyDataObj_SplitColor(PyDataObject *self, PyObject *args, PyObject *kwds);
200 
201  static PyObject* PyDataObj_ToList(PyDataObject *self);
202  static PyObject* PyDataObj_At(ito::DataObject *dataObj, unsigned int *idx);
203  static PyObject* PyDataObj_At(ito::DataObject *dataObj, int continuousIdx);
204  static PyObject* PyDataObj_ToListRecursive(ito::DataObject *dataObj, unsigned int *currentIdx, int iterationIndex);
205 
206 
207  static void PyDataObj_Capsule_Destructor(PyObject* capsule); //called if capsule (dataObject exported by __array__struct_) is destroyed
208 
209  static PyObject* PyDataObj_Reduce(PyDataObject *self, PyObject *args);
210  static PyObject* PyDataObj_SetState(PyDataObject *self, PyObject *args);
211 
212  //-------------------------------------------------------------------------------------------------
213  // number protocol
214  //
215  // python note: Binary and ternary functions must check the type of all their operands, and implement
216  // the necessary conversions (at least one of the operands is an instance of the defined type).
217  // If the operation is not defined for the given operands, binary and ternary functions must return
218  // Py_NotImplemented, if another error occurred they must return NULL and set an exception.
219  //-------------------------------------------------------------------------------------------------
220  static PyObject* PyDataObj_nbAdd(PyObject* o1, PyObject* o2);
221  static PyObject* PyDataObj_nbSubtract(PyObject* o1, PyObject* o2);
222  static PyObject* PyDataObj_nbMultiply(PyObject* o1, PyObject* o2);
223  static PyObject* PyDataObj_nbDivide(PyObject* o1, PyObject* o2);
224  static PyObject* PyDataObj_nbRemainder(PyObject* o1, PyObject* o2);
225  static PyObject* PyDataObj_nbDivmod(PyObject* o1, PyObject* o2);
226  static PyObject* PyDataObj_nbPower(PyObject* o1, PyObject* o2, PyObject* o3);
227  static PyObject* PyDataObj_nbNegative(PyObject* o1);
228  static PyObject* PyDataObj_nbPositive(PyObject* o1);
229  static PyObject* PyDataObj_nbAbsolute(PyObject* o1);
230  static PyObject* PyDataObj_nbInvert(PyObject* o1);
231  static PyObject* PyDataObj_nbLshift(PyObject* o1, PyObject* o2);
232  static PyObject* PyDataObj_nbRshift(PyObject* o1, PyObject* o2);
233  static PyObject* PyDataObj_nbAnd(PyObject* o1, PyObject* o2);
234  static PyObject* PyDataObj_nbXor(PyObject* o1, PyObject* o2);
235  static PyObject* PyDataObj_nbOr(PyObject* o1, PyObject* o2);
236 
237  static PyObject* PyDataObj_nbInplaceAdd(PyObject* o1, PyObject* o2);
238  static PyObject* PyDataObj_nbInplaceSubtract(PyObject* o1, PyObject* o2);
239  static PyObject* PyDataObj_nbInplaceMultiply(PyObject* o1, PyObject* o2);
240  static PyObject* PyDataObj_nbInplaceRemainder(PyObject* o1, PyObject* o2);
241  static PyObject* PyDataObj_nbInplacePower(PyObject* o1, PyObject* o2, PyObject* o3);
242  static PyObject* PyDataObj_nbInplaceLshift(PyObject* o1, PyObject* o2);
243  static PyObject* PyDataObj_nbInplaceRshift(PyObject* o1, PyObject* o2);
244  static PyObject* PyDataObj_nbInplaceAnd(PyObject* o1, PyObject* o2);
245  static PyObject* PyDataObj_nbInplaceXor(PyObject* o1, PyObject* o2);
246  static PyObject* PyDataObj_nbInplaceOr(PyObject* o1, PyObject* o2);
247  static PyObject* PyDataObj_nbInplaceTrueDivide(PyObject* o1, PyObject* o2);
248 
249  //-------------------------------------------------------------------------------------------------
250  // iterator protocol
251  //-------------------------------------------------------------------------------------------------
252  static PyObject* PyDataObj_getiter(PyDataObject* self); //getiterfunc tp_iter;
253 
254  //-------------------------------------------------------------------------------------------------
255  // mapping protocol
256  //-------------------------------------------------------------------------------------------------
257  static int PyDataObj_mappingLength(PyDataObject* self);
258  static PyObject* PyDataObj_mappingGetElem(PyDataObject* self, PyObject* key);
259  static int PyDataObj_mappingSetElem(PyDataObject* self, PyObject* key, PyObject* value);
260 
261  //-------------------------------------------------------------------------------------------------
262  // type structures
263  //-------------------------------------------------------------------------------------------------
264  static PyMemberDef PyDataObject_members[];
265  static PyMethodDef PyDataObject_methods[];
266  static PyTypeObject PyDataObjectType;
267  static PyModuleDef PyDataObjectModule;
268 
269  static PyNumberMethods PyDataObject_numberProtocol;
270  static PyMappingMethods PyDataObject_mappingProtocol;
271 
272  //-------------------------------------------------------------------------------------------------
273  // helper methods
274  //-------------------------------------------------------------------------------------------------
275  static RetVal PyDataObj_ParseCreateArgs(PyObject *args, PyObject *kwds, int &typeno, std::vector<unsigned int> &dims, unsigned char &continuous);
276 
277  static PyDataObjectTypes PyDataObject_types[];
278  static int typeNameToNumber(const char *name);
279  static char* typeNumberToName(int typeno);
280 
281  static PyDataObject* createEmptyPyDataObject();
282  static PyObject* createPyDataObjectFromArray(PyObject *npArray); //returns NULL with set Python exception if npArray could not be converted to data object
283 
284  static bool checkPyDataObject(int number, PyObject* o1 = NULL, PyObject* o2 = NULL, PyObject* o3 = NULL);
285 
286  static RetVal parseTypeNumber(int typeno, char &typekind, int &itemsize);
287  static int parseTypeNumberInverse(char typekind, int itemsize);
288  static int getTypenumOfCompatibleType(char typekind, int itemsize);
289 
290  //-------------------------------------------------------------------------------------------------
291  // static type methods
292  //-------------------------------------------------------------------------------------------------
293  //static PyObject* PyDataObj_StaticArange(PyDataObject *self, PyObject *args);
294  static PyObject* PyDataObj_StaticZeros(PyObject *self, PyObject *args, PyObject *kwds);
295  static PyObject* PyDataObj_StaticOnes(PyObject *self, PyObject *args, PyObject *kwds);
296  static PyObject* PyDataObj_StaticRand(PyObject *self, PyObject *args, PyObject *kwds);
297  static PyObject* PyDataObj_StaticRandN(PyObject *self, PyObject *args, PyObject *kwds);
298  static PyObject* PyDataObj_StaticEye(PyObject *self, PyObject *args, PyObject *kwds);
299  static PyObject* PyDataObj_StaticFromNumpyColor(PyObject *self, PyObject *args, PyObject *kwds);
300  static PyObject* PyDataObj_dstack(PyObject *self, PyObject *args);
301 
302 
303  //#################################################################################################
304  // ITERATOR METHODS
305  //#################################################################################################
306 
307  typedef struct
308  {
309  PyObject_HEAD
312  Py_ssize_t len;
313  PyObject* base;
314  }
316 
317  //-------------------------------------------------------------------------------------------------
318  // constructor, deconstructor, alloc, dellaoc
319  //-------------------------------------------------------------------------------------------------
320 
321  static void PyDataObjectIter_dealloc(PyDataObjectIter *self);
322  static PyObject *PyDataObjectIter_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
323  static int PyDataObjectIter_init(PyDataObjectIter *self, PyObject *args, PyObject *kwds);
324 
325  static PyObject* PyDataObjectIter_iternext(PyDataObjectIter* self);
326  static PyObject* PyDataObjectIter_len(PyDataObjectIter* self);
327 
328  //-------------------------------------------------------------------------------------------------
329  // type structures
330  //-------------------------------------------------------------------------------------------------
331  static PyMethodDef PyDataObjectIter_methods[];
332  static PyTypeObject PyDataObjectIterType;
333 };
334 
335 } //end namespace ito
336 
337 #endif
Definition: pythonDataObject.h:76
dataObject contains a n-dimensional matrix
Definition: dataobj.h:496
Class for managing status values (like errors or warning)
Definition: retVal.h:54
Definition: apiFunctionsGraph.cpp:39
Definition: pythonDataObject.h:84
Definition: pythonDataObject.h:70
constant iterator through data object
Definition: dataobj.h:361
Definition: pythonDataObject.h:307