Skip to content

Commit

Permalink
Legacy code removed. PyCapsule module is available since Python 2.7
Browse files Browse the repository at this point in the history
  • Loading branch information
sanurielf committed Aug 3, 2020
1 parent 65535cb commit 3445ced
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 108 deletions.
3 changes: 1 addition & 2 deletions src/C/klu.c
Expand Up @@ -2,7 +2,7 @@
* @Author: Uriel Sandoval
* @Date: 2015-04-28 18:56:49
* @Last Modified by: Uriel Sandoval
* @Last Modified time: 2020-08-01 10:20:22
* @Last Modified time: 2020-08-03 18:19:25
*/


Expand Down Expand Up @@ -475,7 +475,6 @@ static PyObject* numeric(PyObject *self, PyObject *args, PyObject *kwrds)
case COMPLEX:
TypeCheck_Capsule(Fs, descrzFs, "Fs is not the KLU symbolic "
"factor of a 'z' matrix");

if (!(Fsptr = (KLUS(symbolic) *) PyCapsule_GetPointer(Fs, descrzFs)))
err_CO("Fs");

Expand Down
7 changes: 1 addition & 6 deletions src/C/misc.h
Expand Up @@ -61,16 +61,11 @@ typedef union {
#define X_NCOLS(O) (Matrix_Check(O) ? MAT_NCOLS(O) : SP_NCOLS(O))
#define X_Matrix_Check(O) (Matrix_Check(O) || SpMatrix_Check(O))

#if PY_MAJOR_VERSION >= 3
#define TypeCheck_Capsule(O,str,errstr) { \
if (!PyCapsule_CheckExact(O)) PY_ERR(PyExc_TypeError, errstr); \
const char *descr = PyCapsule_GetName(O); \
if (!descr || strcmp(descr,str)) PY_ERR(PyExc_TypeError,errstr); }
#else
#define TypeCheck_CObject(O,str,errstr) { \
char *descr = PyCObject_GetDesc(O); \
if (!descr || strcmp(descr,str)) PY_ERR(PyExc_TypeError,errstr); }
#endif



#define len(x) (Matrix_Check(x) ? MAT_LGT(x) : SP_LGT(x))
Expand Down
113 changes: 13 additions & 100 deletions src/C/umfpack.c
Expand Up @@ -45,57 +45,30 @@ PyDoc_STRVAR(umfpack__doc__,"Interface to the UMFPACK library.\n\n"
"The default control settings of UMPFACK are used.\n\n"
"See also www.suitesparse.com.");

#if PY_MAJOR_VERSION >= 3
static void free_umfpack_d_symbolic(void *F)
{
void *Fptr = PyCapsule_GetPointer(F, PyCapsule_GetName(F));
UMFD(free_symbolic)(&Fptr);
}
#else
static void free_umfpack_d_symbolic(void *F, void *descr)
{
UMFD(free_symbolic)(&F);
}
#endif

#if PY_MAJOR_VERSION >= 3
static void free_umfpack_z_symbolic(void *F)
{
void *Fptr = PyCapsule_GetPointer(F, PyCapsule_GetName(F));
UMFZ(free_symbolic)(&Fptr);
}
#else
static void free_umfpack_z_symbolic(void *F, void *descr)
{
UMFZ(free_symbolic)(&F);
}
#endif

#if PY_MAJOR_VERSION >= 3
static void free_umfpack_d_numeric(void *F)
{
void *Fptr = PyCapsule_GetPointer(F, PyCapsule_GetName(F));
UMFD(free_numeric)(&Fptr);
}
#else
static void free_umfpack_d_numeric(void *F, void *descr)
{
UMFD(free_numeric)(&F);
}
#endif

#if PY_MAJOR_VERSION >= 3
static void free_umfpack_z_numeric(void *F)
{
void *Fptr = PyCapsule_GetPointer(F, PyCapsule_GetName(F));
UMFZ(free_numeric)(&Fptr);
}
#else
static void free_umfpack_z_numeric(void *F, void *descr)
{
UMFZ(free_numeric)(&F);
}
#endif



