Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAINT: remove optional dependence on SciPy for FFT operations #791

Merged
merged 9 commits into from
Feb 3, 2025
1 change: 0 additions & 1 deletion .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All @@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All @@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand Down Expand Up @@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All @@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down Expand Up @@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-free-threaded
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All @@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All @@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand Down Expand Up @@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All @@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down Expand Up @@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
28 changes: 10 additions & 18 deletions pywt/_cwt.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,16 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))
fftmodule = np.fft


def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All @@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down