Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
    }
}
Exemplo n.º 3
0
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);
}