static char doc_linsolve[] =
Expand Down Expand Up @@ -287,15 +260,10 @@ static PyObject* symbolic(PyObject *self, PyObject *args)
UMFD(symbolic)(SP_NROWS(A), SP_NCOLS(A), SP_COL(A),
SP_ROW(A), SP_VAL(A), &symbolic, NULL, info);
if (info[UMFPACK_STATUS] == UMFPACK_OK)
#if PY_MAJOR_VERSION >= 3
return (PyObject *) PyCapsule_New( (void *) symbolic,
"UMFPACK SYM D FACTOR",
(PyCapsule_Destructor) &free_umfpack_d_symbolic);
#else
return (PyObject *) PyCObject_FromVoidPtrAndDesc(
(void *) symbolic, "UMFPACK SYM D FACTOR",
free_umfpack_d_symbolic);
#endif

else
UMFD(free_symbolic)(&symbolic);
break;
Expand All @@ -304,15 +272,10 @@ static PyObject* symbolic(PyObject *self, PyObject *args)
UMFZ(symbolic)(SP_NROWS(A), SP_NCOLS(A), SP_COL(A),
SP_ROW(A), SP_VAL(A), NULL, &symbolic, NULL, info);
if (info[UMFPACK_STATUS] == UMFPACK_OK)
#if PY_MAJOR_VERSION >= 3
return (PyObject *) PyCapsule_New(
(void *) symbolic, "UMFPACK SYM Z FACTOR",
(PyCapsule_Destructor) &free_umfpack_z_symbolic);
#else
return (PyObject *) PyCObject_FromVoidPtrAndDesc(
(void *) symbolic, "UMFPACK SYM Z FACTOR",
free_umfpack_z_symbolic);
#endif

else
UMFZ(free_symbolic)(&symbolic);
break;
Expand Down Expand Up @@ -347,74 +310,48 @@ static PyObject* numeric(PyObject *self, PyObject *args)
PyObject *Fs;
double info[UMFPACK_INFO];
void *numeric;
#if PY_MAJOR_VERSION >= 3
void *Fsptr;
const char *descrd = "UMFPACK SYM D FACTOR";
const char *descrz = "UMFPACK SYM Z FACTOR";
#endif

if (!PyArg_ParseTuple(args, "OO", &A, &Fs)) return NULL;

if (!SpMatrix_Check(A)) PY_ERR_TYPE("A must be a sparse matrix");
#if PY_MAJOR_VERSION >= 3

if (!PyCapsule_CheckExact(Fs)) err_CO("Fs");
#else
if (!PyCObject_Check(Fs)) err_CO("Fs");
#endif


