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.
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/build/action.yml +4 -4
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/release/action.yml +2 -2
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/actions/test/action.yml +21 -1
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/package_workflow.yml +4 -4
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/pull_request_package_workflow.yml +1 -1
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/pull_request_test_workflow.yml +9 -4
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.github/workflows/test_workflow.yml +9 -4
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/CHANGELOG.md +17 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/CONTRIBUTING.md +45 -11
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/PKG-INFO +9 -3
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/README.md +4 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/__init__.py +1 -1
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/cvmatrix.py +258 -71
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/pyproject.toml +4 -2
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/test_cvmatrix.py +175 -0
- cvmatrix-3.3.0/uv.lock +1429 -0
- cvmatrix-3.2.2/uv.lock +0 -1128
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.gitignore +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/.readthedocs.yaml +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/LICENSE +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/README.md +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/__init__.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix.png +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix_numpy_vs_jax.png +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_cvmatrix_vs_naive.png +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_jax_variants.png +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_results.csv +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/benchmark_results_jax.csv +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/benchmarks/plot_benchmark.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/cvmatrix/partitioner.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/CONTRIBUTING.md +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/Makefile +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/README.md +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/api.rst +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/conf.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/index.rst +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/make.bat +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/requirements.txt +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/cvmatrix.rst +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/cvmatrix_module.rst +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/docs/source/partitioner_module.rst +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/__init__.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/training_matrices.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/examples/training_matrices_jax.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/__init__.py +0 -0
- {cvmatrix-3.2.2 → cvmatrix-3.3.0}/tests/load_data.py +0 -0
- {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@
|
|
7
|
+
- uses: actions/checkout@v7
|
|
8
8
|
|
|
9
9
|
- name: Install uv
|
|
10
|
-
uses: astral-sh/setup-uv@
|
|
10
|
+
uses: astral-sh/setup-uv@v7
|
|
11
11
|
with:
|
|
12
|
-
python-version: '3.
|
|
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@
|
|
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@
|
|
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.
|
|
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@
|
|
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@
|
|
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@
|
|
22
|
-
- uses: actions/download-artifact@
|
|
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@
|
|
44
|
+
- uses: actions/checkout@v7
|
|
45
45
|
- uses: ./.github/actions/release
|
|
@@ -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@
|
|
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@
|
|
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@
|
|
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@
|
|
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.
|
|
34
|
-
5.
|
|
35
|
-
6.
|
|
36
|
-
7. If
|
|
37
|
-
8.
|
|
38
|
-
9.
|
|
39
|
-
10.
|
|
40
|
-
11.
|
|
41
|
-
12.
|
|
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
|
|
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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: cvmatrix
|
|
3
|
-
Version: 3.
|
|
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
|
-
|
|
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:
|