td_tag_t td_py_get_eltype(void *v) { if (PyArray_Check( (PyObject *) v)){ PyArrayObject *arr = (PyArrayObject *)v; return numpy_type_to_td(PyArray_TYPE(v)); } return TD_UNKNOWN; }
static void to_td_val(td_val_t *out, PyObject *pVal) { PyObject *pStr; td_array_t *arr; PyArrayObject *pArr; td_tag_t tag = py_type_to_td(pVal); switch (tag) { case TD_INT32: out->tag = TD_INT32; if (PyInt_Check(pVal)) out->int32_val = PyInt_AS_LONG(pVal); else out->int32_val = PyLong_AsLong(pVal); break; case TD_UINT32: out->tag = TD_UINT32; out->uint32_val = PyLong_AsUnsignedLong(pVal); break; case TD_INT64: out->tag = TD_INT64; out->int64_val = PyLong_AsLongLong(pVal); break; case TD_UINT64: out->tag = TD_UINT64; out->uint64_val = PyLong_AsUnsignedLongLong(pVal); break; case TD_DOUBLE: out->tag = TD_DOUBLE; out->double_val = PyFloat_AsDouble(pVal); break; case TD_UTF8: pStr = pVal; if (PyUnicode_Check(pStr)) pStr = PyUnicode_AsUTF8String(pStr); size_t len = PyString_Size(pStr); char* data = malloc((len+1)*sizeof(char)); strcpy(PyString_AsString(pStr), data); td_string_t *obj = malloc(sizeof(td_string_t)); obj->length = len; obj->data = (void*) data; out->tag = TD_UTF8; out->object = (void*) obj; break; case TD_ARRAY: arr = (td_array_t *)malloc(sizeof(td_array_t)); pArr = (PyArrayObject *) pVal; arr->data = PyArray_DATA(pArr); arr->length = PyArray_SIZE(pArr); arr->eltype = numpy_type_to_td(PyArray_TYPE(pArr)); arr->ndims = PyArray_NDIM(pArr); break; default: out->tag = TD_OBJECT; out->owner = td_env_python(NULL, NULL); out->object = pVal; } }
void td_py_invoke_graph_and_csc(td_val_t *out, char *fname, graph_t *in_graph, int *in_csc_offsets, int *in_csc_indices) { PyObject *pArgs; td_array_t node_array = { .data=in_graph->nodeNames, .length=in_graph->numNodes, .eltype=TD_INT64, .ndims=1 }; td_val_t nodes = { .tag = TD_ARRAY, .object = &node_array }; td_array_t csr_offset_array = { .data=in_graph->rowOffsets, .length=in_graph->numNodes+1, .eltype=TD_INT32, .ndims=1 }; td_val_t csr_offsets = { .tag = TD_ARRAY, .object = &csr_offset_array }; td_array_t csr_indices_array = { .data=in_graph->colIndices, .length=in_graph->numEdges, .eltype=TD_INT32, .ndims=1 }; td_val_t csr_indices = { .tag = TD_ARRAY, .object = &csr_indices_array }; td_array_t csc_offset_array = { .data=in_csc_offsets, .length=in_graph->numNodes+1, .eltype=TD_INT32, .ndims=1 }; td_val_t csc_offsets = { .tag = TD_ARRAY, .object = &csc_offset_array }; td_array_t csc_indices_array = { .data=in_csc_indices, .length=in_graph->numEdges, .eltype=TD_INT32, .ndims=1 }; td_val_t csc_indices = { .tag = TD_ARRAY, .object = &csc_indices_array }; pArgs = PyTuple_New(5); td_py_add_arg(pArgs, 0, &nodes); td_py_add_arg(pArgs, 1, &csr_offsets); td_py_add_arg(pArgs, 2, &csr_indices); td_py_add_arg(pArgs, 3, &csc_offsets); td_py_add_arg(pArgs, 4, &csc_indices); td_py_call(out, pArgs, fname); Py_DECREF(pArgs); } void td_py_eval(td_val_t *out, char *str) { PyObject *v = PyRun_String(str, 0, NULL, NULL); to_td_val(out, v); } td_tag_t td_py_get_type(void *v) { return py_type_to_td((PyObject*) v); } td_tag_t td_py_get_eltype(void *v) { if (PyArray_Check( (PyObject *) v)){ PyArrayObject *arr = (PyArrayObject *) v; return numpy_type_to_td(PyArray_TYPE(arr)); } return TD_UNKNOWN; } void *td_py_get_dataptr(void *v) { if (PyArray_Check( (PyObject *) v)) return PyArray_DATA( (PyArrayObject *) v); return NULL; } size_t td_py_get_length(void *v) { if (PyArray_Check( (PyObject *) v)) return PyArray_SIZE( (PyArrayObject *)v); return 1; } size_t td_py_get_ndims(void *v) { if (PyArray_Check( (PyObject *) v)) return PyArray_NDIM( (PyArrayObject *)v); return 0; } // initialization void td_py_init(char *homedir) { Py_Initialize(); import_array(); td_env_t *env = (td_env_t*)malloc(sizeof(td_env_t)); env->name = "python"; env->eval = &td_py_eval; env->invoke0 = &td_py_invoke0; env->invoke1 = &td_py_invoke1; env->invoke2 = &td_py_invoke2; env->invoke3 = &td_py_invoke3; env->invoke4 = &td_py_invoke4; env->invoke5 = &td_py_invoke5; env->invokeGraph1 = &td_py_invoke_graph1; env->invokeGraphAndCSC = &td_py_invoke_graph_and_csc; //env->retain //env->release env->get_type = &td_py_get_type; env->get_eltype = &td_py_get_eltype; env->get_dataptr = &td_py_get_dataptr; env->get_length = &td_py_get_length; env->get_ndims = &td_py_get_ndims; //env->get_dims //env->get_strides td_provide_python(env); }