[Scipy-svn] r6726 - in trunk: scipy/sparse/linalg/dsolve tools

scipy-svn@scip... scipy-svn@scip...
Sat Sep 11 19:52:12 CDT 2010


Author: ptvirtan
Date: 2010-09-11 19:52:11 -0500 (Sat, 11 Sep 2010)
New Revision: 6726

Added:
   trunk/scipy/sparse/linalg/dsolve/npy_3kcompat.h
Removed:
   trunk/scipy/sparse/linalg/dsolve/py3k.h
Modified:
   trunk/scipy/sparse/linalg/dsolve/_superlu_utils.c
   trunk/scipy/sparse/linalg/dsolve/_superlumodule.c
   trunk/scipy/sparse/linalg/dsolve/_superluobject.c
   trunk/scipy/sparse/linalg/dsolve/_superluobject.h
   trunk/tools/py3tool.py
Log:
3K: sparse: fix superlu module build on Py3

Modified: trunk/scipy/sparse/linalg/dsolve/_superlu_utils.c
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/_superlu_utils.c	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/scipy/sparse/linalg/dsolve/_superlu_utils.c	2010-09-12 00:52:11 UTC (rev 6726)
@@ -1,7 +1,12 @@
 /* Should be imported before Python.h */
-#include "py3k.h"
 
-#include "Python.h"
+#include <Python.h>
+
+#define NO_IMPORT_ARRAY
+#define PY_ARRAY_UNIQUE_SYMBOL _scipy_sparse_superlu_ARRAY_API
+
+#include "_superluobject.h"
+#include "npy_3kcompat.h"
 #include <setjmp.h>
 
 jmp_buf _superlu_py_jmpbuf;

Modified: trunk/scipy/sparse/linalg/dsolve/_superlumodule.c
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/_superlumodule.c	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/scipy/sparse/linalg/dsolve/_superlumodule.c	2010-09-12 00:52:11 UTC (rev 6726)
@@ -14,7 +14,11 @@
 #include <Python.h>
 #include <setjmp.h>
 
+#define PY_ARRAY_UNIQUE_SYMBOL _scipy_sparse_superlu_ARRAY_API
+#include <numpy/arrayobject.h>
+
 #include "_superluobject.h"
+#include "npy_3kcompat.h"
 
 extern jmp_buf _superlu_py_jmpbuf;
 
