diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a96a81 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/scipy-1.3.1.tar.gz diff --git a/.rh-python38-scipy.metadata b/.rh-python38-scipy.metadata new file mode 100644 index 0000000..3337b48 --- /dev/null +++ b/.rh-python38-scipy.metadata @@ -0,0 +1 @@ +3c079c09ecb614d8056135edd1cc6da51d18df0a SOURCES/scipy-1.3.1.tar.gz diff --git a/SOURCES/acceptable_failure_rate.patch b/SOURCES/acceptable_failure_rate.patch new file mode 100644 index 0000000..a476409 --- /dev/null +++ b/SOURCES/acceptable_failure_rate.patch @@ -0,0 +1,28 @@ +diff --git a/scipy/conftest.py b/scipy/conftest.py +index e5fac23..1a971e8 100644 +--- a/scipy/conftest.py ++++ b/scipy/conftest.py +@@ -3,6 +3,7 @@ from __future__ import division, absolute_import, print_function + + import os + import pytest ++import _pytest + import warnings + + from distutils.version import LooseVersion +@@ -37,3 +38,15 @@ def check_fpu_mode(request): + warnings.warn("FPU mode changed from {0:#x} to {1:#x} during " + "the test".format(old_mode, new_mode), + category=FPUModeChangeWarning, stacklevel=0) ++ ++ ++ACCEPTABLE_FAILURE_RATE = int(os.environ.get('ACCEPTABLE_FAILURE_RATE', 0)) ++ ++ ++@pytest.hookimpl() ++def pytest_sessionfinish(session, exitstatus): ++ if exitstatus != _pytest.main.EXIT_TESTSFAILED: ++ return ++ failure_rate = (100.0 * session.testsfailed) / session.testscollected ++ if failure_rate <= ACCEPTABLE_FAILURE_RATE: ++ session.exitstatus = 0 diff --git a/SOURCES/ckdtree_bugfix.patch b/SOURCES/ckdtree_bugfix.patch new file mode 100644 index 0000000..071bf07 --- /dev/null +++ b/SOURCES/ckdtree_bugfix.patch @@ -0,0 +1,140 @@ +From d945dfa4063c5cd7169acd117c15f23ba68027ed Mon Sep 17 00:00:00 2001 +From: Pauli Virtanen +Date: Wed, 31 Jul 2019 23:31:22 +0300 +Subject: [PATCH 1/2] BUG: spatial: use c++11 construct for getting start of + vector + +gcc 9.1.1 on Fedora throws asserts and crashes at runtime on +`&x.front()` when `x` is empty, so use a different construct for getting +the beginning of the data block. +--- + scipy/spatial/ckdtree.pyx | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/scipy/spatial/ckdtree.pyx b/scipy/spatial/ckdtree.pyx +index e2eea8c9097..884d49e1d34 100644 +--- a/scipy/spatial/ckdtree.pyx ++++ b/scipy/spatial/ckdtree.pyx +@@ -190,7 +190,7 @@ cdef class coo_entries: + res_dtype = np.dtype(_dtype, align = True) + n = self.buf.size() + if NPY_LIKELY(n > 0): +- pr = &self.buf.front() ++ pr = self.buf.data() + uintptr = ( pr) + dtype = np.dtype(np.uint8) + self.__array_interface__ = dict( +@@ -213,7 +213,7 @@ cdef class coo_entries: + dict res_dict + n = self.buf.size() + if NPY_LIKELY(n > 0): +- pr = &self.buf.front() ++ pr = self.buf.data() + res_dict = dict() + for k in range(n): + i = pr[k].i +@@ -263,7 +263,7 @@ cdef class ordered_pairs: + np.intp_t n + n = self.buf.size() + if NPY_LIKELY(n > 0): +- pr = &self.buf.front() ++ pr = self.buf.data() + uintptr = ( pr) + dtype = np.dtype(np.intp) + self.__array_interface__ = dict( +@@ -284,7 +284,7 @@ cdef class ordered_pairs: + np.intp_t i, n + set results + results = set() +- pair = &self.buf.front() ++ pair = self.buf.data() + n = self.buf.size() + if sizeof(long) < sizeof(np.intp_t): + # Needed for Python 2.x on Win64 +@@ -593,7 +593,7 @@ cdef class cKDTree: + cself = self.cself + # finalize the tree points, this calls _post_init_traverse + +- cself.ctree = &cself.tree_buffer.front() ++ cself.ctree = cself.tree_buffer.data() + + # set the size attribute after tree_buffer is built + cself.size = cself.tree_buffer.size() +@@ -971,7 +971,7 @@ cdef class cKDTree: + m = (vvres[i].size()) + tmp = m * [None] + +- cur = &vvres[i].front() ++ cur = vvres[i].data() + for j in range(m): + tmp[j] = cur[0] + cur += 1 +@@ -1067,7 +1067,7 @@ cdef class cKDTree: + tmp = m * [None] + with nogil: + sort(vvres[i].begin(), vvres[i].end()) +- cur = &vvres[i].front() ++ cur = vvres[i].data() + for j in range(m): + tmp[j] = cur[0] + cur += 1 +@@ -1492,7 +1492,7 @@ cdef class cKDTree: + cdef ckdtree * cself = self.cself + size = cself.tree_buffer.size() * sizeof(ckdtreenode) + +- cdef np.ndarray tree = np.asarray( &cself.tree_buffer.front()) ++ cdef np.ndarray tree = np.asarray( cself.tree_buffer.data()) + + state = (tree.copy(), self.data.copy(), self.n, self.m, self.leafsize, + self.maxes, self.mins, self.indices.copy(), +@@ -1511,7 +1511,7 @@ cdef class cKDTree: + cself.tree_buffer = new vector[ckdtreenode]() + cself.tree_buffer.resize(tree.size // sizeof(ckdtreenode)) + +- mytree = np.asarray( &cself.tree_buffer.front()) ++ mytree = np.asarray( cself.tree_buffer.data()) + + # set raw pointers + self._pre_init() + +From ad0f91438f49bfe277e32d2689aefeb0c11c789f Mon Sep 17 00:00:00 2001 +From: Pauli Virtanen +Date: Wed, 31 Jul 2019 23:41:40 +0300 +Subject: [PATCH 2/2] BLD: spatial: set c++ std flags for ckdtree + +--- + scipy/spatial/setup.py | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/scipy/spatial/setup.py b/scipy/spatial/setup.py +index d7e334876df..19d78593c5e 100644 +--- a/scipy/spatial/setup.py ++++ b/scipy/spatial/setup.py +@@ -4,6 +4,13 @@ + import glob + + ++def pre_build_hook(build_ext, ext): ++ from scipy._build_utils.compiler_helper import get_cxx_std_flag ++ std_flag = get_cxx_std_flag(build_ext._cxx_compiler) ++ if std_flag is not None: ++ ext.extra_compile_args.append(std_flag) ++ ++ + def configuration(parent_package='', top_path=None): + from numpy.distutils.misc_util import Configuration, get_numpy_include_dirs + from numpy.distutils.misc_util import get_info as get_misc_info +@@ -55,10 +62,12 @@ def configuration(parent_package='', top_path=None): + ckdtree_headers = [join('ckdtree', 'src', x) for x in ckdtree_headers] + + ckdtree_dep = ['ckdtree.cxx'] + ckdtree_headers + ckdtree_src +- config.add_extension('ckdtree', ++ ext = config.add_extension('ckdtree', + sources=['ckdtree.cxx'] + ckdtree_src, + depends=ckdtree_dep, + include_dirs=inc_dirs + [join('ckdtree', 'src')]) ++ ext._pre_build_hook = pre_build_hook ++ + # _distance_wrap + config.add_extension('_distance_wrap', + sources=[join('src', 'distance_wrap.c')], diff --git a/SOURCES/numpy-deprecation-warnings.patch b/SOURCES/numpy-deprecation-warnings.patch new file mode 100644 index 0000000..5099879 --- /dev/null +++ b/SOURCES/numpy-deprecation-warnings.patch @@ -0,0 +1,589 @@ +diff -ru scipy-1.2.1/scipy/odr/__odrpack.c scipy-1.2.1_patched/scipy/odr/__odrpack.c +--- scipy-1.2.1/scipy/odr/__odrpack.c 2019-01-28 04:57:51.000000000 +0100 ++++ scipy-1.2.1_patched/scipy/odr/__odrpack.c 2019-06-06 16:11:32.947892754 +0200 +@@ -9,6 +9,8 @@ + * + */ + ++#define PY_SSIZE_T_CLEAN ++#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION + #include "odrpack.h" + + +@@ -44,7 +46,7 @@ + double *fjacb, double *fjacd, int *istop) + { + PyObject *arg01, *arglist; +- PyObject *result; ++ PyObject *result = NULL; + PyArrayObject *result_array = NULL; + PyArrayObject *pyXplusD; + void *beta_dst; +@@ -57,14 +59,14 @@ + dim2[0] = *m; + dim2[1] = *n; + pyXplusD = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_DOUBLE); +- memcpy(pyXplusD->data, (void *)xplusd, (*m) * (*n) * sizeof(double)); ++ memcpy(PyArray_DATA(pyXplusD), (void *)xplusd, (*m) * (*n) * sizeof(double)); + } + else + { + npy_intp dim1[1]; + dim1[0] = *n; + pyXplusD = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- memcpy(pyXplusD->data, (void *)xplusd, (*n) * sizeof(double)); ++ memcpy(PyArray_DATA(pyXplusD), (void *)xplusd, (*n) * sizeof(double)); + } + + PyTuple_SetItem(arg01, 0, odr_global.pyBeta); +@@ -84,7 +86,7 @@ + Py_DECREF(arg01); + *istop = 0; + +- beta_dst = ((PyArrayObject *) (odr_global.pyBeta))->data; ++ beta_dst = (PyArray_DATA((PyArrayObject *) odr_global.pyBeta)); + if (beta != beta_dst) { + memcpy(beta_dst, (void *)beta, (*np) * sizeof(double)); + } +@@ -121,7 +123,7 @@ + "Result from function call is not a proper array of floats."); + } + +- memcpy((void *)f, result_array->data, (*n) * (*nq) * sizeof(double)); ++ memcpy((void *)f, PyArray_DATA(result_array), (*n) * (*nq) * sizeof(double)); + Py_DECREF(result_array); + } + +@@ -161,7 +163,7 @@ + { + /* result_array should be rank-3 */ + +- if (result_array->nd != 3) ++ if (PyArray_NDIM(result_array) != 3) + { + Py_DECREF(result_array); + PYERR2(odr_error, "Beta Jacobian is not rank-3"); +@@ -171,14 +173,14 @@ + { + /* result_array should be rank-2 */ + +- if (result_array->nd != 2) ++ if (PyArray_NDIM(result_array) != 2) + { + Py_DECREF(result_array); + PYERR2(odr_error, "Beta Jacobian is not rank-2"); + } + } + +- memcpy((void *)fjacb, result_array->data, ++ memcpy((void *)fjacb, PyArray_DATA(result_array), + (*n) * (*nq) * (*np) * sizeof(double)); + Py_DECREF(result_array); + +@@ -220,7 +222,7 @@ + { + /* result_array should be rank-3 */ + +- if (result_array->nd != 3) ++ if (PyArray_NDIM(result_array) != 3) + { + Py_DECREF(result_array); + PYERR2(odr_error, "xplusd Jacobian is not rank-3"); +@@ -230,7 +232,7 @@ + { + /* result_array should be rank-2 */ + +- if (result_array->nd != 2) ++ if (PyArray_NDIM(result_array) != 2) + { + Py_DECREF(result_array); + PYERR2(odr_error, "xplusd Jacobian is not rank-2"); +@@ -240,14 +242,14 @@ + { + /* result_array should be rank-1 */ + +- if (result_array->nd != 1) ++ if (PyArray_NDIM(result_array) != 1) + { + Py_DECREF(result_array); + PYERR2(odr_error, "xplusd Jacobian is not rank-1"); + } + } + +- memcpy((void *)fjacd, result_array->data, ++ memcpy((void *)fjacd, PyArray_DATA(result_array), + (*n) * (*nq) * (*m) * sizeof(double)); + Py_DECREF(result_array); + } +@@ -291,7 +293,7 @@ + return NULL; + } + +- lwkmn = work->dimensions[0]; ++ lwkmn = PyArray_DIMS(work)[0]; + + F_FUNC(dwinf,DWINF)(&n, &m, &np, &nq, &ldwe, &ld2we, &isodr, + &delta, &eps, &xplus, &fn, &sd, &vcv, &rvar, &wss, &wssde, +@@ -352,15 +354,15 @@ + wrk6--; + wrk7--; + +- dim1[0] = beta->dimensions[0]; ++ dim1[0] = PyArray_DIMS(beta)[0]; + sd_beta = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- dim2[0] = beta->dimensions[0]; +- dim2[1] = beta->dimensions[0]; ++ dim2[0] = PyArray_DIMS(beta)[0]; ++ dim2[1] = PyArray_DIMS(beta)[0]; + cov_beta = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_DOUBLE); + +- memcpy(sd_beta->data, (void *)((double *)(work->data) + sd), ++ memcpy(PyArray_DATA(sd_beta), (void *)((double *)(PyArray_DATA(work)) + sd), + np * sizeof(double)); +- memcpy(cov_beta->data, (void *)((double *)(work->data) + vcv), ++ memcpy(PyArray_DATA(cov_beta), (void *)((double *)(PyArray_DATA(work)) + vcv), + np * np * sizeof(double)); + + if (!full_output) +@@ -427,21 +429,21 @@ + fnA = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_DOUBLE); + } + +- memcpy(deltaA->data, (void *)((double *)(work->data) + delta), ++ memcpy(PyArray_DATA(deltaA), (void *)((double *)(PyArray_DATA(work)) + delta), + m * n * sizeof(double)); +- memcpy(epsA->data, (void *)((double *)(work->data) + eps), ++ memcpy(PyArray_DATA(epsA), (void *)((double *)(PyArray_DATA(work)) + eps), + nq * n * sizeof(double)); +- memcpy(xplusA->data, (void *)((double *)(work->data) + xplus), ++ memcpy(PyArray_DATA(xplusA), (void *)((double *)(PyArray_DATA(work)) + xplus), + m * n * sizeof(double)); +- memcpy(fnA->data, (void *)((double *)(work->data) + fn), ++ memcpy(PyArray_DATA(fnA), (void *)((double *)(PyArray_DATA(work)) + fn), + nq * n * sizeof(double)); + +- res_var = *((double *)(work->data) + rvar); +- sum_square = *((double *)(work->data) + wss); +- sum_square_delta = *((double *)(work->data) + wssde); +- sum_square_eps = *((double *)(work->data) + wssep); +- inv_condnum = *((double *)(work->data) + rcond); +- rel_error = *((double *)(work->data) + eta); ++ res_var = *((double *)(PyArray_DATA(work)) + rvar); ++ sum_square = *((double *)(PyArray_DATA(work)) + wss); ++ sum_square_delta = *((double *)(PyArray_DATA(work)) + wssde); ++ sum_square_eps = *((double *)(PyArray_DATA(work)) + wssep); ++ inv_condnum = *((double *)(PyArray_DATA(work)) + rcond); ++ rel_error = *((double *)(PyArray_DATA(work)) + eta); + + retobj = + Py_BuildValue +@@ -623,7 +625,7 @@ + PYERR(PyExc_ValueError, + "y could not be made into a suitable array"); + } +- n = y->dimensions[y->nd - 1]; /* pick the last dimension */ ++ n = PyArray_DIMS(y)[PyArray_NDIM(y) - 1]; /* pick the last dimension */ + if ((x = + (PyArrayObject *) PyArray_CopyFromObject(px, NPY_DOUBLE, 1, + 2)) == NULL) +@@ -631,18 +633,18 @@ + PYERR(PyExc_ValueError, + "x could not be made into a suitable array"); + } +- if (n != x->dimensions[x->nd - 1]) ++ if (n != PyArray_DIMS(x)[PyArray_NDIM(x) - 1]) + { + PYERR(PyExc_ValueError, + "x and y don't have matching numbers of observations"); + } +- if (y->nd == 1) ++ if (PyArray_NDIM(y) == 1) + { + nq = 1; + } + else + { +- nq = y->dimensions[0]; ++ nq = PyArray_DIMS(y)[0]; + } + + ldx = ldy = n; +@@ -664,17 +666,17 @@ + "x could not be made into a suitable array"); + } + +- n = x->dimensions[x->nd - 1]; ++ n = PyArray_DIMS(x)[PyArray_NDIM(x) - 1]; + ldx = n; + } + +- if (x->nd == 1) ++ if (PyArray_NDIM(x) == 1) + { + m = 1; + } + else + { +- m = x->dimensions[0]; ++ m = PyArray_DIMS(x)[0]; + } /* x, y */ + + if ((beta = +@@ -684,14 +686,14 @@ + PYERR(PyExc_ValueError, + "initbeta could not be made into a suitable array"); + } +- np = beta->dimensions[0]; ++ np = PyArray_DIMS(beta)[0]; + + if (pwe == NULL) + { + ldwe = ld2we = 1; + dim1[0] = n; + we = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- ((double *)(we->data))[0] = -1.0; ++ ((double *)(PyArray_DATA(we)))[0] = -1.0; + } + else if (PyNumber_Check(pwe) && !PyArray_Check(pwe)) + { +@@ -711,11 +713,11 @@ + we = (PyArrayObject *) PyArray_SimpleNew(3, dim3, NPY_DOUBLE); + if (implicit) + { +- ((double *)(we->data))[0] = val; ++ ((double *)(PyArray_DATA(we)))[0] = val; + } + else + { +- ((double *)(we->data))[0] = -val; ++ ((double *)(PyArray_DATA(we)))[0] = -val; + } + ldwe = ld2we = 1; + } +@@ -730,29 +732,29 @@ + PYERR(PyExc_ValueError, "could not convert we to a suitable array"); + } + +- if (we->nd == 1 && nq == 1) ++ if (PyArray_NDIM(we) == 1 && nq == 1) + { + + ldwe = n; + ld2we = 1; + } +- else if (we->nd == 1 && we->dimensions[0] == nq) ++ else if (PyArray_NDIM(we) == 1 && PyArray_DIMS(we)[0] == nq) + { + /* we is a rank-1 array with diagonal weightings to be broadcast + * to all observations */ + ldwe = 1; + ld2we = 1; + } +- else if (we->nd == 3 && we->dimensions[0] == nq +- && we->dimensions[1] == nq && we->dimensions[2] == 1) ++ else if (PyArray_NDIM(we) == 3 && PyArray_DIMS(we)[0] == nq ++ && PyArray_DIMS(we)[1] == nq && PyArray_DIMS(we)[2] == 1) + { + /* we is a rank-3 array with the covariant weightings + to be broadcast to all observations */ + ldwe = 1; + ld2we = nq; + } +- else if (we->nd == 2 && we->dimensions[0] == nq +- && we->dimensions[1] == nq) ++ else if (PyArray_NDIM(we) == 2 && PyArray_DIMS(we)[0] == nq ++ && PyArray_DIMS(we)[1] == nq) + { + /* we is a rank-2 array with the full covariant weightings + to be broadcast to all observations */ +@@ -760,16 +762,16 @@ + ld2we = nq; + } + +- else if (we->nd == 2 && we->dimensions[0] == nq +- && we->dimensions[1] == n) ++ else if (PyArray_NDIM(we) == 2 && PyArray_DIMS(we)[0] == nq ++ && PyArray_DIMS(we)[1] == n) + { + /* we is a rank-2 array with the diagonal elements of the + covariant weightings for each observation */ + ldwe = n; + ld2we = 1; + } +- else if (we->nd == 3 && we->dimensions[0] == nq +- && we->dimensions[1] == nq && we->dimensions[2] == n) ++ else if (PyArray_NDIM(we) == 3 && PyArray_DIMS(we)[0] == nq ++ && PyArray_DIMS(we)[1] == nq && PyArray_DIMS(we)[2] == n) + { + /* we is the full specification of the covariant weights + for each observation */ +@@ -788,7 +790,7 @@ + + dim1[0] = m; + wd = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- ((double *)(wd->data))[0] = -1.0; ++ ((double *)(PyArray_DATA(wd)))[0] = -1.0; + } + else if (PyNumber_Check(pwd) && !PyArray_Check(pwd)) + { +@@ -806,7 +808,7 @@ + dim3[1] = 1; + dim3[2] = m; + wd = (PyArrayObject *) PyArray_SimpleNew(3, dim3, NPY_DOUBLE); +- ((double *)(wd->data))[0] = -val; ++ ((double *)(PyArray_DATA(wd)))[0] = -val; + ldwd = ld2wd = 1; + } + else if (PySequence_Check(pwd)) +@@ -820,12 +822,12 @@ + PYERR(PyExc_ValueError, "could not convert wd to a suitable array"); + } + +- if (wd->nd == 1 && m == 1) ++ if (PyArray_NDIM(wd) == 1 && m == 1) + { + ldwd = n; + ld2wd = 1; + } +- else if (wd->nd == 1 && wd->dimensions[0] == m) ++ else if (PyArray_NDIM(wd) == 1 && PyArray_DIMS(wd)[0] == m) + { + /* wd is a rank-1 array with diagonal weightings to be broadcast + * to all observations */ +@@ -833,16 +835,16 @@ + ld2wd = 1; + } + +- else if (wd->nd == 3 && wd->dimensions[0] == m +- && wd->dimensions[1] == m && wd->dimensions[2] == 1) ++ else if (PyArray_NDIM(wd) == 3 && PyArray_DIMS(wd)[0] == m ++ && PyArray_DIMS(wd)[1] == m && PyArray_DIMS(wd)[2] == 1) + { + /* wd is a rank-3 array with the covariant wdightings + to be broadcast to all observations */ + ldwd = 1; + ld2wd = m; + } +- else if (wd->nd == 2 && wd->dimensions[0] == m +- && wd->dimensions[1] == m) ++ else if (PyArray_NDIM(wd) == 2 && PyArray_DIMS(wd)[0] == m ++ && PyArray_DIMS(wd)[1] == m) + { + /* wd is a rank-2 array with the full covariant weightings + to be broadcast to all observations */ +@@ -850,16 +852,16 @@ + ld2wd = m; + } + +- else if (wd->nd == 2 && wd->dimensions[0] == m +- && wd->dimensions[1] == n) ++ else if (PyArray_NDIM(wd) == 2 && PyArray_DIMS(wd)[0] == m ++ && PyArray_DIMS(wd)[1] == n) + { + /* wd is a rank-2 array with the diagonal elements of the + covariant weightings for each observation */ + ldwd = n; + ld2wd = 1; + } +- else if (wd->nd == 3 && wd->dimensions[0] == m +- && wd->dimensions[1] == m && wd->dimensions[2] == n) ++ else if (PyArray_NDIM(wd) == 3 && PyArray_DIMS(wd)[0] == m ++ && PyArray_DIMS(wd)[1] == m && PyArray_DIMS(wd)[2] == n) + { + /* wd is the full specification of the covariant weights + for each observation */ +@@ -878,7 +880,7 @@ + { + dim1[0] = np; + ifixb = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_INT); +- *(int *)(ifixb->data) = -1; /* set first element negative */ ++ *(int *)(PyArray_DATA(ifixb)) = -1; /* set first element negative */ + } + else + { +@@ -892,7 +894,7 @@ + "could not convert ifixb to a suitable array"); + } + +- if (ifixb->dimensions[0] != np) ++ if (PyArray_DIMS(ifixb)[0] != np) + { + PYERR(PyExc_ValueError, + "could not convert ifixb to a suitable array"); +@@ -904,7 +906,7 @@ + dim2[0] = m; + dim2[1] = 1; + ifixx = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_INT); +- *(int *)(ifixx->data) = -1; /* set first element negative */ ++ *(int *)(PyArray_DATA(ifixx)) = -1; /* set first element negative */ + ldifx = 1; + } + else +@@ -919,16 +921,16 @@ + "could not convert ifixx to a suitable array"); + } + +- if (ifixx->nd == 1 && ifixx->dimensions[0] == m) ++ if (PyArray_NDIM(ifixx) == 1 && PyArray_DIMS(ifixx)[0] == m) + { + ldifx = 1; + } +- else if (ifixx->nd == 1 && ifixx->dimensions[0] == n && m == 1) ++ else if (PyArray_NDIM(ifixx) == 1 && PyArray_DIMS(ifixx)[0] == n && m == 1) + { + ldifx = n; + } +- else if (ifixx->nd == 2 && ifixx->dimensions[0] == m +- && ifixx->dimensions[1] == n) ++ else if (PyArray_NDIM(ifixx) == 2 && PyArray_DIMS(ifixx)[0] == m ++ && PyArray_DIMS(ifixx)[1] == n) + { + ldifx = n; + } +@@ -957,14 +959,14 @@ + { + dim1[0] = np; + stpb = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- *(double *)(stpb->data) = 0.0; ++ *(double *)(PyArray_DATA(stpb)) = 0.0; + } + else /* pstpb is a sequence */ + { + if ((stpb = + (PyArrayObject *) PyArray_CopyFromObject(pstpb, NPY_DOUBLE, 1, + 1)) == NULL +- || stpb->dimensions[0] != np) ++ || PyArray_DIMS(stpb)[0] != np) + { + PYERR(PyExc_ValueError, + "could not convert stpb to a suitable array"); +@@ -976,7 +978,7 @@ + dim2[0] = 1; + dim2[1] = m; + stpd = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_DOUBLE); +- *(double *)(stpd->data) = 0.0; ++ *(double *)(PyArray_DATA(stpd)) = 0.0; + ldstpd = 1; + } + else +@@ -989,16 +991,16 @@ + "could not convert stpb to a suitable array"); + } + +- if (stpd->nd == 1 && stpd->dimensions[0] == m) ++ if (PyArray_NDIM(stpd) == 1 && PyArray_DIMS(stpd)[0] == m) + { + ldstpd = 1; + } +- else if (stpd->nd == 1 && stpd->dimensions[0] == n && m == 1) ++ else if (PyArray_NDIM(stpd) == 1 && PyArray_DIMS(stpd)[0] == n && m == 1) + { + ldstpd = n; + } +- else if (stpd->nd == 2 && stpd->dimensions[0] == n && +- stpd->dimensions[1] == m) ++ else if (PyArray_NDIM(stpd) == 2 && PyArray_DIMS(stpd)[0] == n && ++ PyArray_DIMS(stpd)[1] == m) + { + ldstpd = n; + } +@@ -1008,14 +1010,14 @@ + { + dim1[0] = np; + sclb = (PyArrayObject *) PyArray_SimpleNew(1, dim1, NPY_DOUBLE); +- *(double *)(sclb->data) = 0.0; ++ *(double *)(PyArray_DATA(sclb)) = 0.0; + } + else /* psclb is a sequence */ + { + if ((sclb = + (PyArrayObject *) PyArray_CopyFromObject(psclb, NPY_DOUBLE, 1, + 1)) == NULL +- || sclb->dimensions[0] != np) ++ || PyArray_DIMS(sclb)[0] != np) + { + PYERR(PyExc_ValueError, + "could not convert sclb to a suitable array"); +@@ -1027,7 +1029,7 @@ + dim2[0] = 1; + dim2[1] = n; + scld = (PyArrayObject *) PyArray_SimpleNew(2, dim2, NPY_DOUBLE); +- *(double *)(scld->data) = 0.0; ++ *(double *)(PyArray_DATA(scld)) = 0.0; + ldscld = 1; + } + else +@@ -1040,16 +1042,16 @@ + "could not convert stpb to a suitable array"); + } + +- if (scld->nd == 1 && scld->dimensions[0] == m) ++ if (PyArray_NDIM(scld) == 1 && PyArray_DIMS(scld)[0] == m) + { + ldscld = 1; + } +- else if (scld->nd == 1 && scld->dimensions[0] == n && m == 1) ++ else if (PyArray_NDIM(scld) == 1 && PyArray_DIMS(scld)[0] == n && m == 1) + { + ldscld = n; + } +- else if (scld->nd == 2 && scld->dimensions[0] == n && +- scld->dimensions[1] == m) ++ else if (PyArray_NDIM(scld) == 2 && PyArray_DIMS(scld)[0] == n && ++ PyArray_DIMS(scld)[1] == m) + { + ldscld = n; + } +@@ -1110,9 +1112,9 @@ + PYERR(PyExc_ValueError, + "could not convert work to a suitable array"); + } +- if (work->dimensions[0] < lwork) ++ if (PyArray_DIMS(work)[0] < lwork) + { +- printf("%d %d\n", work->dimensions[0], lwork); ++ printf("%ld %d\n", PyArray_DIMS(work)[0], lwork); + PYERR(PyExc_ValueError, "work is too small"); + } + } +@@ -1133,7 +1135,7 @@ + "could not convert iwork to a suitable array"); + } + +- if (iwork->dimensions[0] < liwork) ++ if (PyArray_DIMS(iwork)[0] < liwork) + { + PYERR(PyExc_ValueError, "iwork is too small"); + } +@@ -1170,19 +1172,18 @@ + Py_INCREF(beta); + odr_global.extra_args = extra_args; + Py_XINCREF(extra_args); +- +- /* now call DODRC */ +- F_FUNC(dodrc,DODRC)(fcn_callback, &n, &m, &np, &nq, (double *)(beta->data), +- (double *)(y->data), &ldy, (double *)(x->data), &ldx, +- (double *)(we->data), &ldwe, &ld2we, +- (double *)(wd->data), &ldwd, &ld2wd, +- (int *)(ifixb->data), (int *)(ifixx->data), &ldifx, +- &job, &ndigit, &taufac, &sstol, &partol, &maxit, +- &iprint, &lunerr, &lunrpt, +- (double *)(stpb->data), (double *)(stpd->data), &ldstpd, +- (double *)(sclb->data), (double *)(scld->data), &ldscld, +- (double *)(work->data), &lwork, (int *)(iwork->data), &liwork, +- &info); ++ /* now call DODRC */ ++ F_FUNC(dodrc,DODRC)(fcn_callback, &n, &m, &np, &nq, (double *)(PyArray_DATA(beta)), ++ (double *)(PyArray_DATA(y)), &ldy, (double *)(PyArray_DATA(x)), &ldx, ++ (double *)(PyArray_DATA(we)), &ldwe, &ld2we, ++ (double *)(PyArray_DATA(wd)), &ldwd, &ld2wd, ++ (int *)(PyArray_DATA(ifixb)), (int *)(PyArray_DATA(ifixx)), &ldifx, ++ &job, &ndigit, &taufac, &sstol, &partol, &maxit, ++ &iprint, &lunerr, &lunrpt, ++ (double *)(PyArray_DATA(stpb)), (double *)(PyArray_DATA(stpd)), &ldstpd, ++ (double *)(PyArray_DATA(sclb)), (double *)(PyArray_DATA(scld)), &ldscld, ++ (double *)(PyArray_DATA(work)), &lwork, (int *)(PyArray_DATA(iwork)), &liwork, ++ &info); + + result = gen_output(n, m, np, nq, ldwe, ld2we, + beta, work, iwork, isodr, info, full_output); diff --git a/SPECS/scipy.spec b/SPECS/scipy.spec new file mode 100644 index 0000000..b5c6c7a --- /dev/null +++ b/SPECS/scipy.spec @@ -0,0 +1,636 @@ +%{?scl:%scl_package scipy} +%{!?scl:%global pkg_name %{name}} +%global python3_pkgversion %{nil} + +# without means enabled +# SCL: Tests permanently disabled due to missing dependencies +%bcond_with doc + +# SCL: Tests permanently disabled due to missing dependencies +%bcond_with tests + +# Set to pre-release version suffix if building pre-release, else %%{nil} +%global rcver %{nil} + +Summary: Scientific Tools for Python +Name: %{?scl_prefix}scipy +Version: 1.3.1 +Release: 5%{?dist} + +# BSD -- whole package except: +# Boost -- scipy/special/cephes/scipy_iv.c +# Public Domain -- scipy/odr/__odrpack.c +License: BSD and Boost and Public Domain +Url: http://www.scipy.org/scipylib/index.html +Source0: https://github.com/scipy/scipy/releases/download/v%{version}/scipy-%{version}.tar.gz + +# Previously we ignored the tests results, because they don't always pass +# Instead of ignoring the results entirely, we allow certain failure rate +# https://stackoverflow.com/a/47731333/1839451 +Patch0: acceptable_failure_rate.patch + +# The C API of PyArrayObject has changed in Python 3.8 and the +# structure fields accessed in __odrpack.c are now deprecated. +Patch1: numpy-deprecation-warnings.patch + +# Bugfix of cKDTree +# PR: https://github.com/scipy/scipy/pull/10567 +# Issue: https://github.com/scipy/scipy/issues/11021 +Patch2: ckdtree_bugfix.patch + +%{?scl:Requires: %{scl}-runtime} +%{?scl:BuildRequires: %{scl}-runtime} +BuildRequires: fftw-devel, blas-devel, lapack-devel, suitesparse-devel +%ifarch %{openblas_arches} +BuildRequires: openblas-devel +%else +BuildRequires: atlas-devel +%endif +BuildRequires: gcc-gfortran, swig, gcc-c++ +# BuildRequires: qhull-devel - missing in RHEL7 +# BuildRequires: /usr/bin/pathfix3.8.py - contained in python-devel + +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-devel +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-numpy +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-numpy-f2py +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-setuptools +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-Cython +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-rpm-macros + +%if %{with tests} +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-pytest +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-pytest-xdist +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-pytest-timeout +%endif + +%if %{with doc} +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-sphinx +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-matplotlib +BuildRequires: %{?scl_prefix}python%{python3_pkgversion}-numpydoc +%endif + +%global _description %{expand: +Scipy is open-source software for mathematics, science, and +engineering. The core library is NumPy which provides convenient and +fast N-dimensional array manipulation. The SciPy library is built to +work with NumPy arrays, and provides many user-friendly and efficient +numerical routines such as routines for numerical integration and +optimization. Together, they run on all popular operating systems, are +quick to install, and are free of charge. NumPy and SciPy are easy to +use, but powerful enough to be depended upon by some of the world's +leading scientists and engineers.} + +%description %_description + + +%package -n %{?scl_prefix}python%{python3_pkgversion}-scipy +Summary: Scientific Tools for Python +Requires: %{?scl_prefix}python%{python3_pkgversion}-numpy, %{?scl_prefix}python%{python3_pkgversion}-numpy-f2py + +%description -n %{?scl_prefix}python%{python3_pkgversion}-scipy %_description + + +%if %{with doc} +%package -n %{?scl_prefix}python%{python3_pkgversion}-scipy-doc +Summary: Scientific Tools for Python - documentation +Requires: %{?scl_prefix}python%{python3_pkgversion}-scipy = %{version}-%{release} + +%description -n %{?scl_prefix}python%{python3_pkgversion}-scipy-doc +HTML documentation for Scipy +%endif + + +%prep +%{?scl:scl enable %{scl} - << \EOF} +set -ex +%autosetup -p1 -n %{pkg_name}-%{version}%{?rcver} +cat > site.cfg << EOM + +[amd] +library_dirs = %{?scl:%_root_libdir}%{?!scl:%_libdir} +include_dirs = %{?scl:%_root_includedir}%{?!scl:%_includedir}/suitesparse +amd_libs = amd + +[umfpack] +library_dirs = %{?scl:%_root_libdir}%{?!scl:%_libdir} +include_dirs = %{?scl:%_root_includedir}%{?!scl:%_includedir}/suitesparse +umfpack_libs = umfpack + +%ifarch %{openblas_arches} +[openblas] +libraries = openblasp +library_dirs = %{?scl:%_root_libdir}%{?!scl:%_libdir} +%endif +EOM + +# Docs won't build unless the .dat files are specified here +sed -i 's/metadata = dict(/metadata = dict(package_data={"": ["*.dat"]},/' setup.py + +# remove bundled numpydoc +rm doc/sphinxext -r + +rm $(grep -rl '/\* Generated by Cython') PKG-INFO +%{?scl:EOF} + + +%build +%{?scl:scl enable %{scl} - << \EOF} +set -ex +for PY in %{python3_version}; do + env CFLAGS="$RPM_OPT_FLAGS -lm" \ + FFLAGS="$RPM_OPT_FLAGS -fPIC -cpp" \ + LDFLAGS="$RPM_LD_FLAGS -shared" \ + %ifarch %{openblas_arches} + OPENBLAS=%{?scl:%_root_libdir}%{?!scl:%_libdir} \ + %else + ATLAS=%{?scl:%_root_libdir}%{?!scl:%_libdir}/atlas \ + %endif + FFTW=%{?scl:%_root_libdir}%{?!scl:%_libdir} \ + BLAS=%{?scl:%_root_libdir}%{?!scl:%_libdir} \ + LAPACK=%{?scl:%_root_libdir}%{?!scl:%_libdir} \ + %{_bindir}/python$PY setup.py config_fc \ + --fcompiler=gnu95 --noarch \ + build + + %if %{with doc} + pushd doc + export PYTHONPATH=$(echo ../build/lib.linux-*-$PY/) + make html SPHINXBUILD=sphinx-build-$PY + rm -rf build/html/.buildinfo + mv build build-$PY + popd + %endif +done +%{?scl:EOF} + + +%install +%{?scl:scl enable %{scl} - << \EOF} +set -ex +%py3_install +# Some files got ambiguous python shebangs, we fix them after everything else is done +pathfix3.8.py -pni "%{__python3} %{py3_shbang_opts}" %{buildroot}%{python3_sitearch} +%{?scl:EOF} + + +%if %{with tests} +%check +%{?scl:scl enable %{scl} - << \EOF} +set -ex +# Skip all tests on s390x because they hangs unexpectedly and randomly +# and pytest-timeout has no effect. Note that the outcome of the tests +# was previously ignored anyway so by disabling the test for s390x we +# are not doing anything more dangerous. +%ifarch s390x +exit 0 +%endif + +%ifarch x86_64 +export ACCEPTABLE_FAILURE_RATE=0 +%else +# there are usually 10-21 test failing, so we allow 1% failure rate +export ACCEPTABLE_FAILURE_RATE=1 +%endif + +%ifarch ppc64le +# test_decomp segfaults on ppc64le +export k="not test_denormals and not test_decomp" +%else +# test_denormals tends to stuck +export k="not test_denormals" +%endif + +# Do not create -PYTEST.pyc files +export PYTHONDONTWRITEBYTECODE=1 + +pushd %{buildroot}/%{python3_sitearch} +# TODO TestIQR.test_scale fails on Python 3.8+ due to some warnings, investigate +%{__python3} -m pytest --timeout=300 -k "$k and not (TestIQR and test_scale)" scipy --numprocesses=auto +# Remove test remnants +rm -rf gram{A,B} +popd +%{?scl:EOF} +%endif + + +%files -n %{?scl_prefix}python%{python3_pkgversion}-scipy +%doc LICENSE.txt +%{python3_sitearch}/scipy/ +%{python3_sitearch}/*.egg-info + +%if %{with doc} +%files -n %{?scl_prefix}python%{python3_pkgversion}-scipy-doc +%license LICENSE.txt +%doc doc/build-%{python3_version}/html +%endif + + +%changelog +* Fri Feb 07 2020 Tomas Orsava - 1.3.1-5 +- Import from the python38 module and modified for rh-python38 RHSCL +- Resolves: rhbz#1671025 + +* Thu Dec 12 2019 Tomas Orsava - 1.3.1-4 +- Exclude unsupported i686 arch + +* Tue Dec 03 2019 Lumír Balhar - 1.3.1-3 +- Specify LDFLAGS explicitly +- Force preprocessing of Fortran sources to make annobin record proper flags +- Resolves: rhbz#1778983 + +* Thu Nov 21 2019 Lumír Balhar - 1.3.1-2 +- Adjusted for Python 3.8 module in RHEL 8 + +* Fri Oct 18 2019 Miro Hrončok - 1.3.1-1 +- Update to 1.3.1 (#1674101) +- Drop Python 2 packages (not supported by SciPy >= 1.3) +- Backported upstream patch for cKDTree (fixes FTBFS) + +* Thu Oct 03 2019 Miro Hrončok - 1.2.1-8 +- Rebuilt for Python 3.8.0rc1 (#1748018) + +* Mon Aug 19 2019 Miro Hrončok - 1.2.1-7 +- Rebuilt for Python 3.8 + +* Tue Jul 30 2019 Petr Viktorin - 1.2.1-6 +- Remove build dependency on python2-pytest-xdist and python2-pytest-timeout +- Enable parallel tests in Python 3 %%check +- Use macros for Python interpreter in tests + +* Fri Jul 26 2019 Fedora Release Engineering - 1.2.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Jun 10 2019 Marcel Plch - 1.2.1-4 +- Fix FTBFS with Py3.8 (#1606315) + +* Thu May 16 2019 Orion Poplawski - 1.2.1-3 +- Build only against openblasp (bugz#1709161) + +* Fri Apr 26 2019 Orion Poplawski - 1.2.1-2 +- Do not create *-PYTEST.pyc files + +* Tue Apr 23 2019 Orion Poplawski - 1.2.1-1 +- Update to 1.2.1 +- Drop scipy2-doc + +* Wed Feb 06 2019 Charalampos Stratakis - 1.2.0-1 +- Update to 1.2.0 + +* Sat Feb 02 2019 Fedora Release Engineering - 1.1.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Jul 14 2018 Fedora Release Engineering - 1.1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Sat Jun 23 2018 Miro Hrončok - 1.1.0-2 +- Don't ignore the tests results but rather have a tolerance rate +- Skip test_decomp on ppc64le as it currently segfaults + +* Fri Jun 22 2018 Miro Hrončok - 1.1.0-1 +- Update to 1.1.0 (#1560265, #1594355) + +* Tue Jun 19 2018 Miro Hrončok - 1.0.0-8 +- Rebuilt for Python 3.7 + +* Fri Feb 09 2018 Fedora Release Engineering - 1.0.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Fri Feb 02 2018 Petr Viktorin - 1.0.0-6 +- Link with -lm to build with new stricter Fedora flags + https://bugzilla.redhat.com/show_bug.cgi?id=1541416 + +* Wed Jan 31 2018 Christian Dersch - 1.0.0-5 +- rebuilt for GCC 8.x (gfortran soname bump) + +* Mon Dec 11 2017 Lumír Balhar - 1.0.0-4 +- Disable tests on s390x + +* Mon Nov 20 2017 Lumír Balhar - 1.0.0-3 +- New subpackages with HTML documentation + +* Tue Oct 31 2017 Christian Dersch - 1.0.0-2 +- Use openblas where available https://fedoraproject.org/wiki/Changes/OpenBLAS_as_default_BLAS +- Remove ppc64 hackery for OpenBLAS +- Don't run tests in parallel as pytest crashes +- Don't run test_denormals as it tends to stuck + +* Thu Oct 26 2017 Thomas Spura - 1.0.0-1 +- update to 1.0.0 and use pytest instead of nose +- use timeout during parallel %%check + +* Wed Oct 04 2017 Christian Dersch - 0.19.1-5 +- Use openblas where available (except ppc64), to use same as numpy (BZ 1472318) + +* Thu Aug 03 2017 Fedora Release Engineering - 0.19.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 0.19.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Jul 07 2017 Igor Gnatenko - 0.19.1-2 +- Rebuild due to bug in RPM (RHBZ #1468476) + +* Tue Jun 27 2017 Christian Dersch - 0.19.1-1 +- new version + +* Wed Jun 07 2017 Christian Dersch - 0.19.0-1 +- new version + +* Tue Jan 31 2017 Zbigniew Jędrzejewski-Szmek - 0.18.0-3 +- Rebuild for libgfortran.so.3 + +* Mon Dec 12 2016 Stratakis Charalampos - 0.18.0-2 +- Rebuild for Python 3.6 + +* Tue Jul 26 2016 Than Ngo - 0.18.0-1 +- 0.18.0 +- %%check: make non-fatal as temporary workaround for scipy build on arm + +* Tue Jul 19 2016 Fedora Release Engineering - 0.17.0-2 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Tue May 31 2016 Nils Philippsen +- fix source URL + +* Mon Feb 15 2016 Orion Poplawski - 0.17.0-1 +- Update to 0.17.0 +- Drop ctypes patch applied upstream + +* Thu Feb 04 2016 Fedora Release Engineering - 0.16.1-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Sat Nov 21 2015 Kalev Lember - 0.16.1-6 +- Add provides to satisfy scipy%%{_isa} requires in other packages + +* Sun Nov 15 2015 Björn Esser - 0.16.1-5 +- Revert "Discard results of testsuite on %%{arm} for now" + +* Sat Nov 14 2015 Björn Esser - 0.16.1-4 +- Discard results of testsuite on %%{arm} for now + Segfaults on non-aligned memory test (expected for arm) + +* Sat Nov 14 2015 Thomas Spura - 0.16.1-3 +- Add patch to fix ctypes test +- Move requires to correct python2 subpackage +- Add FFLAGS also in %%install + +* Tue Nov 10 2015 Fedora Release Engineering - 0.16.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 + +* Mon Oct 26 2015 Orion Poplawski - 0.16.1-1 +- Update to 0.16.1 + +* Wed Oct 14 2015 Thomas Spura - 0.16.0-1 +- Update to 0.16.0 +- Use python_provide macro + +* Fri Jun 19 2015 Fedora Release Engineering - 0.15.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Tue Mar 31 2015 Orion Poplawski - 0.15.1-1 +- Update to 0.15.1 + +* Sun Jan 4 2015 Orion Poplawski - 0.14.1-1 +- Update to 0.14.1 + +* Wed Aug 20 2014 Kevin Fenzi - 0.14.0-5 +- Rebuild for rpm bug 1131892 + +* Mon Aug 18 2014 Fedora Release Engineering - 0.14.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 0.14.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat May 10 2014 Orion Poplawski - 0.14-2 +- Rebuild with Python 3.4 + +* Tue May 6 2014 Orion Poplawski - 0.14-1 +- Update to 0.14 +- Do not use system python-six (bug #1046817) + +* Thu Feb 20 2014 Thomas Spura - 0.13.3-2 +- use python2 macros everywhere (Requested by Han Boetes) + +* Tue Feb 4 2014 Thomas Spura - 0.13.3-1 +- Update to 0.13.3 + +* Mon Dec 9 2013 Orion Poplwski - 0.13.2-1 +- Update to 0.13.2 + +* Fri Dec 06 2013 Nils Philippsen - 0.13.1-2 +- rebuild (suitesparse) + +* Sun Nov 17 2013 Orion Poplwski - 0.13.1-1 +- Update to 0.13.1 + +* Wed Oct 23 2013 Tomas Tomecek - 0.13.0-2 +- Update to 0.13.0 final + +* Tue Oct 15 2013 Orion Poplwski - 0.13.0-0.4.rc1 +- Update to 0.13.0rc1 + +* Tue Oct 01 2013 Tomas Tomecek - 0.13.0-0.3.b1 +- rebuilt with atlas 3.10 + +* Mon Sep 9 2013 Orion Poplwski - 0.13.0-0.2.b1 +- Unbundle python-six (bug #1005350) + +* Thu Aug 29 2013 Orion Poplwski - 0.13.0-0.1.b1 +- Update to 0.13.0b1 +- Drop patches applied upstream +- Fixup changelog and summary + +* Sun Aug 04 2013 Fedora Release Engineering - 0.12.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Tue Jul 30 2013 Tomas Tomecek - 0.12.0-4 +- Fix rpmlint warnings +- License update +- Add patch to use build_dir argument in build_extension + +* Wed May 15 2013 Orion Poplawski - 0.12.0-3 +- Remove old ufsparse references, use suitesparse +- Spec cleanup + +* Mon Apr 15 2013 Orion Poplawski - 0.12.0-2 +- Add patch to fix segfaul in test of sgeqrf + +* Wed Apr 10 2013 Orion Poplawski - 0.12.0-1 +- Update to 0.12.0 final +- No longer remove weave from python3 build + +* Sat Feb 16 2013 Orion Poplawski - 0.12.0-0.1.b1 +- Update to 0.12.0b1 +- Drop upstreamed linalg patch + +* Wed Feb 13 2013 Orion Poplawski - 0.11.0-4 +- Add patch from upstream to fix python3.3 issues in linalg routines + +* Tue Feb 12 2013 Orion Poplawski - 0.11.0-3 +- Disable python3 tests for now + +* Mon Oct 8 2012 Orion Poplawski - 0.11.0-2 +- Add requires python3-numpy, python3-f2py for python3-scipy (bug 863755) + +* Sun Sep 30 2012 Orion Poplawski - 0.11.0-1 +- Update to 0.11.0 final + +* Thu Aug 23 2012 Orion Poplawski - 0.11.0-0.1.rc2 +- Update to 0.11.0rc2 + +* Mon Aug 6 2012 Orion Poplawski - 0.10.1-4 +- Rebuild for python 3.3 + +* Fri Aug 3 2012 David Malcolm - 0.10.1-3 +- remove rhel logic from with_python3 conditional + +* Sat Jul 21 2012 Fedora Release Engineering - 0.10.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Fri Mar 16 2012 Orion Poplawski - 0.10.1-1 +- Update to 0.10.1 + +* Sat Jan 14 2012 Fedora Release Engineering - 0.10.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Nov 14 2011 Orion Poplawski - 0.10.0-1 +- Update to 0.10.0 + +* Sat Sep 3 2011 Thomas Spura - 0.9.0-2 +- little cosmetic changes +- filter provides in python_sitearch + +* Fri Sep 02 2011 Andrew McNabb +- add python3 subpackage + +* Fri Apr 1 2011 Orion Poplawski - 0.9.0-1 +- Update to 0.9.0 +- Drop all stsci sources and patches, dropped from upstream +- Drop gcc and py27 patches fixed upstream +- Add %%check section to run tests + +* Wed Feb 09 2011 Fedora Release Engineering - 0.7.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Sat Jul 31 2010 Toshio Kuratomi - 0.7.2-3 +- Fix scipy build on python-2.7 + +* Thu Jul 22 2010 David Malcolm - 0.7.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Thu Jul 1 2010 Jef Spaleta - 0.7.2-1 +- New upstream release + +* Sun Apr 11 2010 Jef Spaleta - 0.7.1-3 +- Bump for rebuild against numpy 1.3 + +* Thu Apr 1 2010 Jef Spaleta - 0.7.1-2 +- Bump for rebuild against numpy 1.4.0 + +* Thu Dec 10 2009 Jon Ciesla - 0.7.1-1 +- Update to 0.7.1. + +* Sun Jul 26 2009 Fedora Release Engineering - 0.7.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Sun Jun 14 2009 Jef Spaleta - 0.7.0-4 +- Fix for gcc34 weave blitz bug #505379 + +* Tue Apr 7 2009 Jef Spaleta - 0.7.0-3 +- Add f2py requires to prepared for numpy packaging split + +* Sun Mar 1 2009 Jef Spaleta - 0.7.0-2 +- Patch for stsci image function syntax fix. + +* Thu Feb 26 2009 Jef Spaleta - 0.7.0-1 +- Update to final 0.7 release + +* Wed Feb 25 2009 Fedora Release Engineering - 0.7.0-0.3.b1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Mon Dec 15 2008 Deji Akingunola - 0.7.0-0.2.b1 +- Rebuild for atlas-3.8.2 + +* Mon Dec 01 2008 Jef Spaleta - 0.7.0-0.1.b1 +- Update to latest beta which lists python 2.6 support + +* Sat Nov 29 2008 Ignacio Vazquez-Abrams - 0.6.0-8 +- Rebuild for Python 2.6 + +* Fri Oct 03 2008 Jef Spaleta - 0.6.0-7 +- fix the stsci fix + +* Thu Oct 02 2008 Jef Spaleta - 0.6.0-6 +- include missing setup files for stsci module + +* Tue Feb 19 2008 Fedora Release Engineering - 0.6.0-5 +- Autorebuild for GCC 4.3 + +* Fri Jan 04 2008 Jef Spaleta - 0.6.0-4 +- fix for egg-info file creation + +* Wed Oct 03 2007 Jef Spaleta - 0.6.0-3 +- include_dirs changes for ufsparse change in development + +* Tue Oct 02 2007 Jef Spaleta - 0.6.0-2 +- Fix licensing to match Fedora packaging guidance +- Remove unnecessary library deps + +* Tue Sep 25 2007 Jarrod Millman - 0.6.0-1 +- update to new upstream source +- update Summary, License, Url, and description +- added extra dependencies +- remove symlink since Lib has been renamed scipy + +* Tue Aug 21 2007 Jef Spaleta - 0.5.2.1-1 +- Update to new upstream source + +* Tue Aug 21 2007 Jef Spaleta - 0.5.2-3 +- fix licensing tag and bump for buildid rebuild + +* Wed Apr 18 2007 Jef Spaleta - 0.5.2-2.2 +- go back to using gfortran now that numpy is patched + +* Sat Apr 14 2007 Jef Spaleta - 0.5.2-2.1 +- minor correction for f77 usage + +* Sat Apr 14 2007 Jef Spaleta - 0.5.2-2 +- revert to f77 due to issue with numpy in development + +* Sat Apr 14 2007 Jef Spaleta - 0.5.2-1.1 +- remove arch specific optimizations + +* Wed Feb 21 2007 Jef Spaleta - 0.5.2-1 +- Update for new upstream release + +* Mon Dec 11 2006 Jef Spaleta - 0.5.1-5 +- Bump for rebuild against python 2.5 in devel tree + +* Sun Dec 3 2006 Jef Spaleta - 0.5.1-4 +- Minor adjustments to specfile for packaging guidelines. +- Changed buildrequires fftw version 3 from fftw2 + +* Sat Dec 2 2006 Jef Spaleta - 0.5.1-2 +- Updated spec for FE Packaging Guidelines and for upstream version 0.5.1 + +* Mon May 8 2006 Neal Becker - 0.4.8-4 +- Add BuildRequires gcc-c++ +- Add python-devel +- Add libstdc++ + +* Mon May 8 2006 Neal Becker - 0.4.8-3 +- Add BuildRequires gcc-gfortran + +* Sun May 7 2006 Neal Becker - 0.4.8-3 +- Add BuildRequires numpy + + +* Wed May 3 2006 Neal Becker - 0.4.8-2 +- Fix BuildRoot +- Add BuildRequires, Requires +- Test remove d1mach patch +- Fix defattr +- Add changelog +- Removed Prefix, Vendor +- Fix Source0