From ccaf2ea7927d996b20a97f1ba92651129be1399a Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 28 Jun 2023 20:36:47 -0400 Subject: [PATCH] python3-scipy: fix determinant regression and openblas option handling --- .../patches/determinant-fix.patch | 74 +++++++++++++++++++ srcpkgs/python3-scipy/template | 7 +- 2 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 srcpkgs/python3-scipy/patches/determinant-fix.patch diff --git a/srcpkgs/python3-scipy/patches/determinant-fix.patch b/srcpkgs/python3-scipy/patches/determinant-fix.patch new file mode 100644 index 00000000000..ed31163f895 --- /dev/null +++ b/srcpkgs/python3-scipy/patches/determinant-fix.patch @@ -0,0 +1,74 @@ +From 61d892c9faa543ad80bd5e2d0bf69821188487e0 Mon Sep 17 00:00:00 2001 +From: Ilhan Polat +Date: Tue, 27 Jun 2023 12:00:38 +0200 +Subject: [PATCH] MAINT:linalg.det:Return scalars for singleton inputs (#18763) + +--- + scipy/linalg/_basic.py | 17 ++++++++++++----- + scipy/linalg/tests/test_basic.py | 17 +++++++++++++++++ + 2 files changed, 29 insertions(+), 5 deletions(-) + +diff --git a/scipy/linalg/_basic.py b/scipy/linalg/_basic.py +index 327ba1ca36ce..6faa3898f720 100644 +--- a/scipy/linalg/_basic.py ++++ b/scipy/linalg/_basic.py +@@ -1001,7 +1001,8 @@ def det(a, overwrite_a=False, check_finite=True): + det : (...) float or complex + Determinant of `a`. For stacked arrays, a scalar is returned for each + (m, m) slice in the last two dimensions of the input. For example, an +- input of shape (p, q, m, m) will produce a result of shape (p, q). ++ input of shape (p, q, m, m) will produce a result of shape (p, q). If ++ all dimensions are 1 a scalar is returned regardless of ndim. + + Notes + ----- +@@ -1066,11 +1067,17 @@ def det(a, overwrite_a=False, check_finite=True): + + # Scalar case + if a1.shape[-2:] == (1, 1): +- if a1.dtype.char in 'dD': +- return np.squeeze(a1) ++ # Either ndarray with spurious singletons or a single element ++ if max(*a1.shape) > 1: ++ temp = np.squeeze(a1) ++ if a1.dtype.char in 'dD': ++ return temp ++ else: ++ return (temp.astype('d') if a1.dtype.char == 'f' else ++ temp.astype('D')) + else: +- return (np.squeeze(a1).astype('d') if a1.dtype.char == 'f' else +- np.squeeze(a1).astype('D')) ++ return (np.float64(a1.item()) if a1.dtype.char in 'fd' else ++ np.complex128(a1.item())) + + # Then check overwrite permission + if not _datacopied(a1, a): # "a" still alive through "a1" +diff --git a/scipy/linalg/tests/test_basic.py b/scipy/linalg/tests/test_basic.py +index 983530b63ff2..40308500ec4a 100644 +--- a/scipy/linalg/tests/test_basic.py ++++ b/scipy/linalg/tests/test_basic.py +@@ -930,6 +930,23 @@ class TestDet: + def setup_method(self): + self.rng = np.random.default_rng(1680305949878959) + ++ def test_1x1_all_singleton_dims(self): ++ a = np.array([[1]]) ++ deta = det(a) ++ assert deta.dtype.char == 'd' ++ assert np.isscalar(deta) ++ assert deta == 1. ++ a = np.array([[[[1]]]], dtype='f') ++ deta = det(a) ++ assert deta.dtype.char == 'd' ++ assert np.isscalar(deta) ++ assert deta == 1. ++ a = np.array([[[1 + 3.j]]], dtype=np.complex64) ++ deta = det(a) ++ assert deta.dtype.char == 'D' ++ assert np.isscalar(deta) ++ assert deta == 1.+3.j ++ + def test_1by1_stacked_input_output(self): + a = self.rng.random([4, 5, 1, 1], dtype=np.float32) + deta = det(a) diff --git a/srcpkgs/python3-scipy/template b/srcpkgs/python3-scipy/template index c5a8e1f212b..fdf39578fc9 100644 --- a/srcpkgs/python3-scipy/template +++ b/srcpkgs/python3-scipy/template @@ -1,9 +1,10 @@ # Template file for 'python3-scipy' pkgname=python3-scipy version=1.11.0 -revision=1 +revision=2 build_style=meson build_helper="python3" +configure_args="$(vopt_if openblas "" "-Dblas=blas -Dlapack=lapack")" hostmakedepends="python3-build python3-installer python3-meson-python python3-wheel python3-Cython python3-pybind11 pythran python3-numpy gcc-fortran pkg-config" @@ -22,7 +23,7 @@ build_options="openblas" if [ "$CROSS_BUILD" ]; then _pybind11_dir="${py3_sitelib}/pybind11" - configure_args="--cross-file=python.cross" + configure_args+=" --cross-file=python.cross" export PKG_CONFIG_PATH="${XBPS_CROSS_BASE}/${_pybind11_dir}/share/pkgconfig" # pybind11 uses a path relative to the pkgconfig file to set $prefix, # which causes the wrapper to double-include $XBPS_CROSS_BASE; override @@ -43,8 +44,6 @@ if [ "$build_option_openblas" ]; then ppc64*) ;; ppc*) broken="numpy can't be built with openblas";; esac -else - configure_args+=" -Dblas=blas -Dlapack=lapack" fi pre_patch() {