File: | /tmp/pyrefcon/scipy/scipy/sparse/linalg/dsolve/_superlumodule.c |
Warning: | line 336, column 9 PyObject ownership leak with reference count of 1 |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* -*-c-*- */ | |||
2 | /* | |||
3 | * _superlu module | |||
4 | * | |||
5 | * Python interface to SuperLU decompositions. | |||
6 | */ | |||
7 | ||||
8 | /* Copyright 1999 Travis Oliphant | |||
9 | * | |||
10 | * Permission to copy and modified this file is granted under | |||
11 | * the revised BSD license. No warranty is expressed or IMPLIED | |||
12 | */ | |||
13 | ||||
14 | #include <Python.h> | |||
15 | ||||
16 | #define PY_ARRAY_UNIQUE_SYMBOL_scipy_sparse_superlu_ARRAY_API _scipy_sparse_superlu_ARRAY_API | |||
17 | #include <numpy/ndarrayobject.h> | |||
18 | ||||
19 | #include "_superluobject.h" | |||
20 | ||||
21 | ||||
22 | /* | |||
23 | * NULL-safe deconstruction functions | |||
24 | */ | |||
25 | void XDestroy_SuperMatrix_Store(SuperMatrix * A) | |||
26 | { | |||
27 | Destroy_SuperMatrix_Store(A); /* safe as-is */ | |||
28 | A->Store = NULL((void*)0); | |||
29 | } | |||
30 | ||||
31 | void XDestroy_SuperNode_Matrix(SuperMatrix * A) | |||
32 | { | |||
33 | if (A->Store) { | |||
34 | Destroy_SuperNode_Matrix(A); | |||
35 | } | |||
36 | A->Store = NULL((void*)0); | |||
37 | } | |||
38 | ||||
39 | void XDestroy_CompCol_Matrix(SuperMatrix * A) | |||
40 | { | |||
41 | if (A->Store) { | |||
42 | Destroy_CompCol_Matrix(A); | |||
43 | } | |||
44 | A->Store = NULL((void*)0); | |||
45 | } | |||
46 | ||||
47 | void XDestroy_CompCol_Permuted(SuperMatrix * A) | |||
48 | { | |||
49 | if (A->Store) { | |||
50 | Destroy_CompCol_Permuted(A); | |||
51 | } | |||
52 | A->Store = NULL((void*)0); | |||
53 | } | |||
54 | ||||
55 | void XStatFree(SuperLUStat_t * stat) | |||
56 | { | |||
57 | if (stat->ops) { | |||
58 | StatFree(stat); | |||
59 | } | |||
60 | stat->ops = NULL((void*)0); | |||
61 | } | |||
62 | ||||
63 | ||||
64 | /* | |||
65 | * Data-type dependent implementations for Xgssv and Xgstrf; | |||
66 | * | |||
67 | * These have to included from separate files because of SuperLU include | |||
68 | * structure. | |||
69 | */ | |||
70 | ||||
71 | static PyObject *Py_gssv(PyObject * self, PyObject * args, | |||
72 | PyObject * kwdict) | |||
73 | { | |||
74 | volatile PyObject *Py_B = NULL((void*)0); | |||
75 | volatile PyArrayObject *Py_X = NULL((void*)0); | |||
76 | volatile PyArrayObject *nzvals = NULL((void*)0); | |||
77 | volatile PyArrayObject *colind = NULL((void*)0), *rowptr = NULL((void*)0); | |||
78 | volatile int N, nnz; | |||
79 | volatile int info; | |||
80 | volatile int csc = 0; | |||
81 | volatile int *perm_r = NULL((void*)0), *perm_c = NULL((void*)0); | |||
82 | volatile SuperMatrix A = { 0 }, B = { 0 }, L = { 0 }, U = { 0 }; | |||
83 | volatile superlu_options_t options = { 0 }; | |||
84 | volatile SuperLUStat_t stat = { 0 }; | |||
85 | volatile PyObject *option_dict = NULL((void*)0); | |||
86 | volatile int type; | |||
87 | volatile jmp_buf *jmpbuf_ptr; | |||
88 | SLU_BEGIN_THREADS_DEFvolatile PyThreadState *_save = ((void*)0); | |||
89 | ||||
90 | static char *kwlist[] = { | |||
91 | "N", "nnz", "nzvals", "colind", "rowptr", "B", "csc", | |||
92 | "options", NULL((void*)0) | |||
93 | }; | |||
94 | ||||
95 | /* Get input arguments */ | |||
96 | if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO!O!O!O|iO", kwlist, | |||
97 | &N, &nnz, &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), &nzvals, | |||
98 | &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), &colind, &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), | |||
99 | &rowptr, &Py_B, &csc, &option_dict)) { | |||
100 | return NULL((void*)0); | |||
101 | } | |||
102 | ||||
103 | if (!_CHECK_INTEGER(colind)((((PyArray_TYPE((PyArrayObject*)colind)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject*)colind)) <= NPY_ULONGLONG) ) && PyArray_ITEMSIZE((PyArrayObject*)colind) == sizeof (int)) || !_CHECK_INTEGER(rowptr)((((PyArray_TYPE((PyArrayObject*)rowptr)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject*)rowptr)) <= NPY_ULONGLONG) ) && PyArray_ITEMSIZE((PyArrayObject*)rowptr) == sizeof (int))) { | |||
104 | PyErr_SetString(PyExc_TypeError, | |||
105 | "colind and rowptr must be of type cint"); | |||
106 | return NULL((void*)0); | |||
107 | } | |||
108 | ||||
109 | type = PyArray_TYPE((PyArrayObject*)nzvals); | |||
110 | if (!CHECK_SLU_TYPE(type)(type == NPY_FLOAT || type == NPY_DOUBLE || type == NPY_CFLOAT || type == NPY_CDOUBLE)) { | |||
111 | PyErr_SetString(PyExc_TypeError, | |||
112 | "nzvals is not of a type supported by SuperLU"); | |||
113 | return NULL((void*)0); | |||
114 | } | |||
115 | ||||
116 | if (!set_superlu_options_from_dict((superlu_options_t*)&options, 0, | |||
117 | (PyObject*)option_dict, NULL((void*)0), NULL((void*)0))) { | |||
118 | return NULL((void*)0); | |||
119 | } | |||
120 | ||||
121 | /* Create Space for output */ | |||
122 | Py_X = (PyArrayObject*)PyArray_FROMANY((*(PyObject * (*)(PyObject *, PyArray_Descr *, int, int, int, PyObject *)) _scipy_sparse_superlu_ARRAY_API[69])((PyObject* )Py_B, (*(PyArray_Descr * (*)(int)) _scipy_sparse_superlu_ARRAY_API [45])(type), 1, 2, (((0x0002 | 0x0020) & 0x0020) ? (0x0002 | 0x0020) | ((0x0001 | (0x0100 | 0x0400))) : (0x0002 | 0x0020 )), ((void*)0)) | |||
123 | (PyObject*)Py_B, type, 1, 2,(*(PyObject * (*)(PyObject *, PyArray_Descr *, int, int, int, PyObject *)) _scipy_sparse_superlu_ARRAY_API[69])((PyObject* )Py_B, (*(PyArray_Descr * (*)(int)) _scipy_sparse_superlu_ARRAY_API [45])(type), 1, 2, (((0x0002 | 0x0020) & 0x0020) ? (0x0002 | 0x0020) | ((0x0001 | (0x0100 | 0x0400))) : (0x0002 | 0x0020 )), ((void*)0)) | |||
124 | NPY_ARRAY_F_CONTIGUOUS | NPY_ARRAY_ENSURECOPY)(*(PyObject * (*)(PyObject *, PyArray_Descr *, int, int, int, PyObject *)) _scipy_sparse_superlu_ARRAY_API[69])((PyObject* )Py_B, (*(PyArray_Descr * (*)(int)) _scipy_sparse_superlu_ARRAY_API [45])(type), 1, 2, (((0x0002 | 0x0020) & 0x0020) ? (0x0002 | 0x0020) | ((0x0001 | (0x0100 | 0x0400))) : (0x0002 | 0x0020 )), ((void*)0)); | |||
125 | if (Py_X == NULL((void*)0)) | |||
126 | return NULL((void*)0); | |||
127 | ||||
128 | if (PyArray_DIM((PyArrayObject*)Py_X, 0) != N) { | |||
129 | PyErr_SetString(PyExc_ValueError, | |||
130 | "b array has invalid shape"); | |||
131 | Py_DECREF(Py_X)_Py_DECREF(((PyObject*)(Py_X))); | |||
132 | return NULL((void*)0); | |||
133 | } | |||
134 | ||||
135 | if (csc) { | |||
136 | if (NCFormat_from_spMatrix((SuperMatrix*)&A, N, N, nnz, | |||
137 | (PyArrayObject *)nzvals, (PyArrayObject *)colind, | |||
138 | (PyArrayObject *)rowptr, type)) { | |||
139 | Py_DECREF(Py_X)_Py_DECREF(((PyObject*)(Py_X))); | |||
140 | return NULL((void*)0); | |||
141 | } | |||
142 | } | |||
143 | else { | |||
144 | if (NRFormat_from_spMatrix((SuperMatrix*)&A, N, N, nnz, (PyArrayObject *)nzvals, | |||
145 | (PyArrayObject *)colind, (PyArrayObject *)rowptr, | |||
146 | type)) { | |||
147 | Py_DECREF(Py_X)_Py_DECREF(((PyObject*)(Py_X))); | |||
148 | return NULL((void*)0); | |||
149 | } | |||
150 | } | |||
151 | ||||
152 | if (DenseSuper_from_Numeric((SuperMatrix*)&B, (PyObject*)Py_X)) { | |||
153 | Destroy_SuperMatrix_Store((SuperMatrix*)&A); | |||
154 | Py_DECREF(Py_X)_Py_DECREF(((PyObject*)(Py_X))); | |||
155 | return NULL((void*)0); | |||
156 | } | |||
157 | ||||
158 | /* B and Py_X share same data now but Py_X "owns" it */ | |||
159 | ||||
160 | /* Setup options */ | |||
161 | ||||
162 | jmpbuf_ptr = (volatile jmp_buf *)superlu_python_jmpbuf(); | |||
163 | SLU_BEGIN_THREADSdo { if (_save == ((void*)0)) _save = PyEval_SaveThread(); } while (0); | |||
164 | if (setjmp(*(jmp_buf*)jmpbuf_ptr)_setjmp (*(jmp_buf*)jmpbuf_ptr)) { | |||
165 | SLU_END_THREADSdo { if (_save) { PyEval_RestoreThread((PyThreadState*)_save) ; _save = ((void*)0);} } while (0); | |||
166 | goto fail; | |||
167 | } | |||
168 | else { | |||
169 | perm_c = intMalloc(N); | |||
170 | perm_r = intMalloc(N); | |||
171 | StatInit((SuperLUStat_t*)&stat); | |||
172 | ||||
173 | /* Compute direct inverse of sparse Matrix */ | |||
174 | gssv(type, (superlu_options_t*)&options, (SuperMatrix*)&A, (int*)perm_c, (int*)perm_r, | |||
175 | (SuperMatrix*)&L, (SuperMatrix*)&U, (SuperMatrix*)&B, (SuperLUStat_t*)&stat, | |||
176 | (int*)&info); | |||
177 | SLU_END_THREADSdo { if (_save) { PyEval_RestoreThread((PyThreadState*)_save) ; _save = ((void*)0);} } while (0); | |||
178 | } | |||
179 | ||||
180 | SUPERLU_FREE((void*)perm_r)superlu_python_module_free((void*)perm_r); | |||
181 | SUPERLU_FREE((void*)perm_c)superlu_python_module_free((void*)perm_c); | |||
182 | Destroy_SuperMatrix_Store((SuperMatrix*)&A); /* holds just a pointer to the data */ | |||
183 | Destroy_SuperMatrix_Store((SuperMatrix*)&B); | |||
184 | Destroy_SuperNode_Matrix((SuperMatrix*)&L); | |||
185 | Destroy_CompCol_Matrix((SuperMatrix*)&U); | |||
186 | StatFree((SuperLUStat_t*)&stat); | |||
187 | ||||
188 | return Py_BuildValue("Ni", Py_X, info); | |||
189 | ||||
190 | fail: | |||
191 | SUPERLU_FREE((void*)perm_r)superlu_python_module_free((void*)perm_r); | |||
192 | SUPERLU_FREE((void*)perm_c)superlu_python_module_free((void*)perm_c); | |||
193 | XDestroy_SuperMatrix_Store((SuperMatrix*)&A); /* holds just a pointer to the data */ | |||
194 | XDestroy_SuperMatrix_Store((SuperMatrix*)&B); | |||
195 | XDestroy_SuperNode_Matrix((SuperMatrix*)&L); | |||
196 | XDestroy_CompCol_Matrix((SuperMatrix*)&U); | |||
197 | XStatFree((SuperLUStat_t*)&stat); | |||
198 | Py_XDECREF(Py_X)_Py_XDECREF(((PyObject*)(Py_X))); | |||
199 | return NULL((void*)0); | |||
200 | } | |||
201 | ||||
202 | static PyObject *Py_gstrf(PyObject * self, PyObject * args, | |||
203 | PyObject * keywds) | |||
204 | { | |||
205 | /* default value for SuperLU parameters */ | |||
206 | int N, nnz; | |||
207 | PyArrayObject *rowind, *colptr, *nzvals; | |||
208 | SuperMatrix A = { 0 }; | |||
209 | PyObject *result; | |||
210 | PyObject *py_csc_construct_func = NULL((void*)0); | |||
211 | PyObject *option_dict = NULL((void*)0); | |||
212 | int type; | |||
213 | int ilu = 0; | |||
214 | ||||
215 | static char *kwlist[] = { "N", "nnz", "nzvals", "colind", "rowptr", | |||
216 | "csc_construct_func", "options", "ilu", | |||
217 | NULL((void*)0) | |||
218 | }; | |||
219 | ||||
220 | int res = | |||
221 | PyArg_ParseTupleAndKeywords(args, keywds, "iiO!O!O!O|Oi", kwlist, | |||
222 | &N, &nnz, | |||
223 | &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), &nzvals, | |||
224 | &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), &rowind, | |||
225 | &PyArray_Type(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API[2]), &colptr, | |||
226 | &py_csc_construct_func, | |||
227 | &option_dict, | |||
228 | &ilu); | |||
229 | ||||
230 | if (!res) | |||
231 | return NULL((void*)0); | |||
232 | ||||
233 | if (!_CHECK_INTEGER(colptr)((((PyArray_TYPE((PyArrayObject*)colptr)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject*)colptr)) <= NPY_ULONGLONG) ) && PyArray_ITEMSIZE((PyArrayObject*)colptr) == sizeof (int)) || !_CHECK_INTEGER(rowind)((((PyArray_TYPE((PyArrayObject*)rowind)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject*)rowind)) <= NPY_ULONGLONG) ) && PyArray_ITEMSIZE((PyArrayObject*)rowind) == sizeof (int))) { | |||
234 | PyErr_SetString(PyExc_TypeError, | |||
235 | "rowind and colptr must be of type cint"); | |||
236 | return NULL((void*)0); | |||
237 | } | |||
238 | ||||
239 | type = PyArray_TYPE((PyArrayObject*)nzvals); | |||
240 | if (!CHECK_SLU_TYPE(type)(type == NPY_FLOAT || type == NPY_DOUBLE || type == NPY_CFLOAT || type == NPY_CDOUBLE)) { | |||
241 | PyErr_SetString(PyExc_TypeError, | |||
242 | "nzvals is not of a type supported by SuperLU"); | |||
243 | return NULL((void*)0); | |||
244 | } | |||
245 | ||||
246 | if (NCFormat_from_spMatrix(&A, N, N, nnz, nzvals, rowind, colptr, | |||
247 | type)) { | |||
248 | goto fail; | |||
249 | } | |||
250 | ||||
251 | result = newSuperLUObject(&A, option_dict, type, ilu, py_csc_construct_func); | |||
252 | if (result == NULL((void*)0)) { | |||
253 | goto fail; | |||
254 | } | |||
255 | ||||
256 | /* arrays of input matrix will not be freed */ | |||
257 | Destroy_SuperMatrix_Store(&A); | |||
258 | return result; | |||
259 | ||||
260 | fail: | |||
261 | /* arrays of input matrix will not be freed */ | |||
262 | XDestroy_SuperMatrix_Store(&A); | |||
263 | return NULL((void*)0); | |||
264 | } | |||
265 | ||||
266 | static char gssv_doc[] = | |||
267 | "Direct inversion of sparse matrix.\n\nX = gssv(A,B) solves A*X = B for X."; | |||
268 | ||||
269 | static char gstrf_doc[] = "gstrf(A, ...)\n\ | |||
270 | \n\ | |||
271 | performs a factorization of the sparse matrix A=*(N,nnz,nzvals,rowind,colptr) and \n\ | |||
272 | returns a factored_lu object.\n\ | |||
273 | \n\ | |||
274 | arguments\n\ | |||
275 | ---------\n\ | |||
276 | \n\ | |||
277 | Matrix to be factorized is represented as N,nnz,nzvals,rowind,colptr\n\ | |||
278 | as separate arguments. This is compressed sparse column representation.\n\ | |||
279 | \n\ | |||
280 | N number of rows and columns \n\ | |||
281 | nnz number of non-zero elements\n\ | |||
282 | nzvals non-zero values \n\ | |||
283 | rowind row-index for this column (same size as nzvals)\n\ | |||
284 | colptr index into rowind for first non-zero value in this column\n\ | |||
285 | size is (N+1). Last value should be nnz. \n\ | |||
286 | \n\ | |||
287 | additional keyword arguments:\n\ | |||
288 | -----------------------------\n\ | |||
289 | options specifies additional options for SuperLU\n\ | |||
290 | (same keys and values as in superlu_options_t C structure,\n\ | |||
291 | and additionally 'Relax' and 'PanelSize')\n\ | |||
292 | \n\ | |||
293 | ilu whether to perform an incomplete LU decomposition\n\ | |||
294 | (default: false)\n\ | |||
295 | "; | |||
296 | ||||
297 | ||||
298 | /* | |||
299 | * Main SuperLU module | |||
300 | */ | |||
301 | ||||
302 | static PyMethodDef SuperLU_Methods[] = { | |||
303 | {"gssv", (PyCFunction) Py_gssv, METH_VARARGS0x0001 | METH_KEYWORDS0x0002, | |||
304 | gssv_doc}, | |||
305 | {"gstrf", (PyCFunction) Py_gstrf, METH_VARARGS0x0001 | METH_KEYWORDS0x0002, | |||
306 | gstrf_doc}, | |||
307 | {NULL((void*)0), NULL((void*)0)} | |||
308 | }; | |||
309 | ||||
310 | static struct PyModuleDef moduledef = { | |||
311 | PyModuleDef_HEAD_INIT{ { 1, ((void*)0) }, ((void*)0), 0, ((void*)0), }, | |||
312 | "_superlu", | |||
313 | NULL((void*)0), | |||
314 | -1, | |||
315 | SuperLU_Methods, | |||
316 | NULL((void*)0), | |||
317 | NULL((void*)0), | |||
318 | NULL((void*)0), | |||
319 | NULL((void*)0) | |||
320 | }; | |||
321 | ||||
322 | PyObject *PyInit__superlu(void) | |||
323 | { | |||
324 | PyObject *m, *d; | |||
325 | ||||
326 | import_array(){if (_import_array() < 0) {PyErr_Print(); PyErr_SetString( PyExc_ImportError, "numpy.core.multiarray failed to import"); return ((void*)0); } }; | |||
| ||||
327 | ||||
328 | if (PyType_Ready(&SuperLUType) < 0) { | |||
329 | return NULL((void*)0); | |||
330 | } | |||
331 | ||||
332 | if (PyType_Ready(&SuperLUGlobalType) < 0) { | |||
333 | return NULL((void*)0); | |||
334 | } | |||
335 | ||||
336 | m = PyModule_Create(&moduledef)PyModule_Create2(&moduledef, 1013); | |||
| ||||
337 | d = PyModule_GetDict(m); | |||
338 | ||||
339 | Py_INCREF(&PyArrayFlags_Type)_Py_INCREF(((PyObject*)(&(*(PyTypeObject *)_scipy_sparse_superlu_ARRAY_API [4])))); | |||
340 | PyDict_SetItemString(d, "SuperLU", | |||
341 | (PyObject *) &SuperLUType); | |||
342 | ||||
343 | if (PyErr_Occurred()) | |||
344 | Py_FatalError("can't initialize module _superlu"); | |||
345 | ||||
346 | return m; | |||
347 | } |
1 | #ifndef PyModule_Create2 |
2 | struct _object; |
3 | typedef struct _object PyObject; |
4 | PyObject* clang_analyzer_PyObject_New_Reference(); |
5 | PyObject* PyModule_Create2(PyModuleDef *def, int module_api_version) { |
6 | return clang_analyzer_PyObject_New_Reference(); |
7 | } |
8 | #else |
9 | #warning "API PyModule_Create2 is defined as a macro." |
10 | #endif |