diff options
Diffstat (limited to 'python/pyarmnn/src/pyarmnn/swig/typemaps')
5 files changed, 431 insertions, 0 deletions
diff --git a/python/pyarmnn/src/pyarmnn/swig/typemaps/network_optimize.i b/python/pyarmnn/src/pyarmnn/swig/typemaps/network_optimize.i new file mode 100644 index 0000000000..05df82bdd1 --- /dev/null +++ b/python/pyarmnn/src/pyarmnn/swig/typemaps/network_optimize.i @@ -0,0 +1,41 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +%define %optimize_typemap_out + %typemap(out) (std::pair<armnn::IOptimizedNetwork*, std::vector<std::string>>) { + PyObject * network = SWIG_NewPointerObj(SWIG_as_voidptr($1.first), SWIGTYPE_p_armnn__IOptimizedNetwork, SWIG_POINTER_OWN); + $result = PyTuple_New(2); + + // Convert vector to fixed-size tuple + std::vector<std::string> strings = $1.second; + Py_ssize_t size = strings.size(); + + // New reference. Need to Py_DECREF + PyObject* errMsgTuple = PyTuple_New(size); + + if (!errMsgTuple) { + Py_XDECREF(errMsgTuple); + return PyErr_NoMemory(); + } + + for (Py_ssize_t i = 0; i < size; i++) { + // New reference. Need to Py_DECREF + PyObject *string = PyString_FromString(strings[i].c_str()); + + if (!string) { + Py_XDECREF(string); + return PyErr_NoMemory(); + } + PyTuple_SetItem(errMsgTuple, i, string); + } + + // Create result tuple + PyTuple_SetItem($result, 0, network); + PyTuple_SetItem($result, 1, errMsgTuple); + } +%enddef + +%define %clear_optimize_typemap_out + %typemap(out) (std::pair<armnn::IOptimizedNetwork*, std::vector<std::string>>) +%enddef diff --git a/python/pyarmnn/src/pyarmnn/swig/typemaps/permutation_vector.i b/python/pyarmnn/src/pyarmnn/swig/typemaps/permutation_vector.i new file mode 100644 index 0000000000..daa9663fb1 --- /dev/null +++ b/python/pyarmnn/src/pyarmnn/swig/typemaps/permutation_vector.i @@ -0,0 +1,52 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +%define %permutation_vector_typemap(TYPE1, TYPE2) + %typemap(in) (TYPE1, TYPE2) { + if (PyTuple_Check($input)) { + PyObject* seq = $input; + + $2 = PySequence_Fast_GET_SIZE(seq); + $1 = (unsigned int*)PyMem_RawMalloc($2*sizeof(unsigned int)); + + + if(!$1) { + PyErr_NoMemory(); + SWIG_fail; + } + int size = (int)$2; + for(int i=0; i < size; i++) { + PyObject *longItem; + // Borrowed reference. No need to Py_DECREF + PyObject *item = PySequence_Fast_GET_ITEM(seq, i); + if(!item) { + PyErr_SetString(PyExc_TypeError, "Failed to read data from tuple"); + SWIG_fail; + } + // New reference. Need to Py_DECREF + longItem = PyNumber_Long(item); + if(!longItem) { + Py_XDECREF(longItem); + PyErr_SetString(PyExc_TypeError, "All elements must be numbers"); + SWIG_fail; + } + $1[i] = (unsigned int)PyLong_AsUnsignedLong(longItem); + Py_XDECREF(longItem); + } + + } else { + PyErr_SetString(PyExc_TypeError, "Argument is not a tuple"); + SWIG_fail; + } + } + + %typemap(freearg) (TYPE1, TYPE2) { + PyMem_RawFree($1); + } +%enddef + +%define %clear_permutation_vector_typemap(TYPE1, TYPE2) + %typemap(in) (TYPE1, TYPE2); + %typemap(freearg) (TYPE1, TYPE2); +%enddef diff --git a/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_memory.i b/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_memory.i new file mode 100644 index 0000000000..de38a63b97 --- /dev/null +++ b/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_memory.i @@ -0,0 +1,52 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +%define %mutable_memory(TYPEMAP) + %typemap(in) (TYPEMAP) { + int res; void *buf = 0; + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); + buf = view.buf; + PyBuffer_Release(&view); + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP)", $symname, $argnum); + } + $1 = buf; + } + + %typemap(typecheck) (TYPEMAP) { + $1 = PyObject_CheckBuffer($input) || PyTuple_Check($input) ? 1 : 0; + } +%enddef + +%define %clear_mutable_memory(TYPEMAP) + %typemap(in) (TYPEMAP); + %typemap(typecheck) (TYPEMAP); +%enddef + +%define %const_memory(TYPEMAP) + %typemap(in) (TYPEMAP) { + int res; void *buf = 0; + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); + buf = view.buf; + PyBuffer_Release(&view); + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP)", $symname, $argnum); + } + $1 = buf; + } + + %typemap(typecheck) (TYPEMAP) { + $1 = PyObject_CheckBuffer($input) || PyTuple_Check($input) ? 1 : 0; + } +%enddef + +%define %clear_const_memory(TYPEMAP) + %typemap(in) (TYPEMAP); + %typemap(typecheck) (TYPEMAP); +%enddef + diff --git a/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_shape.i b/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_shape.i new file mode 100644 index 0000000000..3e7c98f4c6 --- /dev/null +++ b/python/pyarmnn/src/pyarmnn/swig/typemaps/tensor_shape.i @@ -0,0 +1,51 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +%define %tensor_shape_typemap(TYPE1, TYPE2) + %typemap(in) (TYPE1, TYPE2) { + if (PyTuple_Check($input)) { + PyObject* seq = $input; + + $1 = PySequence_Fast_GET_SIZE(seq); + $2 = (unsigned int*)PyMem_RawMalloc($1*sizeof(unsigned int)); + + if(!$2) { + PyErr_NoMemory(); + SWIG_fail; + } + int size = (int)$1; + for(int i=0; i < size; i++) { + PyObject *longItem; + // Borrowed reference. No need to Py_DECREF + PyObject *item = PySequence_Fast_GET_ITEM(seq, i); + if(!item) { + PyErr_SetString(PyExc_TypeError, "Failed to read data from tuple"); + SWIG_fail; + } + // New reference. Need to Py_DECREF + longItem = PyNumber_Long(item); + if(!longItem) { + Py_XDECREF(longItem); + PyErr_SetString(PyExc_TypeError, "All elements must be numbers"); + SWIG_fail; + } + $2[i] = (unsigned int)PyLong_AsUnsignedLong(longItem); + Py_XDECREF(longItem); + } + + } else { + PyErr_SetString(PyExc_TypeError, "Argument is not a tuple"); + SWIG_fail; + } + } + + %typemap(freearg) (TYPE1, TYPE2) { + PyMem_RawFree($2); + } +%enddef + +%define %clear_tensor_shape_typemap(TYPE1, TYPE2) + %typemap(in) (TYPE1, TYPE2); + %typemap(freearg) (TYPE1, TYPE2); +%enddef diff --git a/python/pyarmnn/src/pyarmnn/swig/typemaps/vectors.i b/python/pyarmnn/src/pyarmnn/swig/typemaps/vectors.i new file mode 100644 index 0000000000..1566bb0c3b --- /dev/null +++ b/python/pyarmnn/src/pyarmnn/swig/typemaps/vectors.i @@ -0,0 +1,235 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +%inline %{ +//-------------------------from_python_to_cpp----------------------------- + int from_python_to_cpp(PyObject *obj, long* val) { + return SWIG_AsVal_long(obj, val); + } + + int from_python_to_cpp(PyObject *obj, int* val) { + return SWIG_AsVal_int(obj, val); + } + + int from_python_to_cpp(PyObject *obj, unsigned int* val) { + return SWIG_AsVal_unsigned_SS_int(obj, val); + } + + int from_python_to_cpp(PyObject *obj, unsigned short* val) { + return SWIG_AsVal_unsigned_SS_short(obj, val); + } + + int from_python_to_cpp(PyObject *obj, float* val) { + return SWIG_AsVal_float(obj, val); + } + + int from_python_to_cpp(PyObject *obj, double* val) { + return SWIG_AsVal_double(obj, val); + } +#ifdef SWIG_LONG_LONG_AVAILABLE + int from_python_to_cpp(PyObject *obj, unsigned long long* val) { + return SWIG_AsVal_unsigned_SS_long_SS_long(obj, val); + } + + int from_python_to_cpp(PyObject *obj, long long* val) { + return SWIG_AsVal_long_SS_long(obj, val); + } +#endif + + int from_python_to_cpp(PyObject *obj, unsigned long* val) { + return SWIG_AsVal_unsigned_SS_long(obj, val); + } + + int from_python_to_cpp(PyObject *obj, short* val) { + return SWIG_AsVal_short(obj, val); + } +//-------------------------from_cpp_to_python----------------------------- + PyObject* from_cpp_to_python(long& val){ + return PyLong_FromLong(val); + } + + PyObject* from_cpp_to_python(unsigned long& val){ + return PyLong_FromUnsignedLong(val); + } +#ifdef SWIG_LONG_LONG_AVAILABLE + PyObject* from_cpp_to_python(long long& val){ + return PyLong_FromLongLong(val); + } + + PyObject* from_cpp_to_python(unsigned long long& val){ + return PyLong_FromUnsignedLongLong(val); + } +#endif + + PyObject* from_cpp_to_python(int& val){ + return PyLong_FromLong(static_cast<long>(val)); + } + + PyObject* from_cpp_to_python(unsigned int& val){ + return PyLong_FromUnsignedLong(static_cast<unsigned long>(val)); + } + + PyObject* from_cpp_to_python(unsigned short& val){ + return PyLong_FromUnsignedLong(static_cast<unsigned long>(val)); + } + + PyObject* from_cpp_to_python(float& val){ + return PyFloat_FromDouble(static_cast<double>(val)); + } + + PyObject* from_cpp_to_python(double& val){ + return PyFloat_FromDouble(val); + } + + template<class U, class V> + PyObject* from_cpp_to_python(std::pair<U, V>& pair){ + + PyObject* first = from_cpp_to_python(pair.first); + PyObject* second = from_cpp_to_python(pair.second); + + PyObject* localTuple = PyTuple_New(2); + + if (!localTuple) { + Py_XDECREF(localTuple); + return PyErr_NoMemory(); + } + + PyTuple_SetItem(localTuple, 0, first); + PyTuple_SetItem(localTuple, 1, second); + + return localTuple; + } + + template<class K, class V> + static int from_python_to_cpp(PyObject* tuple, std::pair<K,V>* out) { + + if (PyTuple_Check(tuple)) { + + auto size = PyTuple_Size(tuple); + + if (size != 2) { + return SWIG_ValueError; + } + + PyObject* firstPy = PyTuple_GetItem(tuple, 0); + PyObject* secondPy = PyTuple_GetItem(tuple, 1); + + if (!SWIG_IsOK(from_python_to_cpp(firstPy, &out->first))) { + return SWIG_TypeError; + } + + if (!SWIG_IsOK(from_python_to_cpp(secondPy, &out->second))) { + return SWIG_TypeError; + } + + } else { + return SWIG_TypeError; + } + + return SWIG_OK; + } +//---------------std::vector <-> python list --------------------- + template<class T> + static PyObject* from_vector_to_python(std::vector<T>* input) { + Py_ssize_t size = input->size(); + PyObject* localList = PyList_New(size); + + if (!localList) { + Py_XDECREF(localList); + return PyErr_NoMemory(); + } + + for(Py_ssize_t i = 0; i < size; ++i) { + + PyObject* obj = from_cpp_to_python(input->at(i)); + + PyList_SET_ITEM(localList, i, obj); + } + return localList; + } + + template<class T> + int from_python_to_vector(PyObject* seq, std::vector<T>& out) { + Py_ssize_t size = PySequence_Fast_GET_SIZE(seq); + + for(Py_ssize_t i=0; i < size; i++) { + PyObject *item = PySequence_Fast_GET_ITEM(seq, i); + if(!item) { + PyErr_SetString(PyExc_TypeError, "Failed to read data from given sequence"); + + return SWIG_NullReferenceError; + } + + T element; + int res = from_python_to_cpp(item, &element); + if (!SWIG_IsOK(res)) { + PyObject* itemRepr = PyObject_Repr(item); + PyObject* itemStrObj = PyUnicode_AsEncodedString(itemRepr, "utf-8", "replace"); + const char* itemStr = PyBytes_AS_STRING(itemStrObj); + + auto pythonType = Py_TYPE(item)->tp_name; + + PyErr_Format(PyExc_TypeError, "Failed to convert python input value %s of type '%s' to C type '%s'", itemStr, pythonType, typeid(T).name()); + Py_XDECREF(itemStrObj); + Py_XDECREF(itemRepr); + Py_DECREF(seq); + return SWIG_TypeError; + } + out.push_back(element); + } + return SWIG_OK; + } + +%} + +%define %list_to_vector(TYPEMAP...) + +// this typemap works for struct argument set + %typemap(in) TYPEMAP* (TYPEMAP tmp) { + if (PySequence_Check($input)) { + + if (from_python_to_vector($input, tmp) < 0) { + SWIG_fail; + } + + $1 = &tmp; + + } else { + PyErr_SetString(PyExc_TypeError, "Argument value object does not provide sequence protocol, implement __getitem__() method."); + SWIG_fail; + } + } + +// this typemap works for constructor + %typemap(in) TYPEMAP { + if (PySequence_Check($input)) { + if (from_python_to_vector($input, $1) < 0){ + SWIG_fail; + } + } else { + PyErr_SetString(PyExc_TypeError, "Argument value object does not provide sequence protocol, implement __getitem__() method."); + SWIG_fail; + } + } + +// this typemap works for struct argument get + + %typemap(out) TYPEMAP* { + $result = from_vector_to_python($1); + } + +// this typemap works for overloaded methods and ctors + %typemap(typecheck) (TYPEMAP) { + $1 = PySequence_Check($input) ? 1 : 0; + } + +%enddef + +%define %list_to_vector_clear(TYPEMAP...) + %typemap(in) (TYPEMAP); + %typemap(in) TYPEMAP* (TYPEMAP tmp); + %typemap(typecheck) (TYPEMAP); + %typemap(out) TYPEMAP*; +%enddef + |