itom  4.1.0
pythonDataObject.h
1 /* ********************************************************************
2  itom software
3  URL: http://www.uni-stuttgart.de/ito
4  Copyright (C) 2020, 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  #include "pythonWrapper.h"
41  #include "numpy/arrayobject.h"
42  #define _DEBUG
43  #else
44  #include "pythonWrapper.h"
45  #include "numpy/arrayobject.h"
46  #endif
47 #endif
48 
49 #include "../../DataObject/dataobj.h"
50 //#include <qobject.h>
51 
52 namespace ito
53 {
55 {
56  public:
57  //-------------------------------------------------------------------------------------------------
58  // typedefs
59  //-------------------------------------------------------------------------------------------------
60  typedef struct
61  {
62  PyObject_HEAD
63  DataObject* dataObject;
64  PyObject* base;
65  }
67 
68  typedef struct
69  {
70  char *name;
71  int typeno;
72  }
74 
75  #define PyDataObject_Check(op) PyObject_TypeCheck(op, &PythonDataObject::PyDataObjectType)
76 
77  static inline void PyDataObject_SetBase( PyDataObject *op, PyObject *base )
78  {
79  PyObject* x = op->base;
80  Py_XINCREF(base);
81  op->base = base;
82  Py_XDECREF(x);
83  }
84 
85  //-------------------------------------------------------------------------------------------------
86  // constructor, deconstructor, alloc, dellaoc
87  //-------------------------------------------------------------------------------------------------
88 
89  static void PyDataObject_dealloc(PyDataObject *self);
90  static PyObject *PyDataObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
91  static int PyDataObject_init(PyDataObject *self, PyObject *args, PyObject *kwds);
92 
93  //-------------------------------------------------------------------------------------------------
94  // general members
95  //-------------------------------------------------------------------------------------------------
96  static PyObject *PyDataObject_name(PyDataObject *self);
97 
98  static PyObject* PyDataObject_repr(PyDataObject *self);
99 
100  static PyObject* PyDataObject_data(PyDataObject *self);
101  static PyObject* PyDataObject_conj(PyDataObject *self);
102  static PyObject* PyDataObject_conjugate(PyDataObject *self);
103  static PyObject* PyDataObject_adj(PyDataObject *self);
104  static PyObject* PyDataObject_adjugate(PyDataObject *self);
105  static PyObject* PyDataObject_trans(PyDataObject *self);
106  static PyObject* PyDataObject_copy(PyDataObject *self, PyObject* args, PyObject *kwds);
107  static PyObject* PyDataObject_astype(PyDataObject *self, PyObject* args, PyObject* kwds);
108  static PyObject* PyDataObject_normalize(PyDataObject *self, PyObject* args, PyObject* kwds);
109  static PyObject* PyDataObject_size(PyDataObject *self, PyObject* args);
110  static PyObject* PyDataObject_makeContinuous(PyDataObject *self);
111  static PyObject* PyDataObject_locateROI(PyDataObject *self);
112  static PyObject* PyDataObject_adjustROI(PyDataObject *self, PyObject* args, PyObject *kwds);
113  static PyObject* PyDataObject_squeeze(PyDataObject *self, PyObject* args);
114 
115  static PyObject* PyDataObject_mul(PyDataObject *self, PyObject *args);
116  static PyObject* PyDataObject_div(PyDataObject *self, PyObject *args);
117 
118  static PyObject* PyDataObject_reshape(PyDataObject *self, PyObject *args, PyObject *kwds);
119 
120  static PyObject* PyDataObject_createMask(PyDataObject *self, PyObject *args, PyObject* kwds);
121 
122  // Get / Set metadata / objecttags
123  static PyObject* PyDataObj_SetAxisOffset(PyDataObject *self, PyObject *args);
124  static PyObject* PyDataObj_SetAxisScale(PyDataObject *self, PyObject *args);
125  static PyObject* PyDataObj_SetAxisDescription(PyDataObject *self, PyObject *args);
126  static PyObject* PyDataObj_SetAxisUnit(PyDataObject *self, PyObject *args);
127  static PyObject* PyDataObj_PhysToPix(PyDataObject *self, PyObject *args, PyObject *kwds);
128  static PyObject* PyDataObj_PixToPhys(PyDataObject *self, PyObject *args, PyObject *kwds);
129  static PyObject* PyDataObj_CopyMetaInfo(PyDataObject *self, PyObject *args, PyObject *kwds);
130 
131  static PyObject* PyDataObj_SetTag(PyDataObject *self, PyObject *args);
132  static PyObject* PyDataObj_DeleteTag(PyDataObject *self, PyObject *args);
133  static PyObject* PyDataObj_TagExists(PyDataObject *self, PyObject *args);
134  static PyObject* PyDataObj_GetTagListSize(PyDataObject *self);
135  static PyObject* PyDataObj_AddToProtocol(PyDataObject *self, PyObject *args);
136 
137  // end tags
138 
139  static PyObject* PyDataObject_RichCompare(PyDataObject *self, PyObject *other, int cmp_op);
140 
141  static PyGetSetDef PyDataObject_getseters[];
142  static PyObject* PyDataObj_GetDims(PyDataObject *self, void *closure);
143  static PyObject* PyDataObj_GetType(PyDataObject *self, void *closure);
144  static PyObject* PyDataObj_GetShape(PyDataObject *self, void *closure);
145  static PyObject* PyDataObj_GetContinuous(PyDataObject *self, void *closure);
146 
147  static PyObject* PyDataObject_getTagDict(PyDataObject *self, void *closure);
148  static int PyDataObject_setTagDict(PyDataObject *self, PyObject *value, void *closure);
149 
150  static PyObject* PyDataObject_getTags(PyDataObject *self, void *closure);
151  static int PyDataObject_setTags(PyDataObject *self, PyObject *value, void *closure);
152 
153  static PyObject* PyDataObject_getAxisScales(PyDataObject *self, void *closure);
154  static int PyDataObject_setAxisScales(PyDataObject *self, PyObject *value, void *closure);
155 
156  static PyObject* PyDataObject_getAxisOffsets(PyDataObject *self, void *closure);
157  static int PyDataObject_setAxisOffsets(PyDataObject *self, PyObject *value, void *closure);
158 
159  static PyObject* PyDataObject_getAxisDescriptions(PyDataObject *self, void *closure);
160  static int PyDataObject_setAxisDescriptions(PyDataObject *self, PyObject *value, void *closure);
161 
162  static PyObject* PyDataObject_getAxisUnits(PyDataObject *self, void *closure);
163  static int PyDataObject_setAxisUnits(PyDataObject *self, PyObject *value, void *closure);
164 
165  static PyObject* PyDataObject_getValueUnit(PyDataObject *self, void *closure);
166  static int PyDataObject_setValueUnit(PyDataObject *self, PyObject *value, void *closure);
167 
168  static PyObject* PyDataObject_getValueDescription(PyDataObject *self, void *closure);
169  static int PyDataObject_setValueDescription(PyDataObject *self, PyObject *value, void *closure);
170 
171  static PyObject* PyDataObject_getValueScale(PyDataObject *self, void *closure);
172  static PyObject* PyDataObject_getValueOffset(PyDataObject *self, void *closure);
173 
174  static PyObject* PyDataObject_getReal(PyDataObject *self, void *closure);
175  static int PyDataObject_setReal(PyDataObject *self, PyObject *value, void *closure);
176 
177  static PyObject* PyDataObject_getImag(PyDataObject *self, void *closure);
178  static int PyDataObject_setImag(PyDataObject *self, PyObject *value, void *closure);
179 
180  static PyObject* PyDataObject_abs(PyDataObject *self, void *closure);
181  static PyObject* PyDataObject_arg(PyDataObject *self, void *closure);
182 
183  static int PyDataObject_setXYRotationalMatrix(PyDataObject *self, PyObject *value, void *closure);
184  static PyObject* PyDataObject_getXYRotationalMatrix(PyDataObject *self, void *closure);
185 
186  static PyObject* PyDataObject_getValue(PyDataObject *self, void *closure);
187  static int PyDataObject_setValue(PyDataObject *self, PyObject *value, void *closure);
188 
189  static PyObject* PyDataObj_Array_StructGet(PyDataObject *self);
190  static PyObject* PyDataObj_Array_Interface(PyDataObject *self);
191  static PyObject* PyDataObj_Array_(PyDataObject *self, PyObject *args);
192 
193  static PyObject* PyDataObject_real(PyDataObject *self);
194  static PyObject* PyDataObject_imag(PyDataObject *self);
195 
196  static PyObject* PyDataObj_ToGray(PyDataObject *self, PyObject *args, PyObject *kwds);
197  static PyObject* PyDataObj_ToNumpyColor(PyDataObject *self, PyObject *args, PyObject *kwds);
198  static PyObject* PyDataObj_SplitColor(PyDataObject *self, PyObject *args, PyObject *kwds);
199 
200  static PyObject* PyDataObj_ToList(PyDataObject *self);
201  static PyObject* PyDataObj_At(ito::DataObject *dataObj, unsigned int *idx);
202  static PyObject* PyDataObj_At(ito::DataObject *dataObj, int continuousIdx);
203  static PyObject* PyDataObj_ToListRecursive(ito::DataObject *dataObj, unsigned int *currentIdx, int iterationIndex);
204 
205 
206  static void PyDataObj_Capsule_Destructor(PyObject* capsule); //called if capsule (dataObject exported by __array__struct_) is destroyed
207 
208  static PyObject* PyDataObj_Reduce(PyDataObject *self, PyObject *args);
209  static PyObject* PyDataObj_SetState(PyDataObject *self, PyObject *args);
210  static PyObject* PyDataObj_lineCut(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_nbMatrixMultiply(PyObject* o1, PyObject* o2);
224  static PyObject* PyDataObj_nbDivide(PyObject* o1, PyObject* o2);
225  static PyObject* PyDataObj_nbRemainder(PyObject* o1, PyObject* o2);
226  static PyObject* PyDataObj_nbDivmod(PyObject* o1, PyObject* o2);
227  static PyObject* PyDataObj_nbPower(PyObject* o1, PyObject* o2, PyObject* o3);
228  static PyObject* PyDataObj_nbNegative(PyObject* o1);
229  static PyObject* PyDataObj_nbPositive(PyObject* o1);
230  static PyObject* PyDataObj_nbAbsolute(PyObject* o1);
231  static PyObject* PyDataObj_nbInvert(PyObject* o1);
232  static PyObject* PyDataObj_nbLshift(PyObject* o1, PyObject* o2);
233  static PyObject* PyDataObj_nbRshift(PyObject* o1, PyObject* o2);
234  static PyObject* PyDataObj_nbAnd(PyObject* o1, PyObject* o2);
235  static PyObject* PyDataObj_nbXor(PyObject* o1, PyObject* o2);
236  static PyObject* PyDataObj_nbOr(PyObject* o1, PyObject* o2);
237  static int PyDataObj_nbBool(PyDataObject *self);
238  static PyObject* PyDataObj_nbInplaceAdd(PyObject* o1, PyObject* o2);
239  static PyObject* PyDataObj_nbInplaceSubtract(PyObject* o1, PyObject* o2);
240  static PyObject* PyDataObj_nbInplaceMultiply(PyObject* o1, PyObject* o2);
241  static PyObject* PyDataObj_nbInplaceRemainder(PyObject* o1, PyObject* o2);
242  static PyObject* PyDataObj_nbInplacePower(PyObject* o1, PyObject* o2, PyObject* o3);
243  static PyObject* PyDataObj_nbInplaceLshift(PyObject* o1, PyObject* o2);
244  static PyObject* PyDataObj_nbInplaceRshift(PyObject* o1, PyObject* o2);
245  static PyObject* PyDataObj_nbInplaceAnd(PyObject* o1, PyObject* o2);
246  static PyObject* PyDataObj_nbInplaceXor(PyObject* o1, PyObject* o2);
247  static PyObject* PyDataObj_nbInplaceOr(PyObject* o1, PyObject* o2);
248  static PyObject* PyDataObj_nbInplaceTrueDivide(PyObject* o1, PyObject* o2);
249  static PyObject* PyDataObj_nbInplaceMatrixMultiply(PyObject* o1, PyObject* o2);
250 
251  //-------------------------------------------------------------------------------------------------
252  // iterator protocol
253  //-------------------------------------------------------------------------------------------------
254  static PyObject* PyDataObj_getiter(PyDataObject* self); //getiterfunc tp_iter;
255 
256  //-------------------------------------------------------------------------------------------------
257  // mapping protocol
258  //-------------------------------------------------------------------------------------------------
259  static int PyDataObj_mappingLength(PyDataObject* self);
260  static PyObject* PyDataObj_mappingGetElem(PyDataObject* self, PyObject* key);
261  static int PyDataObj_mappingSetElem(PyDataObject* self, PyObject* key, PyObject* value);
262 
263  //-------------------------------------------------------------------------------------------------
264  // type structures
265  //-------------------------------------------------------------------------------------------------
266  static PyMemberDef PyDataObject_members[];
267  static PyMethodDef PyDataObject_methods[];
268  static PyTypeObject PyDataObjectType;
269  static PyModuleDef PyDataObjectModule;
270 
271  static PyNumberMethods PyDataObject_numberProtocol;
272  static PyMappingMethods PyDataObject_mappingProtocol;
273 
274  //-------------------------------------------------------------------------------------------------
275  // helper methods
276  //-------------------------------------------------------------------------------------------------
277  static RetVal PyDataObj_ParseCreateArgs(PyObject *args, PyObject *kwds, int &typeno, std::vector<unsigned int> &dims, unsigned char &continuous);
278 
279  static PyDataObjectTypes PyDataObject_types[];
280  static int typeNameToNumber(const char *name);
281  static char* typeNumberToName(int typeno);
282 
283  static PyDataObject* createEmptyPyDataObject();
284  static PyObject* createPyDataObjectFromArray(PyObject *npArray); //returns NULL with set Python exception if npArray could not be converted to data object
285 
286  static bool checkPyDataObject(int number, PyObject* o1 = NULL, PyObject* o2 = NULL, PyObject* o3 = NULL);
287 
288  static RetVal parseTypeNumber(int typeno, char &typekind, int &itemsize);
289  static int parseTypeNumberInverse(char typekind, int itemsize);
290  static int getTypenumOfCompatibleType(char typekind, int itemsize);
291  static int getNpTypeFromDataObjectType(int type);
292 
293  static ito::RetVal copyNpArrayValuesToDataObject(PyArrayObject *npNdArray, ito::DataObject *dataObject, ito::tDataType type);
294  static int PyDataObj_CreateFromShapeTypeData(PyDataObject *self, PyObject *args, PyObject *kwds); //helper method for PyDataObject_init
295  static int PyDataObj_CreateFromNpNdArrayAndType(PyDataObject *self, PyObject *args, PyObject *kwds); //helper method for PyDataObject_init
296 
297  //-------------------------------------------------------------------------------------------------
298  // static type methods
299  //-------------------------------------------------------------------------------------------------
300  //static PyObject* PyDataObj_StaticArange(PyDataObject *self, PyObject *args);
301  static PyObject* PyDataObj_StaticZeros(PyObject *self, PyObject *args, PyObject *kwds);
302  static PyObject* PyDataObj_StaticOnes(PyObject *self, PyObject *args, PyObject *kwds);
303  static PyObject* PyDataObj_StaticNans(PyObject *self, PyObject *args, PyObject *kwds);
304  static PyObject* PyDataObj_StaticRand(PyObject *self, PyObject *args, PyObject *kwds);
305  static PyObject* PyDataObj_StaticRandN(PyObject *self, PyObject *args, PyObject *kwds);
306  static PyObject* PyDataObj_StaticEye(PyObject *self, PyObject *args, PyObject *kwds);
307  static PyObject* PyDataObj_StaticFromNumpyColor(PyObject *self, PyObject *args, PyObject *kwds);
308  static PyObject* PyDataObj_dstack(PyObject *self, PyObject *args);
309 
310 
311 
312  //#################################################################################################
313  // ITERATOR METHODS
314  //#################################################################################################
315 
316  typedef struct
317  {
318  PyObject_HEAD
321  Py_ssize_t len;
322  PyObject* base;
323  }
325 
326  //-------------------------------------------------------------------------------------------------
327  // constructor, deconstructor, alloc, dellaoc
328  //-------------------------------------------------------------------------------------------------
329 
330  static void PyDataObjectIter_dealloc(PyDataObjectIter *self);
331  static PyObject *PyDataObjectIter_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
332  static int PyDataObjectIter_init(PyDataObjectIter *self, PyObject *args, PyObject *kwds);
333 
334  static PyObject* PyDataObjectIter_iternext(PyDataObjectIter* self);
335  static PyObject* PyDataObjectIter_len(PyDataObjectIter* self);
336 
337  //-------------------------------------------------------------------------------------------------
338  // type structures
339  //-------------------------------------------------------------------------------------------------
340  static PyMethodDef PyDataObjectIter_methods[];
341  static PyTypeObject PyDataObjectIterType;
342 
343 };
344 
345 } //end namespace ito
346 
347 #endif
Definition: pythonDataObject.h:60
dataObject contains a n-dimensional matrix
Definition: dataobj.h:511
Class for managing status values (like errors or warning)
Definition: retVal.h:54
Definition: apiFunctionsGraph.cpp:39
Definition: pythonDataObject.h:68
Definition: pythonDataObject.h:54
constant iterator through data object
Definition: dataobj.h:376
Definition: pythonDataObject.h:316
tDataType
Definition: typeDefs.h:87