int NCFormat_from_spMatrix(SuperMatrix * A, int m, int n, int nnz, PyArrayObject * nzvals, PyArrayObject * rowind, PyArrayObject * colptr, int typenum) { int ok = 0; ok = (PyArray_EquivTypenums(PyArray_DESCR(nzvals)->type_num, typenum) && PyArray_EquivTypenums(PyArray_DESCR(rowind)->type_num, NPY_INT) && PyArray_EquivTypenums(PyArray_DESCR(colptr)->type_num, NPY_INT) && PyArray_NDIM(nzvals) == 1 && PyArray_NDIM(rowind) == 1 && PyArray_NDIM(colptr) == 1 && PyArray_IS_C_CONTIGUOUS(nzvals) && PyArray_IS_C_CONTIGUOUS(rowind) && PyArray_IS_C_CONTIGUOUS(colptr) && nnz <= PyArray_DIM(nzvals, 0) && nnz <= PyArray_DIM(rowind, 0) && n+1 <= PyArray_DIM(colptr, 0)); if (!ok) { PyErr_SetString(PyExc_ValueError, "sparse matrix arrays must be 1-D C-contiguous and of proper " "sizes and types"); return -1; } if (setjmp(_superlu_py_jmpbuf)) return -1; else { if (!CHECK_SLU_TYPE(nzvals->descr->type_num)) { PyErr_SetString(PyExc_TypeError, "Invalid type for array."); return -1; } Create_CompCol_Matrix(nzvals->descr->type_num, A, m, n, nnz, nzvals->data, (int *) rowind->data, (int *) colptr->data, SLU_NC, NPY_TYPECODE_TO_SLU(nzvals->descr->type_num), SLU_GE); } return 0; }
/* Convert the given PyObject to a NumPy array with the given * typecode. On success, return a valid PyArrayObject* with the * correct type. On failure, the python error string will be set and * the routine returns NULL. */ PyArrayObject* obj_to_array_allow_conversion(PyObject* input, int typecode, int* is_new_object) { PyArrayObject* ary = NULL; PyObject* py_obj; if (is_array(input) && (typecode == NPY_NOTYPE || PyArray_EquivTypenums(array_type(input),typecode))) { ary = (PyArrayObject*) input; *is_new_object = 0; } else { py_obj = PyArray_FromObject(input, typecode, 0, 0); /* If NULL, PyArray_FromObject will have set python error value.*/ ary = (PyArrayObject*) py_obj; *is_new_object = 1; } PyErr_Clear(); return ary; }
bool check_type(PyArrayObject* a) { return PyArray_EquivTypenums(PyArray_TYPE(a), dtype_code<T>()); }