switch (SP_ID(A)) {
case DOUBLE:
#if PY_MAJOR_VERSION >= 3
TypeCheck_Capsule(Fs, descrd, "Fs is not the UMFPACK symbolic "
"factor of a 'd' matrix");
if (!(Fsptr = (void *) PyCapsule_GetPointer(Fs, descrd)))
err_CO("Fs");
UMFD(numeric)(SP_COL(A), SP_ROW(A), SP_VAL(A), Fsptr, &numeric,
NULL, info);
#else
TypeCheck_CObject(Fs, "UMFPACK SYM D FACTOR", "Fs is not "
"the UMFPACK symbolic factor of a 'd' matrix");
UMFD(numeric)(SP_COL(A), SP_ROW(A), SP_VAL(A),
(void *) PyCObject_AsVoidPtr(Fs), &numeric, NULL, info);
#endif

if (info[UMFPACK_STATUS] == UMFPACK_OK)
#if PY_MAJOR_VERSION >= 3
return (PyObject *) PyCapsule_New(
(void *) numeric, "UMFPACK NUM D FACTOR",
(PyCapsule_Destructor) &free_umfpack_d_numeric);
#else
return (PyObject *) PyCObject_FromVoidPtrAndDesc(
(void *) numeric, "UMFPACK NUM D FACTOR",
free_umfpack_d_numeric);
#endif

else
UMFD(free_numeric)(&numeric);
break;

case COMPLEX:
#if PY_MAJOR_VERSION >= 3
TypeCheck_Capsule(Fs, descrz, "Fs is not the UMFPACK symbolic "
"factor of a 'z' matrix");
if (!(Fsptr = (void *) PyCapsule_GetPointer(Fs, descrz)))
err_CO("Fs");
UMFZ(numeric)(SP_COL(A), SP_ROW(A), SP_VAL(A), NULL, Fsptr,
&numeric, NULL, info);
#else
TypeCheck_CObject(Fs, "UMFPACK SYM Z FACTOR", "Fs is not "
"the UMFPACK symbolic factor of a 'z' matrix");
UMFZ(numeric)(SP_COL(A), SP_ROW(A), SP_VAL(A), NULL,
(void *) PyCObject_AsVoidPtr(Fs), &numeric, NULL, info);
#endif

if (info[UMFPACK_STATUS] == UMFPACK_OK)
#if PY_MAJOR_VERSION >= 3
return (PyObject *) PyCapsule_New(
(void *) numeric, "UMFPACK NUM Z FACTOR",
(PyCapsule_Destructor) &free_umfpack_z_numeric);
#else
return (PyObject *) PyCObject_FromVoidPtrAndDesc(
(void *) numeric, "UMFPACK NUM Z FACTOR",
free_umfpack_z_numeric);
#endif

else
UMFZ(free_numeric)(&numeric);
break;
Expand Down Expand Up @@ -465,9 +402,9 @@ static PyObject* solve(PyObject *self, PyObject *args, PyObject *kwrds)
matrix *B;
#if PY_MAJOR_VERSION >= 3
int trans_ = 'N';
#endif
const char *descrd = "UMFPACK NUM D FACTOR";
const char *descrz = "UMFPACK NUM Z FACTOR";
#endif
char trans='N';
double *x, info[UMFPACK_INFO];
int oB=0, n, ldB=0, nrhs=-1, k;
Expand All @@ -487,7 +424,6 @@ static PyObject* solve(PyObject *self, PyObject *args, PyObject *kwrds)
PY_ERR_TYPE("A must a square sparse matrix");
n = SP_NROWS(A);

#if PY_MAJOR_VERSION >= 3
if (!PyCapsule_CheckExact(F)) err_CO("F");
if (SP_ID(A) == DOUBLE) {
TypeCheck_Capsule(F, descrd, "F is not the UMFPACK numeric factor "
Expand All @@ -497,17 +433,7 @@ static PyObject* solve(PyObject *self, PyObject *args, PyObject *kwrds)
TypeCheck_Capsule(F, descrz, "F is not the UMFPACK numeric factor "
"of a 'z' matrix");
}
#else
if (!PyCObject_Check(F)) err_CO("F");
if (SP_ID(A) == DOUBLE) {
TypeCheck_CObject(F, "UMFPACK NUM D FACTOR", "F is not the "
"UMFPACK numeric factor of a 'd' matrix");
}
else {
TypeCheck_CObject(F, "UMFPACK NUM Z FACTOR", "F is not the "
"UMFPACK numeric factor of a 'z' matrix");
}
#endif


if (!Matrix_Check(B) || MAT_ID(B) != SP_ID(A))
PY_ERR_TYPE("B must a dense matrix of the same numeric type "
Expand All @@ -526,31 +452,18 @@ static PyObject* solve(PyObject *self, PyObject *args, PyObject *kwrds)

for (k=0; k<nrhs; k++) {
if (SP_ID(A) == DOUBLE)
#if PY_MAJOR_VERSION >= 3
UMFD(solve)(trans == 'N' ? UMFPACK_A : UMFPACK_Aat,
SP_COL(A), SP_ROW(A), SP_VAL(A), x,
MAT_BUFD(B) + k*ldB + oB,
(void *) PyCapsule_GetPointer(F, descrd), NULL, info);
#else
UMFD(solve)(trans == 'N' ? UMFPACK_A : UMFPACK_Aat,
SP_COL(A), SP_ROW(A), SP_VAL(A), x,
MAT_BUFD(B) + k*ldB + oB,
(void *) PyCObject_AsVoidPtr(F), NULL, info);
#endif

else
#if PY_MAJOR_VERSION >= 3
UMFZ(solve)(trans == 'N' ? UMFPACK_A : trans == 'C' ?
UMFPACK_At : UMFPACK_Aat, SP_COL(A), SP_ROW(A),
SP_VAL(A), NULL, x, NULL,
(double *)(MAT_BUFZ(B) + k*ldB + oB), NULL,
(void *) PyCapsule_GetPointer(F, descrz), NULL, info);
#else
UMFZ(solve)(trans == 'N' ? UMFPACK_A : trans == 'C' ?
UMFPACK_At : UMFPACK_Aat, SP_COL(A), SP_ROW(A),
SP_VAL(A), NULL, x, NULL,
(double *)(MAT_BUFZ(B) + k*ldB + oB), NULL,
(void *) PyCObject_AsVoidPtr(F), NULL, info);
#endif

if (info[UMFPACK_STATUS] == UMFPACK_OK)
memcpy((unsigned char*)B->buffer + (k*ldB + oB)*E_SIZE[SP_ID(A)], x,
n*E_SIZE[SP_ID(A)]);
Expand Down

0 comments on commit 3445ced

Please sign in to comment.