cvmatrix 3.2.2__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/build/action.yml +4 -4
  2. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/release/action.yml +2 -2
  3. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/test/action.yml +21 -1
  4. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/package_workflow.yml +4 -4
  5. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/pull_request_package_workflow.yml +1 -1
  6. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/pull_request_test_workflow.yml +9 -4
  7. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/test_workflow.yml +9 -4
  8. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/CHANGELOG.md +17 -0
  9. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/CONTRIBUTING.md +45 -11
  10. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/PKG-INFO +9 -3
  11. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/README.md +4 -0
  12. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/__init__.py +1 -1
  13. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/cvmatrix.py +258 -71
  14. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/pyproject.toml +4 -2
  15. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/test_cvmatrix.py +175 -0
  16. cvmatrix-3.3.0/uv.lock +1429 -0
  17. cvmatrix-3.2.2/uv.lock +0 -1128
  18. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.gitignore +0 -0
  19. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.readthedocs.yaml +0 -0
  20. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/LICENSE +0 -0
  21. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/README.md +0 -0
  22. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/__init__.py +0 -0
  23. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark.py +0 -0
  24. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix.png +0 -0
  25. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix_numpy_vs_jax.png +0 -0
  26. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix_vs_naive.png +0 -0
  27. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_jax_variants.png +0 -0
  28. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_results.csv +0 -0
  29. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_results_jax.csv +0 -0
  30. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/plot_benchmark.py +0 -0
  31. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/partitioner.py +0 -0
  32. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/CONTRIBUTING.md +0 -0
  33. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/Makefile +0 -0
  34. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/README.md +0 -0
  35. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/api.rst +0 -0
  36. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/conf.py +0 -0
  37. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/index.rst +0 -0
  38. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/make.bat +0 -0
  39. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/requirements.txt +0 -0
  40. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/cvmatrix.rst +0 -0
  41. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/cvmatrix_module.rst +0 -0
  42. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/partitioner_module.rst +0 -0
  43. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/__init__.py +0 -0
  44. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/training_matrices.py +0 -0
  45. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/training_matrices_jax.py +0 -0
  46. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/__init__.py +0 -0
  47. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/load_data.py +0 -0
  48. {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/naive_cvmatrix.py +0 -0
@@ -4,12 +4,12 @@ description: Build the package
4
4
  runs:
5
5
  using: "composite"
6
6
  steps:
7
- - uses: actions/checkout@v4
7
+ - uses: actions/checkout@v7
8
8
 
9
9
  - name: Install uv
10
- uses: astral-sh/setup-uv@v5
10
+ uses: astral-sh/setup-uv@v7
11
11
  with:
12
- python-version: '3.14'
12
+ python-version: '3.15'
13
13
 
14
14
  - name: Lint with ruff
15
15
  run: |
@@ -28,7 +28,7 @@ runs:
28
28
  shell: bash
29
29
 
30
30
  - name: Store the distribution packages
31
- uses: actions/upload-artifact@v4
31
+ uses: actions/upload-artifact@v7
32
32
  with:
33
33
  name: python-package-distributions
34
34
  path: dist/
@@ -11,12 +11,12 @@ runs:
11
11
  echo "VERSION=$version" >> $GITHUB_ENV
12
12
  shell: bash
13
13
  - name: Download all the dists
14
- uses: actions/download-artifact@v4
14
+ uses: actions/download-artifact@v8
15
15
  with:
16
16
  name: python-package-distributions
17
17
  path: dist/
18
18
  - name: Sign the dists with Sigstore
19
- uses: sigstore/gh-action-sigstore-python@v3.0.0
19
+ uses: sigstore/gh-action-sigstore-python@v3.5.0
20
20
  with:
21
21
  inputs: >-
22
22
  ./dist/*.tar.gz
@@ -14,7 +14,7 @@ runs:
14
14
  using: "composite"
15
15
  steps:
16
16
  - name: Install uv
17
- uses: astral-sh/setup-uv@v5
17
+ uses: astral-sh/setup-uv@v7
18
18
  with:
19
19
  python-version: ${{ inputs.PYTHON_VERSION }}
20
20
 
@@ -28,6 +28,26 @@ runs:
28
28
  run: uv sync --group dev
29
29
  shell: bash
30
30
 
31
+ # On free-threaded Python (e.g. 3.15t), importing an extension module that does not
32
+ # support free threading silently re-enables the GIL, and the tests would then pass
33
+ # without exercising free threading. Fail if any test dependency re-enables it.
34
+ - name: Check that the GIL stays disabled (free-threaded Python only)
35
+ if: ${{ endsWith(inputs.PYTHON_VERSION, 't') }}
36
+ run: |
37
+ uv run python - <<'EOF'
38
+ import importlib.util
39
+ import sys
40
+
41
+ import coverage, cvmatrix, numpy, pandas, pytest, typeguard # noqa: E401, F401
42
+
43
+ if importlib.util.find_spec("jax") is not None:
44
+ import jax.numpy # noqa: F401
45
+ if sys._is_gil_enabled():
46
+ sys.exit("The GIL was re-enabled by an imported extension module.")
47
+ print("The GIL stays disabled with all test dependencies imported.")
48
+ EOF
49
+ shell: bash
50
+
31
51
  # The same test suite runs in both modes. With the JAX backend installed it also
32
52
  # exercises the parametrized backend="jax" tests; without JAX those parametrizations
33
53
  # are skipped (pytest.importorskip), verifying the numpy-only path.
@@ -10,7 +10,7 @@ jobs:
10
10
  build_package:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/checkout@v4
13
+ - uses: actions/checkout@v7
14
14
  - uses: ./.github/actions/build
15
15
 
16
16
  publish_package:
@@ -18,8 +18,8 @@ jobs:
18
18
  runs-on: ubuntu-latest
19
19
  if: ${{ github.event.workflow_run.conclusion == 'success' }}
20
20
  steps:
21
- - uses: actions/checkout@v4
22
- - uses: actions/download-artifact@v4
21
+ - uses: actions/checkout@v7
22
+ - uses: actions/download-artifact@v8
23
23
  with:
24
24
  name: python-package-distributions
25
25
  path: dist/
@@ -41,5 +41,5 @@ jobs:
41
41
  contents: write
42
42
  id-token: write
43
43
  steps:
44
- - uses: actions/checkout@v4
44
+ - uses: actions/checkout@v7
45
45
  - uses: ./.github/actions/release
@@ -14,5 +14,5 @@ jobs:
14
14
  build_package:
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
- - uses: actions/checkout@v4
17
+ - uses: actions/checkout@v7
18
18
  - uses: ./.github/actions/build
@@ -18,9 +18,14 @@ jobs:
18
18
  fail-fast: false
19
19
  matrix:
20
20
  os: [ubuntu-latest, windows-latest, macos-latest]
21
- python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
21
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "3.15t"]
22
+ # jaxlib publishes no free-threaded (cp315t) wheel for Windows, and no sdist.
23
+ # Windows x 3.15t is still tested by the numpy-only job below.
24
+ exclude:
25
+ - os: windows-latest
26
+ python-version: "3.15t"
22
27
  steps:
23
- - uses: actions/checkout@v4
28
+ - uses: actions/checkout@v7
24
29
  - uses: ./.github/actions/test
25
30
  with:
26
31
  PYTHON_VERSION: ${{ matrix.python-version }}
@@ -42,9 +47,9 @@ jobs:
42
47
  fail-fast: false
43
48
  matrix:
44
49
  os: [ubuntu-latest, windows-latest, macos-latest]
45
- python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
50
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "3.15t"]
46
51
  steps:
47
- - uses: actions/checkout@v4
52
+ - uses: actions/checkout@v7
48
53
  - uses: ./.github/actions/test
49
54
  with:
50
55
  PYTHON_VERSION: ${{ matrix.python-version }}
@@ -18,9 +18,14 @@ jobs:
18
18
  fail-fast: false
19
19
  matrix:
20
20
  os: [ubuntu-latest, windows-latest, macos-latest]
21
- python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
21
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "3.15t"]
22
+ # jaxlib publishes no free-threaded (cp315t) wheel for Windows, and no sdist.
23
+ # Windows x 3.15t is still tested by the numpy-only job below.
24
+ exclude:
25
+ - os: windows-latest
26
+ python-version: "3.15t"
22
27
  steps:
23
- - uses: actions/checkout@v4
28
+ - uses: actions/checkout@v7
24
29
  - uses: ./.github/actions/test
25
30
  with:
26
31
  PYTHON_VERSION: ${{ matrix.python-version }}
@@ -42,9 +47,9 @@ jobs:
42
47
  fail-fast: false
43
48
  matrix:
44
49
  os: [ubuntu-latest, windows-latest, macos-latest]
45
- python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
50
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "3.15t"]
46
51
  steps:
47
- - uses: actions/checkout@v4
52
+ - uses: actions/checkout@v7
48
53
  - uses: ./.github/actions/test
49
54
  with:
50
55
  PYTHON_VERSION: ${{ matrix.python-version }}
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.3.0] - 2026-10-30
9
+
10
+ ### Added
11
+ - `compute_XTX` and `compute_XTY` constructor parameters (both default `True`, the previous behavior) that control whether `fit` computes the dataset-wide `XTX` (`X^T W X`) and `XTY` (`X^T W Y`). A product that is never used can now be skipped: e.g., `compute_XTX=False` avoids the O(NK²) time and K² memory of `XTX` when only `training_XTY` and/or `training_statistics` are used, which can dominate `fit` for wide `X`. A product that is not computed is `None`, and the training methods that need it raise a `ValueError`. The products are still computed in `fit`, so they are pickled along with a fitted `CVMatrix` and are not recomputed per task when cross-validating in parallel worker processes (e.g., with `joblib`).
12
+ - Support for free-threaded Python. The CI test matrices now include free-threaded Python 3.15 (`3.15t`) on Linux, macOS, and Windows, with a check that no dependency re-enables the GIL. The JAX backend is tested on `3.15t` on Linux and macOS only, as jaxlib publishes no free-threaded wheel for Windows. The package declares the `Programming Language :: Python :: Free Threading :: 3 - Stable` classifier. A fitted `CVMatrix` can be shared by multiple threads, as the per-fold training methods only read it.
13
+
14
+ ### Changed
15
+ - The CI test workflow for pushes to `main` now also tests Python 3.15, matching the pull-request workflow.
16
+ - The per-fold training methods now gather only the validation set rows they use. Previously, the unweighted validation set rows of `X` were gathered, but not used, by `training_XTY` and `training_statistics`. With `weights` on the numpy backend, this makes `training_XTY` ~20% faster and `training_statistics` ~25-45% faster. Results are unchanged. Unweighted computations and computations traced by `jax.jit` were not affected.
17
+
18
+ ### Fixed
19
+ - A fitted `CVMatrix` can be pickled with the standard library again. Since 3.2.0, the instance held the array namespace `xp` (the `numpy` or `jax.numpy` module), which cannot be pickled, so `pickle`, `copy.deepcopy`, `multiprocessing`, and `concurrent.futures.ProcessPoolExecutor` failed with `TypeError: cannot pickle 'module' object` (`joblib`'s default `loky` backend was not affected, as it pickles with `cloudpickle`). The module is now left out of the pickled state and resolved again from `backend` when unpickling. With `backend="jax"`, JAX's 64-bit mode is enabled before the arrays are restored, so float64 data stays float64 in fresh worker processes, where it would otherwise silently become float32.
20
+ - Re-fitting a `CVMatrix` now replaces all state derived from `Y` instead of keeping it from the previous fit. Re-fitting without `Y` resets `XTY`, `WY`, `sum_Y`, `sq_Y`, and `sum_sq_Y` to `None`, and re-fitting with weights that do not require `WY` (no `center_X`, `center_Y`, or `scale_Y`) resets `WY` to `None`; likewise, `sq_X` is reset to `None` when `scale_X` is `False`. Results were not affected, but the stale arrays were kept in memory and pickled along with the fitted model (e.g., to parallel worker processes).
21
+
22
+ ## [3.2.3] - 2026-10-30
23
+ - Increased the maximum supported Python version from 3.14 to 3.15. Python 3.15 is now included in the CI test matrices. No functional changes.
24
+
8
25
  ## [3.2.2] - 2026-07-06
9
26
 
10
27
  ### Changed
@@ -30,18 +30,28 @@ The sections below outline the steps in each case.
30
30
  1. (**Important**) Announce your plan to the rest of the community *before you start working*. This announcement should be in the form of a (new) issue;
31
31
  2. (**Important**) Wait until some kind of consensus is reached about your idea being a good idea;
32
32
  3. If needed, fork the repository to your own Github profile and create your own feature branch off of the latest main commit. While working on your feature branch, make sure to stay up to date with the main branch by pulling in changes, possibly from the 'upstream' repository (follow the instructions [here](https://help.github.com/articles/configuring-a-remote-for-a-fork/) and [here](https://help.github.com/articles/syncing-a-fork/));
33
- 4. Make sure the existing tests still work by following the instructions in [Run the test suite](#run-the-test-suite);
34
- 5. Add your own tests (if necessary);
35
- 6. If you added your own tests, make sure they pass by following the instructions in [Run the test suite](#run-the-test-suite);
36
- 7. If your contribution is a performance enhancement, make sure to include benchmarks. See [Benchmarking](#benchmarking) for more information;
37
- 8. Update or expand the documentation;
38
- 9. Make sure the documentation builds without errors by following the instructions in [Build the documentation](#build-the-documentation);
39
- 10. Check that you can build the package locally and that it passes twine check. See [Build from source](#build-from-source) for more information;
40
- 11. [Push](http://rogerdudler.github.io/git-guide/) your feature branch to (your fork of) the CVMatrix repository on GitHub;
41
- 12. Create the pull request, e.g. following the instructions [here](https://help.github.com/articles/creating-a-pull-request/).
33
+ 4. Follow the [Design guidelines](#design-guidelines) when changing `CVMatrix`;
34
+ 5. Make sure the existing tests still work by following the instructions in [Run the test suite](#run-the-test-suite);
35
+ 6. Add your own tests (if necessary);
36
+ 7. If you added your own tests, make sure they pass by following the instructions in [Run the test suite](#run-the-test-suite);
37
+ 8. If your contribution is a performance enhancement, make sure to include benchmarks. See [Benchmarking](#benchmarking) for more information;
38
+ 9. Update or expand the documentation;
39
+ 10. Make sure the documentation builds without errors by following the instructions in [Build the documentation](#build-the-documentation);
40
+ 11. Check that you can build the package locally and that it passes twine check. See [Build from source](#build-from-source) for more information;
41
+ 12. [Push](http://rogerdudler.github.io/git-guide/) your feature branch to (your fork of) the CVMatrix repository on GitHub;
42
+ 13. Create the pull request, e.g. following the instructions [here](https://help.github.com/articles/creating-a-pull-request/).
42
43
 
43
44
  If you feel like you've made a valuable contribution, but you don't know how to write or run tests for it or generate the documentation, don't let this discourage you from making the pull request; we can help you! Just submit the pull request, but remember that you might be asked to append additional commits to your pull request.
44
45
 
46
+ ## Design guidelines
47
+
48
+ `CVMatrix` is used in several execution settings: traced by `jax.jit`/`jax.vmap` with `backend="jax"`, called concurrently from multiple threads (including on free-threaded Python, which has no GIL), and pickled to worker processes (e.g., with `joblib`, `multiprocessing`, or `concurrent.futures.ProcessPoolExecutor`). To keep it correct and fast in all of them:
49
+
50
+ - **The per-fold methods only read the fitted state.** `training_XTX`, `training_XTY`, `training_XTX_XTY`, and `training_statistics` must not modify the instance, e.g., by caching results on it. Compute anything dataset-wide in `fit`. A cache written during a per-fold call would leak tracers under `jax.jit`, race between threads, and, in worker processes, be filled in a throwaway copy, i.e., recomputed for every task.
51
+ - **Route array operations through `self.xp`**, not `np`, so that the NumPy and JAX backends share one implementation and the per-fold methods stay traceable. Data-dependent checks that cannot run under tracing are skipped for tracer inputs (see `_TRACER_TYPES`). The NumPy backend's results must not change.
52
+ - **Keep instances picklable with the standard library's `pickle`.** Do not store modules, locks, open files, or other unpicklable objects on the instance. If one is unavoidable, leave it out in `__reduce__` and restore it in `_reconstruct`, as is done for the array namespace `xp`. `test_pickle` and `test_process_pool` check this.
53
+ - **Test both backends.** Every test runs with both `backend="numpy"` and `backend="jax"` through the `_set_backend` fixture in `tests/test_cvmatrix.py`; JAX-only tests skip themselves under the NumPy parametrization.
54
+
45
55
  ## Build from source
46
56
 
47
57
  CVMatrix uses [uv](https://docs.astral.sh/uv/) to manage its dependencies and packaging. To build the package from source, follow these steps:
@@ -101,9 +111,25 @@ To run the test suite, follow these steps:
101
111
  3. Now, the tests can be run with the following command:
102
112
 
103
113
  ```shell
104
- uv run pytest tests --doctest-modules --junitxml=junit/test-results.xml --cov=cvmatrix/ --cov-report=xml --cov-report=html --typeguard-packages=cvmatrix/
114
+ uv run pytest tests --doctest-modules
105
115
  ```
106
116
 
117
+ The pytest options in `pyproject.toml` enable runtime type checking with [typeguard](https://typeguard.readthedocs.io/) (`--typeguard-packages=cvmatrix`) and coverage reports. Note that `--typeguard-packages` takes the package name `cvmatrix`, not a path: `cvmatrix/` silently instruments nothing.
118
+
119
+ ### Test on free-threaded Python
120
+
121
+ CVMatrix also runs on free-threaded builds of Python (e.g., `3.15t`), which have no GIL. To run the test suite on one without touching your default environment, let uv create a temporary, isolated environment:
122
+
123
+ ```shell
124
+ uv run --isolated --python 3.15t --extra jax --group dev pytest tests --doctest-modules
125
+ ```
126
+
127
+ A free-threaded interpreter silently re-enables the GIL if it imports an extension module that does not support free threading. Check that the GIL stays disabled with all dependencies imported; this must print `False`:
128
+
129
+ ```shell
130
+ uv run --isolated --python 3.15t --extra jax python -c "import sys, cvmatrix, jax; print(sys._is_gil_enabled())"
131
+ ```
132
+
107
133
  ## Build the documentation
108
134
 
109
135
  1. Install sphinx, the sphinx-rtd-theme, and the MyST-Parser:
@@ -126,4 +152,12 @@ To run the test suite, follow these steps:
126
152
 
127
153
  ## Benchmarking
128
154
 
129
- To run benchmarks, follow the instructions [here](https://github.com/Sm00thix/CVMatrix/blob/main/benchmarks/README.md).
155
+ To run benchmarks, follow the instructions [here](https://github.com/Sm00thix/CVMatrix/blob/main/benchmarks/README.md).
156
+
157
+ `benchmarks/benchmark.py` can be configured with environment variables, e.g., `BENCH_CONFIGS=plot` (only the three preprocessing combinations in the plots), `BENCH_PS=3,100,10000` (the numbers of folds), `BENCH_N`/`BENCH_K`/`BENCH_M` (the data size), and `BENCH_CSV` (the output file):
158
+
159
+ ```shell
160
+ OPENBLAS_NUM_THREADS=1 BENCH_CONFIGS=plot BENCH_PS=3,100,10000 BENCH_CSV=my_results.csv uv run python benchmarks/benchmark.py
161
+ ```
162
+
163
+ When you compare the performance of your change against `main`, run both versions on the same machine with a single BLAS thread, as above, and alternate between them over several rounds, also with the order reversed. The per-fold timings depend on the memory allocation history of the process, so identical code can differ by several percent between runs, and a fixed run order can look like a consistent difference.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: cvmatrix
3
- Version: 3.2.2
3
+ Version: 3.3.0
4
4
  Summary: Fast computation of possibly weighted and possibly centered/scaled training set kernel matrices in a cross-validation setting.
5
5
  Project-URL: Homepage, https://cvmatrix.readthedocs.io/en/latest/
6
6
  Project-URL: Repository, https://github.com/Sm00thix/CVMatrix
@@ -13,7 +13,9 @@ Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
15
  Classifier: Programming Language :: Python :: 3.14
16
- Requires-Python: <3.15,>=3.10
16
+ Classifier: Programming Language :: Python :: 3.15
17
+ Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
18
+ Requires-Python: <3.16,>=3.10
17
19
  Requires-Dist: numpy<3.0.0,>=2.0.0
18
20
  Provides-Extra: jax
19
21
  Requires-Dist: jax>=0.4.0; extra == 'jax'
@@ -47,6 +49,10 @@ For an implementation of the fast cross-validation algorithms combined with Impr
47
49
 
48
50
  The `cvmatrix` software package now also features **weigthed matrix produts** $\mathbf{X}^{\mathbf{T}}\mathbf{W}\mathbf{Y}$ **without increasing time or space complexity compared to the unweighted case**. This is due to a generalization of the algorithms by Engstrøm and Jensen [[1]](#references). A new article formally describing the generalization is to be announced.
49
51
 
52
+ ## Citation
53
+ - If you use the `cvmatrix` software package for your work, please cite [this Journal of Chemometrics article](https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/full/10.1002/cem.70008).
54
+ - If you use the sample weighted option, please also cite [this PhD thesis](https://arxiv.org/abs/2510.13452).
55
+
50
56
  ## Installation
51
57
 
52
58
  - Install the package for Python3 using the following command:
@@ -26,6 +26,10 @@ For an implementation of the fast cross-validation algorithms combined with Impr
26
26
 
27
27
  The `cvmatrix` software package now also features **weigthed matrix produts** $\mathbf{X}^{\mathbf{T}}\mathbf{W}\mathbf{Y}$ **without increasing time or space complexity compared to the unweighted case**. This is due to a generalization of the algorithms by Engstrøm and Jensen [[1]](#references). A new article formally describing the generalization is to be announced.
28
28
 
29
+ ## Citation
30
+ - If you use the `cvmatrix` software package for your work, please cite [this Journal of Chemometrics article](https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/full/10.1002/cem.70008).
31
+ - If you use the sample weighted option, please also cite [this PhD thesis](https://arxiv.org/abs/2510.13452).
32
+
29
33
  ## Installation
30
34
 
31
35
  - Install the package for Python3 using the following command:
@@ -1,4 +1,4 @@
1
- __version__ = "3.2.2"
1
+ __version__ = "3.3.0"
2
2
  __all__ = ["CVMatrix", "Partitioner"]
3
3
  from .cvmatrix import CVMatrix
4
4
  from .partitioner import Partitioner