@@ -258,13 +262,18 @@
 {
     PyObject *m, *d;
 
+    import_array();
+
+    if (PyType_Ready(&SciPySuperLUType) < 0) {
+        return;
+    }
+
     m = PyModule_Create(&moduledef);
     d = PyModule_GetDict(m);
 
+    Py_INCREF(&PyArrayFlags_Type);
     PyDict_SetItemString(d, "SciPyLUType", (PyObject *)&SciPySuperLUType);
 
-    import_array();
-
     if (PyErr_Occurred())
         Py_FatalError("can't initialize module _superlu");
 
@@ -278,14 +287,18 @@
 {
     PyObject *m, *d;
 
+    import_array();
+
     SciPySuperLUType.ob_type = &PyType_Type;
+    if (PyType_Ready(&SciPySuperLUType) < 0) {
+        return;
+    }
 
     m = Py_InitModule("_superlu", SuperLU_Methods);
     d = PyModule_GetDict(m);
 
+    Py_INCREF(&PyArrayFlags_Type);
     PyDict_SetItemString(d, "SciPyLUType", (PyObject *)&SciPySuperLUType);
-
-    import_array();
 }
 
 #endif

Modified: trunk/scipy/sparse/linalg/dsolve/_superluobject.c
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/_superluobject.c	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/scipy/sparse/linalg/dsolve/_superluobject.c	2010-09-12 00:52:11 UTC (rev 6726)
@@ -6,10 +6,12 @@
  */
 
 #include <Python.h>
-#include "py3k.h"
 
 #define NO_IMPORT_ARRAY
+#define PY_ARRAY_UNIQUE_SYMBOL _scipy_sparse_superlu_ARRAY_API
+
 #include "_superluobject.h"
+#include "npy_3kcompat.h"
 #include <setjmp.h>
 #include <ctype.h>
 
@@ -158,7 +160,7 @@
     PyObject *list = PyList_New(sizeof(members)/sizeof(char *));
     if (list != NULL) {
       for (i = 0; i < sizeof(members)/sizeof(char *); i ++)
-	PyList_SetItem(list, i, PyUstring_FromString(members[i]));
+	PyList_SetItem(list, i, PyUString_FromString(members[i]));
       if (PyErr_Occurred()) {
 	Py_DECREF(list);
 	list = NULL;
@@ -206,8 +208,12 @@
 ";
 
 PyTypeObject SciPySuperLUType = {
+#if defined(NPY_PY3K)
+  PyVarObject_HEAD_INIT(NULL, 0)
+#else
   PyObject_HEAD_INIT(NULL)
   0,
+#endif
   "factored_lu",
   sizeof(SciPyLUObject),
   0,
@@ -215,7 +221,7 @@
   0,				/* tp_print */
   (getattrfunc)SciPyLU_getattr,  /* tp_getattr */
   0,				/* tp_setattr */
-  0,				/* tp_compare */
+  0,				/* tp_compare / tp_reserved */
   0,				/* tp_repr */
   0,				/* tp_as_number*/
   0,				/* tp_as_sequence*/
@@ -226,8 +232,36 @@
   0,				/* tp_getattro */
   0,				/* tp_setattro */
   0,				/* tp_as_buffer */
-  0,				/* tp_flags */
+  Py_TPFLAGS_DEFAULT,		/* tp_flags */
   factored_lu_doc,		/* tp_doc */
+  0,                            /* tp_traverse */
+  0,                            /* tp_clear */
+  0,                            /* tp_richcompare */
+  0,                            /* tp_weaklistoffset */
+  0,                            /* tp_iter */
+  0,                            /* tp_iternext */
+  SciPyLU_methods,              /* tp_methods */
+  0,                            /* tp_members */
+  0,                            /* tp_getset */
+  0,                            /* tp_base */
+  0,                            /* tp_dict */
+  0,                            /* tp_descr_get */
+  0,                            /* tp_descr_set */
+  0,                            /* tp_dictoffset */
+  0,                            /* tp_init */
+  0,                            /* tp_alloc */
+  0,                            /* tp_new */
+  0,                            /* tp_free */
+  0,                            /* tp_is_gc */
+  0,                            /* tp_bases */
+  0,                            /* tp_mro */
+  0,                            /* tp_cache */
+  0,                            /* tp_subclasses */
+  0,                            /* tp_weaklist */
+  0,                            /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+  0,                            /* tp_version_tag */
+#endif
 };
 
 

Modified: trunk/scipy/sparse/linalg/dsolve/_superluobject.h
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/_superluobject.h	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/scipy/sparse/linalg/dsolve/_superluobject.h	2010-09-12 00:52:11 UTC (rev 6726)
@@ -10,7 +10,6 @@
 
 #include "Python.h"
 #include "SuperLU/SRC/slu_zdefs.h"
-#define PY_ARRAY_UNIQUE_SYMBOL _scipy_sparse_superlu_ARRAY_API
 #include "numpy/arrayobject.h"
 #include "SuperLU/SRC/slu_util.h"
 #include "SuperLU/SRC/slu_dcomplex.h"
@@ -23,7 +22,7 @@
  * SuperLUObject definition
  */
 typedef struct {
-    PyObject_VAR_HEAD
+    PyObject_HEAD
     npy_intp m,n;
     SuperMatrix L;
     SuperMatrix U;

Added: trunk/scipy/sparse/linalg/dsolve/npy_3kcompat.h
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/npy_3kcompat.h	                        (rev 0)
+++ trunk/scipy/sparse/linalg/dsolve/npy_3kcompat.h	2010-09-12 00:52:11 UTC (rev 6726)
@@ -0,0 +1,305 @@
+#ifndef _NPY_3KCOMPAT_H_
+#define _NPY_3KCOMPAT_H_
+
+#include <Python.h>
+#include <stdio.h>
+
+#if PY_VERSION_HEX >= 0x03000000
+#define NPY_PY3K
+#endif
+
+#include "numpy/npy_common.h"
+#include "numpy/ndarrayobject.h"
+
+/*
+ * PyInt -> PyLong
+ */
+
+#if defined(NPY_PY3K)
+/* Return True only if the long fits in a C long */
+static NPY_INLINE int PyInt_Check(PyObject *op) {
+    int overflow = 0;
+    if (!PyLong_Check(op)) {
+        return 0;
+    }
+    PyLong_AsLongAndOverflow(op, &overflow);
+    return (overflow == 0);
+}
+
+#define PyInt_FromLong PyLong_FromLong
+#define PyInt_AsLong PyLong_AsLong
+#define PyInt_AS_LONG PyLong_AsLong
+#define PyInt_AsSsize_t PyLong_AsSsize_t
+
+/* NOTE:
+ *
+ * Since the PyLong type is very different from the fixed-range PyInt,
+ * we don't define PyInt_Type -> PyLong_Type.
+ */
+#endif /* NPY_PY3K */
+
+/*
+ * PyString -> PyBytes
+ */
+
+#if defined(NPY_PY3K)
+
+#define PyString_Type PyBytes_Type
+#define PyString_Check PyBytes_Check
+#define PyStringObject PyBytesObject
+#define PyString_FromString PyBytes_FromString
+#define PyString_FromStringAndSize PyBytes_FromStringAndSize
+#define PyString_AS_STRING PyBytes_AS_STRING
+#define PyString_AsStringAndSize PyBytes_AsStringAndSize
+#define PyString_FromFormat PyBytes_FromFormat
+#define PyString_Concat PyBytes_Concat
+#define PyString_ConcatAndDel PyBytes_ConcatAndDel
+#define PyString_AsString PyBytes_AsString
+#define PyString_GET_SIZE PyBytes_GET_SIZE
+#define PyString_Size PyBytes_Size
+
+#define PyUString_Type PyUnicode_Type
+#define PyUString_Check PyUnicode_Check
+#define PyUStringObject PyUnicodeObject
+#define PyUString_FromString PyUnicode_FromString
+#define PyUString_FromStringAndSize PyUnicode_FromStringAndSize
+#define PyUString_FromFormat PyUnicode_FromFormat
+#define PyUString_Concat PyUnicode_Concat2
+#define PyUString_ConcatAndDel PyUnicode_ConcatAndDel
+#define PyUString_GET_SIZE PyUnicode_GET_SIZE
+#define PyUString_Size PyUnicode_Size
+#define PyUString_InternFromString PyUnicode_InternFromString
+#define PyUString_Format PyUnicode_Format
+
+#else
+
+#define PyBytes_Type PyString_Type
+#define PyBytes_Check PyString_Check
+#define PyBytesObject PyStringObject
+#define PyBytes_FromString PyString_FromString
+#define PyBytes_FromStringAndSize PyString_FromStringAndSize
+#define PyBytes_AS_STRING PyString_AS_STRING
+#define PyBytes_AsStringAndSize PyString_AsStringAndSize
+#define PyBytes_FromFormat PyString_FromFormat
+#define PyBytes_Concat PyString_Concat
+#define PyBytes_ConcatAndDel PyString_ConcatAndDel
+#define PyBytes_AsString PyString_AsString
+#define PyBytes_GET_SIZE PyString_GET_SIZE
+#define PyBytes_Size PyString_Size
+
+#define PyUString_Type PyString_Type
+#define PyUString_Check PyString_Check
+#define PyUStringObject PyStringObject
+#define PyUString_FromString PyString_FromString
+#define PyUString_FromStringAndSize PyString_FromStringAndSize
+#define PyUString_FromFormat PyString_FromFormat
+#define PyUString_Concat PyString_Concat
+#define PyUString_ConcatAndDel PyString_ConcatAndDel
+#define PyUString_GET_SIZE PyString_GET_SIZE
+#define PyUString_Size PyString_Size
+#define PyUString_InternFromString PyString_InternFromString
+#define PyUString_Format PyString_Format
+
+#endif /* NPY_PY3K */
+
+
+static NPY_INLINE void
+PyUnicode_ConcatAndDel(PyObject **left, PyObject *right)
+{
+    PyObject *new;
+    new = PyUnicode_Concat(*left, right);
+    Py_DECREF(*left);
+    Py_DECREF(right);
+    *left = new;
+}
+
+static NPY_INLINE void
+PyUnicode_Concat2(PyObject **left, PyObject *right)
+{
+    PyObject *new;
+    new = PyUnicode_Concat(*left, right);
+    Py_DECREF(*left);
+    *left = new;
+}
+
+
+/*
+ * Accessing items of ob_base
+ */
+
+#if (PY_VERSION_HEX < 0x02060000)
+#define Py_TYPE(o)    (((PyObject*)(o))->ob_type)
+#define Py_REFCNT(o)  (((PyObject*)(o))->ob_refcnt)
+#define Py_SIZE(o)    (((PyVarObject*)(o))->ob_size)
+#endif
+
+/*
+ * PyFile_AsFile
+ */
+#if defined(NPY_PY3K)
+static NPY_INLINE FILE*
+npy_PyFile_Dup(PyObject *file, char *mode)
+{
+    int fd, fd2;
+    PyObject *ret, *os;
+    /* Flush first to ensure things end up in the file in the correct order */
+    ret = PyObject_CallMethod(file, "flush", "");
+    if (ret == NULL) {
+        return NULL;
+    }
+    Py_DECREF(ret);
+    fd = PyObject_AsFileDescriptor(file);
+    if (fd == -1) {
+        return NULL;
+    }
+    os = PyImport_ImportModule("os");
+    if (os == NULL) {
+        return NULL;
+    }
+    ret = PyObject_CallMethod(os, "dup", "i", fd);
+    Py_DECREF(os);
+    if (ret == NULL) {
+        return NULL;
+    }
+    fd2 = PyNumber_AsSsize_t(ret, NULL);
+    Py_DECREF(ret);
+    return fdopen(fd2, mode);
+}
+#endif
+
+static NPY_INLINE PyObject*
+npy_PyFile_OpenFile(PyObject *filename, char *mode)
+{
+    PyObject *open;
+    open = PyDict_GetItemString(PyEval_GetBuiltins(), "open");
+    if (open == NULL) {
+        return NULL;
+    }
+    return PyObject_CallFunction(open, "Os", filename, mode);
+}
+
+/*
+ * PyObject_Cmp
+ */
+#if defined(NPY_PY3K)
+static NPY_INLINE int
+PyObject_Cmp(PyObject *i1, PyObject *i2, int *cmp)
+{
+    int v;
+    v = PyObject_RichCompareBool(i1, i2, Py_LT);
+    if (v == 0) {
+        *cmp = -1;
+        return 1;
+    }
+    else if (v == -1) {
+        return -1;
+    }
+
+    v = PyObject_RichCompareBool(i1, i2, Py_GT);
+    if (v == 0) {
+        *cmp = 1;
+        return 1;
+    }
+    else if (v == -1) {
+        return -1;
+    }
+
+    v = PyObject_RichCompareBool(i1, i2, Py_EQ);
+    if (v == 0) {
+        *cmp = 0;
+        return 1;
+    }
+    else {
+        *cmp = 0;
+        return -1;
+    }
+}
+#endif
+
+/*
+ * PyCObject functions adapted to PyCapsules.
+ *
+ * The main job here is to get rid of the improved error handling
+ * of PyCapsules. It's a shame...
+ */
+#if defined(NPY_PY3K)
+
+static NPY_INLINE PyObject *
+NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *))
+{
+    PyObject *ret = PyCapsule_New(ptr, NULL, dtor);
+    if (ret == NULL) {
+        PyErr_Clear();
+    }
+    return ret;
+}
+
+static NPY_INLINE PyObject *
+NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(PyObject *))
+{
+    PyObject *ret = NpyCapsule_FromVoidPtr(ptr, dtor);
+    if (ret != NULL && PyCapsule_SetContext(ret, context) != 0) {
+        PyErr_Clear();
+        Py_DECREF(ret);
+        ret = NULL;
+    }
+    return ret;
+}
+
+static NPY_INLINE void *
+NpyCapsule_AsVoidPtr(PyObject *obj)
+{
+    void *ret = PyCapsule_GetPointer(obj, NULL);
+    if (ret == NULL) {
+        PyErr_Clear();
+    }
+    return ret;
+}
+
+static NPY_INLINE int
+NpyCapsule_Check(PyObject *ptr)
+{
+    return PyCapsule_CheckExact(ptr);
+}
+
+static void
+simple_capsule_dtor(PyObject *cap)
+{
+    PyArray_free(PyCapsule_GetPointer(cap, NULL));
+}
+
+#else
+
+static NPY_INLINE PyObject *
+NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(void *))
+{
+    return PyCObject_FromVoidPtr(ptr, dtor);
+}
+
+static NPY_INLINE PyObject *
+NpyCapsule_FromVoidPtrAndDesc(void *ptr, void* context, void (*dtor)(void *))
+{
+    return PyCObject_FromVoidPtrAndDesc(ptr, context, dtor);
+}
+
+static NPY_INLINE void *
+NpyCapsule_AsVoidPtr(PyObject *ptr)
+{
+    return PyCObject_AsVoidPtr(ptr);
+}
+
+static NPY_INLINE int
+NpyCapsule_Check(PyObject *ptr)
+{
+    return PyCObject_Check(ptr);
+}
+
+static void
+simple_capsule_dtor(void *ptr)
+{
+    PyArray_free(ptr);
+}
+
+#endif
+
+#endif /* _NPY_3KCOMPAT_H_ */

