[Scipy-svn] r6726 - in trunk: scipy/sparse/linalg/dsolve tools
scipy-svn at scipy.org
scipy-svn at scipy.org
Sat Sep 11 20:52:12 EDT 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