* ci: try Python 3.15 release candidate (DRAFT)
Point the repo's .python-version at 3.15 so every workflow that reads
python-version-file runs on the 3.15 release candidate (allow-prereleases
is already enabled across all workflows). Add the 3.15 trove classifier
and bump scipy>=1.18.1, which is the first scipy with cp315 manylinux
wheels, so uv installs it as a wheel rather than building from source.
Rebuilt on current master: the earlier version of this PR edited the
per-workflow `python-version: 3.14` lines, but master has since moved
the interpreter to a single `.python-version` file, so the change is now
a one-line switch there.
Purpose is to document which dependencies/tests are not yet 3.15-ready.
Must stay DRAFT until Python 3.15 GA (early October). Requested in #15081.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Upgrade to Python 3.15t
---------
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
Per discussion in #15418, these four files are not algorithms (they are
how-to-use scripts wrapping a deep-learning framework) and dragged in the
heavy keras/tensorflow dependency stack:
- computer_vision/cnn_classification.py
- dynamic_programming/k_means_clustering_tensorflow.py
- machine_learning/lstm/lstm_prediction.py
- neural_network/input_data.py (TF MNIST data loader; nothing imports it)
Also removes the now-orphaned machine_learning/lstm/ package (only
__init__.py + sample_data.csv, which served lstm_prediction.py).
Cleanups:
- Drop keras from pyproject.toml dependencies; regenerate uv.lock
(removes absl-py, h5py, keras, ml-dtypes, namex, optree).
- Remove the pre-release libhdf5-dev install step from build.yml and
sphinx.yml (it existed only because keras needs hdf5).
- Drop the four stale pytest --ignore entries in build.yml.
- Remove the four DIRECTORY.md entries and the empty Lstm heading.
Land the non-3.15t-gated pieces of #15105 ahead of GA:
- build.yml/sphinx.yml: install libhdf5-dev only when running a pre-release
interpreter (keras needs hdf5 there); guarded so it is a no-op on final builds.
- pyproject.toml: pin scikit-learn>=1.9.1, the first release with cp315t
free-threaded wheels, so uv resolves a wheel instead of building from source.
The .python-version bump to 3.15t stays in #15105 as a draft until 3.15 GA.
Follow-up to #15157. h5py ships self-contained manylinux/musllinux
wheels (aarch64 included) that bundle their own HDF5, so no system
libhdf5 is needed to import or use it. Removing the apt-get step
speeds up CI and removes a network dependency; CI will confirm.
Modern wheels (pillow, lxml, h5py, numpy/scipy, matplotlib) ship
self-contained manylinux/musllinux wheels, so the long lists of -dev
system libraries (libtiff/libjpeg/libopenjp2/freetype/harfbuzz/xml/
xslt/openblas/tk, etc.) are no longer needed to install or import the
project's dependencies. Reduce each apt-get step to libhdf5-dev only
(kept for now as a first step) and switch the deprecated -y flag to
--yes. If CI stays green a follow-up can drop libhdf5-dev too, since
h5py 3.16 ships wheels with a bundled HDF5 and nothing imports h5py
directly.
* ci: switch default Python to free-threaded 3.14t
Change the interpreter used across CI workflows from 3.14 to the
free-threaded build 3.14t to surface which dependencies and tests are
not yet free-threading compatible. Opened as DRAFT for documentation
purposes per maintainer request (#15081).
* ci(3.14t): gate opencv-python into optional 'cv' group + skip cv2 files
opencv-python has no cp314t wheel yet and fails to build from source under
free-threaded 3.14t (CMake), blocking uv sync for every job. Move it to an
optional [dependency-groups] cv group so the ft CI installs everything else
and runs pytest-run-parallel on the pure-Python algorithms. Skip the 20 files
that import cv2 (computer_vision augmentations, data_compression PSNR, and the
mostly-cv2 digital_image_processing/ tree). Re-fold once a cp314t wheel ships
(upstream: opencv/opencv#27933).
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* ci(3.14t): add --ignore-gil-enabled so sklearn/xgboost imports don't abort the run
* ci(3.14t): gate qiskit into an optional group like opencv
qiskit re-enables the GIL under free-threaded CPython and the team is still scoping free-threading support (Qiskit/qiskit#16893), so move it out of the core deps into an optional 'quantum' group and ignore the one algorithm that imports it (quantum/q_fourier_transform.py) in the 3.14t test run. Mirrors the existing opencv 'cv' carve-out. Per cclauss: default all workflows to 3.14t except tests depending on OpenCV or Qiskit.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* ci: single-source 3.14t via .python-version; declare Free Threading :: 2 - Beta
Un-ignore .python-version and pin it to 3.14t, then point all four
workflows at python-version-file: .python-version so the free-threaded
interpreter is selected from one place. Also add the
'Programming Language :: Python :: Free Threading :: 2 - Beta' trove
classifier to document our free-threaded support status per
https://py-free-threading.github.io/porting/#define-and-document-thread-safety-guarantees
---------
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* quantum: modernize QFT to Qiskit 2.x + re-enable its test
quantum/q_fourier_transform.py used the Aer and execute symbols that were
removed from qiskit in the 1.0 API break, so it could never run and was on
the pytest --ignore list. Port it to the current API:
- Drop 'from qiskit import Aer, execute'. Build the circuit unchanged, then
simulate with the pure-Python BasicSimulator via transpile() + backend.run(),
so no compiled qiskit-aer backend is needed (qiskit-aer has no Python 3.14
wheels yet; BasicSimulator ships inside qiskit core).
- Seed the run (seed_simulator=42) and rewrite the doctest to assert the
reproducible, shot-noise-independent facts (the four outcomes appear and the
counts sum to the shot total) instead of exact per-state counts, which random
sampling can never hit.
- Add 'qiskit>=2' to project dependencies and drop the quantum ignore + the
stale '# TODO: #8818 Re-enable quantum tests' comment in build.yml.
Draft until CI confirms qiskit installs and imports on the repo's Python 3.14.
* Update quantum/q_fourier_transform.py
---------
Co-authored-by: Christian Clauss <cclauss@me.com>
* ci: un-ignore local_weighted_learning doctests in build.yml
machine_learning/local_weighted_learning/local_weighted_learning.py only
imports numpy and matplotlib (both already project dependencies) and its
5 doctests pass headlessly. Removing it from the pytest --ignore list so
the module is covered by CI again.
* fix(local_weighted_learning): use a well-conditioned bandwidth in doctests
The doctests used tau=0.6 on data with feature values ~17-25, so the
Gaussian weights underflowed to ~0 (e.g. 8e-118, 1e-177). That made
X\u1d40WX numerically singular (cond ~5.6e18), so its inverse - and the
resulting predictions - were nondeterministic across numpy/BLAS builds.
That is why the module was on the pytest --ignore list; on the CI numpy
the first prediction came out 0.0 instead of the documented 1.07.
Switch the doctests to tau=5 (cond ~2e2), matching the bandwidth the
module's own main() already uses, and round the outputs so they are
stable across platforms. Deterministic now; removed from --ignore.
- Add astral-sh/uv-pre-commit (uv-lock) so uv.lock stays in sync with
pyproject.toml automatically instead of relying on manual relocks.
- Replace 'python-version: 3.14' with 'python-version-file: pyproject.toml'
in every workflow that uses actions/setup-python (build, project_euler,
sphinx, directory_writer), making requires-python the single source of
truth for the interpreter version.
* Use Astral uv
* uvx vs uv run
* uv sync --group=euler-validate,test
* uv sync --group=euler-validate --group=test
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* --group=test
---------
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* style: use proper indentation in `ruff.yml`
* chore: run `prettier` on `yml` files
* Update .pre-commit-config.yaml
* Update .pre-commit-config.yaml
* Update .pre-commit-config.yaml
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update .pre-commit-config.yaml
* chore: run prettier on workflow files
---------
Co-authored-by: Christian Clauss <cclauss@me.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* DRAFT: GitHub Actions: Test on Python 3.12
Repeats #8777
* #8777
Some of our dependencies will not be ready yet.
* Python 3.12: Disable qiskit and tensorflow algorithms
* updating DIRECTORY.md
---------
Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
* refactor: Move pascals triange to maths/
* Update xgboost_classifier.py
* statsmodels is now compatible with Python 3.11
* statsmodels is now compatible with Python 3.11
* cython>=0.29.28
* cython>=0.29.28 # For statsmodels on Python 3.11
Co-authored-by: Christian Clauss <cclauss@me.com>
* makes LRUCache constructor concrete
* fixes bug in dq_removal in other/least_recently_used
+ deque.remove() operates by value not index
* [mypy] Annotates other/least_recently_used over generic type
+ clean-up: rename key_reference to match type.
* [mypy] updates example to demonstrate LRUCache with complex type
* Adds doctest to other/least_recently_used
* mypy.ini: Remove exclude = (other/least_recently_used.py)
* Various mypy configs
* Delete mypy.ini
* Add mypy to .pre-commit-config.yaml
* mypy --ignore-missing-imports --install-types --non-interactive .
* mypy v0.910
* Pillow=8.3.7
* Pillow==8.3.7
* Pillow==8.3.2
* Update .pre-commit-config.yaml
* Update requirements.txt
* Update pre-commit.yml
* --install-types # See mirrors-mypy README.md
Co-authored-by: Christian Clauss <cclauss@me.com>
* fix(mypy): type annotations for cipher algorithms
* Update mypy workflow to include cipher directory
* fix: mypy errors in hill_cipher.py
* fix build errors
* fix hashes-folder
* Update build.yml
* fix doctests
* return-values to int
* Update hashes/adler32.py
* type hints for elements
Co-authored-by: Christian Clauss <cclauss@me.com>