Deleted: trunk/scipy/sparse/linalg/dsolve/py3k.h
===================================================================
--- trunk/scipy/sparse/linalg/dsolve/py3k.h	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/scipy/sparse/linalg/dsolve/py3k.h	2010-09-12 00:52:11 UTC (rev 6726)
@@ -1,14 +0,0 @@
-#ifndef __NPY_PY3H__
-#define __NPY_PY3H__
-
-#include <Python.h>
-
-#if PY_VERSION_HEX >= 0x03000000
-    #define PyUstring_FromString PyUnicode_FromString
-    #define PyInt_FromLong PyLong_FromLong
-    #define PyInt_Check PyLong_Check
-#else
-    #define PyUstring_FromString PyString_FromString
-#endif
-
-#endif

Modified: trunk/tools/py3tool.py
===================================================================
--- trunk/tools/py3tool.py	2010-09-12 00:51:49 UTC (rev 6725)
+++ trunk/tools/py3tool.py	2010-09-12 00:52:11 UTC (rev 6726)
@@ -175,7 +175,7 @@
         os.path.join('spatial', '__init__.py'),
         os.path.join('spatial', 'distance.py'),
         os.path.join('sparse', 'linalg', 'isolve', 'iterative.py'),
-        os.path.join('sparse', 'linalg', 'dsolve', '_superlu.py'),
+        os.path.join('sparse', 'linalg', 'dsolve', 'linsolve.py'),
         os.path.join('sparse', 'linalg', 'eigen', 'arpack', 'arpack.py'),
         os.path.join('sparse', 'linalg', 'eigen', 'arpack', 'speigs.py'),
         os.path.join('sparse', 'linalg', 'iterative', 'isolve', 'iterative.py'),
@@ -199,8 +199,7 @@
                     'futil', 'mvn',
                     '_nd_image',
                     'numpyio',
-                    '_zsuperlu', '_ssuperlu', '_dsuperlu', '_csuperlu',
-                    '_arpack', '_iterative',
+                    '_superlu', '_arpack', '_iterative',
                     ]:
             text = re.sub(r'^(\s*)import %s' % mod,
                           r'\1from . import %s' % mod,



More information about the Scipy-svn mailing list