Compare commits
	
		
			No commits in common. "c8-stream-3.8" and "c8-beta-stream-3.9" have entirely different histories.
		
	
	
		
			c8-stream-
			...
			c8-beta-st
		
	
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| SOURCES/scipy-1.3.1.tar.gz | ||||
| SOURCES/scipy-1.5.4.tar.gz | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 3c079c09ecb614d8056135edd1cc6da51d18df0a SOURCES/scipy-1.3.1.tar.gz | ||||
| ffbc97517d08d8a5b290c7a5dd6cda0c730ed531 SOURCES/scipy-1.5.4.tar.gz | ||||
|  | ||||
| @ -1,28 +0,0 @@ | ||||
| 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
 | ||||
| @ -1,140 +0,0 @@ | ||||
| From d945dfa4063c5cd7169acd117c15f23ba68027ed Mon Sep 17 00:00:00 2001 | ||||
| From: Pauli Virtanen <pav@iki.fi> | ||||
| 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 = <np.intp_t> self.buf.size() | ||||
|          if NPY_LIKELY(n > 0): | ||||
| -            pr = &self.buf.front()
 | ||||
| +            pr = self.buf.data()
 | ||||
|              uintptr = <np.uintp_t> (<void*> pr) | ||||
|              dtype = np.dtype(np.uint8) | ||||
|              self.__array_interface__ = dict( | ||||
| @@ -213,7 +213,7 @@ cdef class coo_entries:
 | ||||
|              dict res_dict | ||||
|          n = <np.intp_t> 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 = <np.intp_t> self.buf.size() | ||||
|          if NPY_LIKELY(n > 0): | ||||
| -            pr = &self.buf.front()
 | ||||
| +            pr = self.buf.data()
 | ||||
|              uintptr = <np.uintp_t> (<void*> 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 = <np.intp_t> 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 = <np.intp_t> (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(<char[:size]> <char*> &cself.tree_buffer.front())
 | ||||
| +        cdef np.ndarray tree = np.asarray(<char[:size]> <char*> 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(<char[:tree.size]> <char*> &cself.tree_buffer.front())
 | ||||
| +        mytree = np.asarray(<char[:tree.size]> <char*> cself.tree_buffer.data())
 | ||||
|   | ||||
|          # set raw pointers | ||||
|          self._pre_init() | ||||
| 
 | ||||
| From ad0f91438f49bfe277e32d2689aefeb0c11c789f Mon Sep 17 00:00:00 2001 | ||||
| From: Pauli Virtanen <pav@iki.fi> | ||||
| 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')], | ||||
| @ -1,589 +0,0 @@ | ||||
| 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); | ||||
							
								
								
									
										47
									
								
								SOURCES/skip-certain-tests-on-32-bit-arches.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								SOURCES/skip-certain-tests-on-32-bit-arches.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| From ea0a77cf8761a8b8636b93314139ed0fc0a9d1db Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com> | ||||
| Date: Wed, 30 Sep 2020 11:44:25 +0200 | ||||
| Subject: [PATCH] TST: make a couple of tests expected to fail on 32-bit | ||||
|  architectures | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| In TestConstructUtils.test_concatenate_int32_overflow | ||||
| and test_nnz_overflow, on a 32-bit architecture, in case | ||||
| check_free_memory() passes, ValueError is raised on an attempt | ||||
| to create a numpy array too large for a 32-bit architecture. | ||||
| 
 | ||||
| Signed-off-by: Nikola Forró <nforro@redhat.com> | ||||
| ---
 | ||||
|  scipy/sparse/tests/test_construct.py   | 1 + | ||||
|  scipy/sparse/tests/test_sparsetools.py | 1 + | ||||
|  2 files changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/scipy/sparse/tests/test_construct.py b/scipy/sparse/tests/test_construct.py
 | ||||
| index 3a882c6cc..5a2b92667 100644
 | ||||
| --- a/scipy/sparse/tests/test_construct.py
 | ||||
| +++ b/scipy/sparse/tests/test_construct.py
 | ||||
| @@ -378,6 +378,7 @@ class TestConstructUtils(object):
 | ||||
|          excinfo.match(r'Got blocks\[0,1\]\.shape\[0\] == 1, expected 2') | ||||
|   | ||||
|      @pytest.mark.slow | ||||
| +    @pytest.mark.xfail_on_32bit("Can't create large array for test")
 | ||||
|      def test_concatenate_int32_overflow(self): | ||||
|          """ test for indptr overflow when concatenating matrices """ | ||||
|          check_free_memory(30000) | ||||
| diff --git a/scipy/sparse/tests/test_sparsetools.py b/scipy/sparse/tests/test_sparsetools.py
 | ||||
| index 0c208ef44..e95df1ba0 100644
 | ||||
| --- a/scipy/sparse/tests/test_sparsetools.py
 | ||||
| +++ b/scipy/sparse/tests/test_sparsetools.py
 | ||||
| @@ -61,6 +61,7 @@ def test_regression_std_vector_dtypes():
 | ||||
|   | ||||
|   | ||||
|  @pytest.mark.slow | ||||
| +@pytest.mark.xfail_on_32bit("Can't create large array for test")
 | ||||
|  def test_nnz_overflow(): | ||||
|      # Regression test for gh-7230 / gh-7871, checking that coo_todense | ||||
|      # with nnz > int32max doesn't overflow. | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
							
								
								
									
										178
									
								
								SPECS/scipy.spec
									
									
									
									
									
								
							
							
						
						
									
										178
									
								
								SPECS/scipy.spec
									
									
									
									
									
								
							| @ -1,14 +1,16 @@ | ||||
| # without means enabled | ||||
| %bcond_with doc | ||||
| 
 | ||||
| %bcond_with tests | ||||
| %bcond_without tests | ||||
| 
 | ||||
| # Set to pre-release version suffix if building pre-release, else %%{nil} | ||||
| %global rcver %{nil} | ||||
| 
 | ||||
| %global blaslib openblas | ||||
| %global blasvar p | ||||
| 
 | ||||
| Summary:    Scientific Tools for Python | ||||
| Name:       scipy | ||||
| Version:    1.3.1 | ||||
| Version:    1.5.4 | ||||
| Release:    5%{?dist} | ||||
| 
 | ||||
| # BSD -- whole package except: | ||||
| @ -18,52 +20,35 @@ 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 | ||||
| 
 | ||||
| # Exclude i686 arch. Due to a modularity issue it's being added to the | ||||
| # x86_64 compose of CRB, but we don't want to ship it at all. | ||||
| # See: https://projects.engineering.redhat.com/browse/RCM-72605 | ||||
| ExcludeArch: i686 | ||||
| 
 | ||||
| BuildRequires: fftw-devel, blas-devel, lapack-devel, suitesparse-devel | ||||
| %ifarch %{openblas_arches} | ||||
| BuildRequires: openblas-devel | ||||
| %else | ||||
| BuildRequires: atlas-devel | ||||
| %endif | ||||
| # https://github.com/scipy/scipy/pull/12899 | ||||
| Patch0:     skip-certain-tests-on-32-bit-arches.patch | ||||
| 
 | ||||
| BuildRequires: fftw-devel, suitesparse-devel | ||||
| BuildRequires: %{blaslib}-devel | ||||
| BuildRequires: gcc-gfortran, swig, gcc-c++ | ||||
| BuildRequires: qhull-devel | ||||
| BuildRequires: /usr/bin/pathfix3.8.py | ||||
| 
 | ||||
| BuildRequires:  python%{python3_pkgversion}-pybind11-devel | ||||
| BuildRequires:  python%{python3_pkgversion}-pybind11 >= 2.4.0 | ||||
| BuildRequires:  python%{python3_pkgversion}-devel | ||||
| BuildRequires:  python%{python3_pkgversion}-rpm-macros | ||||
| BuildRequires:  python%{python3_pkgversion}-numpy | ||||
| BuildRequires:  python%{python3_pkgversion}-numpy-f2py | ||||
| BuildRequires:  python%{python3_pkgversion}-setuptools | ||||
| BuildRequires:  python%{python3_pkgversion}-Cython | ||||
| BuildRequires:  python%{python3_pkgversion}-rpm-macros | ||||
| 
 | ||||
| %if %{with tests} | ||||
| BuildRequires:  python%{python3_pkgversion}-pytest | ||||
| BuildRequires:  python%{python3_pkgversion}-pytest-xdist | ||||
| BuildRequires:  python%{python3_pkgversion}-pytest-timeout | ||||
| %endif | ||||
| 
 | ||||
| %if %{with doc} | ||||
| BuildRequires:  python%{python3_pkgversion}-sphinx | ||||
| BuildRequires:  python%{python3_pkgversion}-matplotlib | ||||
| BuildRequires:  python%{python3_pkgversion}-numpydoc | ||||
| BuildRequires:  python3-sphinx | ||||
| BuildRequires:  python3-matplotlib | ||||
| BuildRequires:  python3-numpydoc | ||||
| %endif | ||||
| 
 | ||||
| %global _description %{expand: | ||||
| @ -108,11 +93,9 @@ library_dirs = %{_libdir} | ||||
| include_dirs = /usr/include/suitesparse | ||||
| umfpack_libs = umfpack | ||||
| 
 | ||||
| %ifarch %{openblas_arches} | ||||
| [openblas] | ||||
| libraries = openblasp | ||||
| libraries = %{blaslib}%{blasvar} | ||||
| library_dirs = %{_libdir} | ||||
| %endif | ||||
| EOF | ||||
| 
 | ||||
| # Docs won't build unless the .dat files are specified here | ||||
| @ -125,6 +108,7 @@ rm $(grep -rl '/\* Generated by Cython') PKG-INFO | ||||
| 
 | ||||
| %build | ||||
| for PY in %{python3_version}; do | ||||
|   # Adding -fallow-argument-mismatch workaround for https://github.com/scipy/scipy/issues/11611 | ||||
|   env CFLAGS="$RPM_OPT_FLAGS -lm" \ | ||||
|     FFLAGS="$RPM_OPT_FLAGS -fPIC -cpp" \ | ||||
|     LDFLAGS="$RPM_LD_FLAGS -shared" \ | ||||
| @ -145,43 +129,61 @@ done | ||||
| %install | ||||
| %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} | ||||
| pathfix%{python3_version}.py -pni "%{__python3} %{py3_shbang_opts}" %{buildroot}%{python3_sitearch} | ||||
| 
 | ||||
| %if %{with tests} | ||||
| %check | ||||
| # 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. | ||||
| # check against the reference BLAS/LAPACK | ||||
| export FLEXIBLAS=netlib | ||||
| 
 | ||||
| %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 | ||||
| # skip failing tests on s390x for now | ||||
| export PYTEST_ADDOPTS="-k '\ | ||||
|     not (TestNoData and test_nodata) and \ | ||||
|     not test_fortranfile_read_mixed_record and \ | ||||
|     not test_kde_1d and \ | ||||
|     not test_kde_1d_weighted and \ | ||||
|     not test_kde_2d and \ | ||||
|     not test_kde_2d_weighted and \ | ||||
|     not test_gaussian_kde_subclassing and \ | ||||
|     not test_gaussian_kde_covariance_caching and \ | ||||
|     not test_kde_integer_input and \ | ||||
|     not test_pdf_logpdf and \ | ||||
|     not test_pdf_logpdf_weighted'" | ||||
| %endif | ||||
| 
 | ||||
| # Those tests fail on koji/brew for ppc64le but pass | ||||
| # locally for that architecture | ||||
| %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" | ||||
| export PYTEST_ADDOPTS="-k '\ | ||||
|     not TestFFTConvolve and \ | ||||
|     not TestDoubleFFT and \ | ||||
|     not TestSingleFFT and \ | ||||
|     not TestDoubleIFFT and \ | ||||
|     not TestSingleIFFT and \ | ||||
|     not test_tpsv and \ | ||||
|     not TestLinear and \ | ||||
|     not test_Mx1_economic and \ | ||||
|     not test_hegst and \ | ||||
|     not test_tpqrt_tpmqrt and \ | ||||
|     not test_pteqr and \ | ||||
|     not test_against_numpy_convolve and \ | ||||
|     not test_convolve_method and \ | ||||
|     not test_rank1 and \ | ||||
|     not test_splu_smoketest and \ | ||||
|     not test_spilu_smoketest and \ | ||||
|     not test_threads_parallel and \ | ||||
|     not test_hermitian and \ | ||||
|     not test_convergence'" | ||||
| %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 | ||||
| %{pytest} scipy | ||||
| # Remove test remnants | ||||
| rm -rf gram{A,B} | ||||
| popd | ||||
| %endif | ||||
| %endif # with tests | ||||
| 
 | ||||
| 
 | ||||
| %files -n python%{python3_pkgversion}-scipy | ||||
| %doc LICENSE.txt | ||||
| @ -195,20 +197,62 @@ popd | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Jul 14 2023 Charalampos Stratakis <cstratak@redhat.com> - 1.3.1-5 | ||||
| * Fri Jul 14 2023 Charalampos Stratakis <cstratak@redhat.com> - 1.5.4-5 | ||||
| - Skip some tests that fail on the ppc64le builders | ||||
| - Resolves: rhbz#2217858 | ||||
| 
 | ||||
| * Fri Jul 14 2023 Charalampos Stratakis <cstratak@redhat.com> - 1.5.4-4 | ||||
| - Remove RPATH from certain shared object files | ||||
| - Resolves: rhbz#2222717 | ||||
| - Resolves: rhbz#2222715 | ||||
| 
 | ||||
| * Thu Dec 12 2019 Tomas Orsava <torsava@redhat.com> - 1.3.1-4 | ||||
| - Exclude unsupported i686 arch | ||||
| 
 | ||||
| * Tue Dec 03 2019 Lumír Balhar <lbalhar@redhat.com> - 1.3.1-3 | ||||
| * Mon Jan 18 2021 Tomas Orsava <torsava@redhat.com> - 1.5.4-3 | ||||
| - Specify LDFLAGS explicitly | ||||
| - Force preprocessing of Fortran sources to make annobin record proper flags | ||||
| - Resolves: rhbz#1778983 | ||||
| - Resolves: rhbz#1778983 rhbz#1877430 | ||||
| 
 | ||||
| * Thu Nov 21 2019 Lumír Balhar <lbalhar@redhat.com> - 1.3.1-2 | ||||
| - Adjusted for Python 3.8 module in RHEL 8 | ||||
| * Mon Jan 18 2021 Tomas Orsava <torsava@redhat.com> - 1.5.4-2 | ||||
| - Convert from Fedora to the python39 module in RHEL8 | ||||
| - Resolves: rhbz#1877430 | ||||
| 
 | ||||
| * Thu Nov 05 2020 Nikola Forró <nforro@redhat.com> - 1.5.4-1 | ||||
| - New upstream release 1.5.4 | ||||
| - Increase test timeout, 300 seconds is not always enough | ||||
|   for test_logpdf_overflow on s390x | ||||
|   resolves: #1894887 | ||||
| 
 | ||||
| * Mon Oct 19 2020 Nikola Forró <nforro@redhat.com> - 1.5.3-1 | ||||
| - New upstream release 1.5.3 | ||||
|   resolves: #1889132 | ||||
| 
 | ||||
| * Wed Sep 30 2020 Nikola Forró <nforro@redhat.com> - 1.5.2-2 | ||||
| - Skip one more test expected to fail on 32-bit architectures | ||||
| 
 | ||||
| * Mon Aug 31 2020 Nikola Forró <nforro@redhat.com> - 1.5.2-1 | ||||
| - New upstream release 1.5.2 | ||||
|   resolves: #1853871 and 1840077 | ||||
| 
 | ||||
| * Sun Aug 16 2020 Iñaki Úcar <iucar@fedoraproject.org> - 1.5.0-4 | ||||
| - https://fedoraproject.org/wiki/Changes/FlexiBLAS_as_BLAS/LAPACK_manager | ||||
| 
 | ||||
| * Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.5.0-3 | ||||
| - Second attempt - Rebuilt for | ||||
|   https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild | ||||
| 
 | ||||
| * Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.5.0-2 | ||||
| - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild | ||||
| 
 | ||||
| * Tue Jun 23 2020 Elliott Sales de Andrade <quantum.analyst@gmail.com> - 1.5.0-1 | ||||
| - Update to latest version | ||||
| 
 | ||||
| * Mon May 25 2020 Miro Hrončok <mhroncok@redhat.com> - 1.4.1-2 | ||||
| - Rebuilt for Python 3.9 | ||||
| 
 | ||||
| * Sun Mar 01 2020 Orion Poplawski <orion@nwra.com> - 1.4.1-1 | ||||
| - Update to 1.4.1 (bz#1771154) | ||||
| - Workaround FTBFS with gcc 10 (bz#1800078) | ||||
| 
 | ||||
| * Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.3.1-2 | ||||
| - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild | ||||
| 
 | ||||
| * Fri Oct 18 2019 Miro Hrončok <mhroncok@redhat.com> - 1.3.1-1 | ||||
| - Update to 1.3.1 (#1674101) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user