diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d363182..58234f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,29 @@ jobs: call-test: uses: ./.github/workflows/test.yml secrets: inherit + + build-sdist: + runs-on: ubuntu-latest + needs: call-test + steps: + - uses: actions/checkout@v4 + - uses: prefix-dev/setup-pixi@v0.8.8 + with: + environments: dev + cache: true + - name: Re-install local + run: | + pixi reinstall -e dev --frozen fastcan + - name: Build SDist + run: | + pixi run build-sdist + - name: Store artifacts + uses: actions/upload-artifact@v4 + with: + name: cibw-sdist + path: dist/*.tar.gz - build: + build-wheels: strategy: fail-fast: false matrix: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 34a1d2b..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Lint - -on: - workflow_call: - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.8.8 - with: - environments: default - cache: true - - - name: Re-install local - run: | - pixi reinstall -e lint --frozen fastcan - - - name: Lint with ruff - run: | - pixi run lint - - name: Lint with cython-lint - run: | - pixi run cython-lint - - name: Format with black - run: | - pixi run fmt - - name: Type check with mypy - run: | - pixi run type - - name: Test coverage - shell: bash - run: | - FMT=xml pixi run test-coverage - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - - name: Build SDist - run: | - pixi run build-sdist - - name: Store artifacts - uses: actions/upload-artifact@v4 - with: - name: cibw-sdist - path: dist/*.tar.gz diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 0000000..02dcfbe --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,32 @@ +name: Static + +on: + workflow_call: + +jobs: + static: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: prefix-dev/setup-pixi@v0.8.8 + with: + environments: static + cache: true + + - name: Re-install local + run: | + pixi reinstall -e static --frozen fastcan + + - name: Linter + run: | + pixi run lint + - name: Lint Cython + run: | + pixi run cython-lint + - name: Formatter + run: | + pixi run fmt + - name: Type check + run: | + pixi run type diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 374cb7d..0824762 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,8 +9,7 @@ on: jobs: call-lint: - uses: ./.github/workflows/lint.yml - secrets: inherit + uses: ./.github/workflows/static.yml test: strategy: @@ -23,7 +22,7 @@ jobs: - uses: actions/checkout@v4 - uses: prefix-dev/setup-pixi@v0.8.8 with: - environments: default + environments: dev cache: true - name: Re-install local @@ -44,3 +43,13 @@ jobs: - name: Test nogil run: | pixi run nogil-eta + - name: Test coverage + if: runner.os == 'Linux' + shell: bash + run: | + FMT=xml pixi run test-coverage + - name: Upload coverage reports to Codecov + if: runner.os == 'Linux' + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/examples/plot_narx_msa.py b/examples/plot_narx_msa.py index 655b019..7d7466a 100644 --- a/examples/plot_narx_msa.py +++ b/examples/plot_narx_msa.py @@ -93,7 +93,7 @@ def auto_duffing_equation(y, t): sol = odeint(duffing_equation, [0.6, -0.8], t) u_test = 2.5 * np.cos(2 * np.pi * t).reshape(-1, 1) -y_test = sol[:, 0]+ e_test +y_test = sol[:, 0] + e_test # %% # One-step-head VS. multi-step-ahead NARX diff --git a/examples/plot_speed.py b/examples/plot_speed.py index 347f3c1..073302e 100644 --- a/examples/plot_speed.py +++ b/examples/plot_speed.py @@ -178,12 +178,12 @@ def baseline(X, y, t): time_eta = np.zeros(n_features_max, dtype=float) for i in range(n_features_max): time_h[i] = timeit( - f"s = FastCan({i+1}, verbose=0).fit(X, y)", + f"s = FastCan({i + 1}, verbose=0).fit(X, y)", number=10, globals=globals(), ) time_eta[i] = timeit( - f"s = FastCan({i+1}, eta=True, verbose=0).fit(X, y)", + f"s = FastCan({i + 1}, eta=True, verbose=0).fit(X, y)", number=10, globals=globals(), ) diff --git a/fastcan/__init__.py b/fastcan/__init__.py index cdd8252..ae06fbc 100644 --- a/fastcan/__init__.py +++ b/fastcan/__init__.py @@ -13,8 +13,8 @@ __all__ = [ "FastCan", - "refine", "minibatch", "narx", + "refine", "utils", ] diff --git a/fastcan/_fastcan.py b/fastcan/_fastcan.py index 01af376..d5145a7 100644 --- a/fastcan/_fastcan.py +++ b/fastcan/_fastcan.py @@ -17,7 +17,7 @@ from sklearn.utils._param_validation import Interval from sklearn.utils.validation import check_is_fitted, validate_data -from ._cancorr_fast import _forward_search # type: ignore +from ._cancorr_fast import _forward_search # type: ignore[attr-defined] class FastCan(SelectorMixin, BaseEstimator): diff --git a/fastcan/_minibatch.py b/fastcan/_minibatch.py index a92d320..305f6d1 100644 --- a/fastcan/_minibatch.py +++ b/fastcan/_minibatch.py @@ -13,7 +13,7 @@ from sklearn.utils._param_validation import Interval, validate_params from sklearn.utils.validation import check_X_y -from ._cancorr_fast import _forward_search # type: ignore +from ._cancorr_fast import _forward_search # type: ignore[attr-defined] from ._fastcan import _prepare_search diff --git a/fastcan/_refine.py b/fastcan/_refine.py index 0dbd95a..a58e947 100644 --- a/fastcan/_refine.py +++ b/fastcan/_refine.py @@ -13,7 +13,7 @@ from sklearn.utils._param_validation import Interval, StrOptions, validate_params from sklearn.utils.validation import check_is_fitted -from ._cancorr_fast import _forward_search # type: ignore +from ._cancorr_fast import _forward_search # type: ignore[attr-defined] from ._fastcan import FastCan, _prepare_search diff --git a/fastcan/narx.py b/fastcan/narx.py index ec3775f..013df07 100644 --- a/fastcan/narx.py +++ b/fastcan/narx.py @@ -25,7 +25,11 @@ ) from ._fastcan import FastCan -from ._narx_fast import _predict_step, _update_cfd, _update_terms # type: ignore +from ._narx_fast import ( # type: ignore[attr-defined] + _predict_step, + _update_cfd, + _update_terms, +) from ._refine import refine from .utils import mask_missing_values diff --git a/pixi.lock b/pixi.lock index 41161fe..4c04a78 100644 --- a/pixi.lock +++ b/pixi.lock @@ -49,7 +49,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: . + - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.9.0-h09a7c41_0.conda @@ -124,7 +124,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda - - pypi: . + - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.9.0-hdf49b6b_0.conda @@ -198,7 +198,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - - pypi: . + - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-h4c7d964_0.conda @@ -239,7 +239,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda - - pypi: . + - pypi: ./ dev: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -524,7 +524,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - - pypi: . + - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda @@ -774,7 +774,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - - pypi: . + - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda @@ -1023,7 +1023,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - - pypi: . + - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.conda @@ -1263,20 +1263,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - - pypi: . - lint: + - pypi: ./ + nogil: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.1.0-pyh866005b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda @@ -1289,62 +1288,63 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.15.0-py313h536fd9c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py313h536fd9c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.8-py313h22842b3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/black-25.1.0-py312hb401068_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.12-py312hdfbeeba_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.2-hdb6dae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.15.0-py312h01d7ebd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-hd6aca1a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py312h01d7ebd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.10-h9ccd52b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h2267d90_1_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.8-py312h60e8e2e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-25.1.0-py313h8f79df9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cython-3.0.12-py313hd607753_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.4-ha82da77_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda @@ -1352,69 +1352,70 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.2-h3f77e49_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.15.0-py313h90d716c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.1-h177bc72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py313h90d716c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-h81fe080_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-hfd29fff_1_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.8-py313hd3a9b03_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.1.0-pyh866005b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.0.12-py313h11c7957_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.2-h67fdade_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.15.0-py313ha7868ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py313ha7868ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.3-h261c0b1_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.8-py313h9f3c1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.3-hd7c436d_1_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda - nogil: + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl + - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + static: channels: - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda @@ -1427,123 +1428,101 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.15.0-py313h536fd9c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py313h536fd9c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.9-py313h22842b3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.1.0-py312hdfbeeba_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.5-hf95d169_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.2-hdb6dae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.15.0-py312h01d7ebd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-hd6aca1a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h2267d90_1_cp313t.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py312h01d7ebd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.10-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.9-py312h60e8e2e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.4-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cython-3.1.0-py313hd607753_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.5-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.2-h3f77e49_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.15.0-py313h90d716c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.1-h177bc72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-hfd29fff_1_cp313t.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py313h90d716c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-h81fe080_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.9-py313hd3a9b03_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-macosx_12_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.1.0-py313h11c7957_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.2-h67fdade_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.15.0-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.3-hd7c436d_1_cp313t.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py313ha7868ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.3-h261c0b1_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.9-py313h9f3c1d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/cython/3.1.0rc1/cython-3.1.0rc1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl - - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -1777,51 +1756,6 @@ packages: - pkg:pypi/beautifulsoup4?source=compressed-mapping size: 146613 timestamp: 1744783307123 -- conda: https://conda.anaconda.org/conda-forge/noarch/black-25.1.0-pyh866005b_0.conda - sha256: c68f110cd491dc839a69e340930862e54c00fb02cede5f1831fcf8a253bd68d2 - md5: b9b0c42e7316aa6043bdfd49883955b8 - depends: - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9 - - platformdirs >=2 - - python >=3.11 - license: MIT - license_family: MIT - size: 172678 - timestamp: 1742502887437 -- conda: https://conda.anaconda.org/conda-forge/osx-64/black-25.1.0-py312hb401068_0.conda - sha256: e937f18e36e23ecf0ec9ab89fc3ef5263308e88b645c4278fe8807fd95bef4c1 - md5: d37d5213fcf23a33d946e40937578a02 - depends: - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9 - - platformdirs >=2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - size: 393484 - timestamp: 1738616259890 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-25.1.0-py313h8f79df9_0.conda - sha256: ef2f742f6abefc32506038a4c64bf0c086c8e13234c1fe80c8675c7f92589cc2 - md5: 698e6c77b39a4f3d82c8e2e7d82b81c8 - depends: - - click >=8.0.0 - - mypy_extensions >=0.4.3 - - packaging >=22.0 - - pathspec >=0.9 - - platformdirs >=2 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - size: 400095 - timestamp: 1738616517582 - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd md5: f0b4c8e370446ef89797608d60a564b3 @@ -2486,27 +2420,6 @@ packages: purls: [] size: 19975 timestamp: 1742540410050 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda - sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab - md5: f22f4d4970e09d68a10b922cbb0408d3 - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 84705 - timestamp: 1734858922844 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda - sha256: c889ed359ae47eead4ffe8927b7206b22c55e67d6e74a9044c23736919d61e8d - md5: 90e5571556f7a45db92ee51cb8f97af6 - depends: - - __win - - colorama - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - size: 85169 - timestamp: 1734858972635 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -2817,18 +2730,19 @@ packages: - pkg:pypi/cython?source=hash-mapping size: 3766349 timestamp: 1739228643862 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.12-py312hdfbeeba_0.conda - sha256: a186d286aedb2230dcdcaf2a8602c098112eaacdf9d8af39da2a474950bf1b98 - md5: 5801a15eece1bd00c7f6dc0c68640a9f +- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_1.conda + sha256: 77d6f353cee60a2802d41ef89f56f7c0a5493de2463d42ce76cc1e98210ff520 + md5: 43ad5286d089949501cf07064693d070 depends: - - __osx >=10.13 - - libcxx >=18 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 license: Apache-2.0 license_family: APACHE - size: 3455381 - timestamp: 1739228540351 + size: 3694348 + timestamp: 1747172311189 - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.12-py313h9efc8c2_0.conda sha256: 132d6e81a95c042210f33c3d24f03d52632738434b3ea48cfb184a26684d365e md5: ddace7cae5c3073c031ad08ef01881da @@ -2843,6 +2757,18 @@ packages: - pkg:pypi/cython?source=hash-mapping size: 3500462 timestamp: 1739228750512 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.1.0-py312hdfbeeba_1.conda + sha256: 887ef8caea20efd49bfb8ba23a8036eda3ff70180a0c395c930bbca70ee98ab1 + md5: b09ecb38c03625464a87e3f2b04d7154 + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 3438173 + timestamp: 1747172239562 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cython-3.0.12-py313hd607753_0.conda sha256: 5dab9497286041af22785e69ec3c4ba96ef06e4498416dac77055ad4ab03fe17 md5: a05cbfd5f2277521007624ad8ca65f02 @@ -2858,6 +2784,19 @@ packages: - pkg:pypi/cython?source=hash-mapping size: 3509778 timestamp: 1739228359500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cython-3.1.0-py313hd607753_1.conda + sha256: 0087bc6a4a6dea55d0ffeb22e0350f7b71f18e79b9f0cdbbdbe293a8871474f8 + md5: 96dbb83d36f74f0faad3a1c5d8ec0843 + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: APACHE + size: 3412491 + timestamp: 1747172147455 - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.0.12-py313h11c7957_0.conda sha256: 0c5d28be02ffb8bed56c1d290f0535fe95ed28dffd86eb56f0cf5efaba006060 md5: 8be86847359ed6c522c23dfce6fa9b90 @@ -2873,6 +2812,19 @@ packages: - pkg:pypi/cython?source=hash-mapping size: 3202883 timestamp: 1739228652473 +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.1.0-py313h11c7957_1.conda + sha256: 6549e02b3874438decc617cd9ef22f1c9150b6b9387c5161cca3ce3774d28091 + md5: 371976809659c6d55e7f7c5e025d5a21 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + size: 3238820 + timestamp: 1747172377863 - conda: https://conda.anaconda.org/conda-forge/noarch/cython-lint-0.16.6-pyhff2d567_0.conda sha256: b8be28885737768620425c3f256c74017d9811fc086f705f5280b2b7bd59536c md5: 2d640ab1e2fd57f59e2cd078bc67d99e @@ -3041,10 +2993,10 @@ packages: purls: [] size: 140050 timestamp: 1743431809745 -- pypi: . +- pypi: ./ name: fastcan version: 0.3.2 - sha256: a518cdeaefefe0fbc7abc8949eedb645b83cdb0e233219c7b84c510cddb7ae21 + sha256: 9c0571618f9cac84aeba88048b82e830342f1997cab28b05db5e2bca210b8599 requires_dist: - scikit-learn>=1.6.0 - furo ; extra == 'docs' @@ -4800,6 +4752,15 @@ packages: purls: [] size: 561294 timestamp: 1746653898484 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.5-hf95d169_0.conda + sha256: 9003bd12988a54713602999999737590f3b023b0cadb2b316cd3ac256d6740d6 + md5: 9dde68cee0a231b19e189954ac29027b + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 562408 + timestamp: 1747262455533 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.4-ha82da77_1.conda sha256: 365c2c7bd017ebb8d3605b2f5c23bac7b35e2de8f26ddc46552fa6b4c61c6c13 md5: 85be146c49d0a2f6ca59cf4c8b58db47 @@ -4810,6 +4771,15 @@ packages: purls: [] size: 567046 timestamp: 1746653977544 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.5-ha82da77_0.conda + sha256: 2765b6e23da91807ce2ed44587fbaadd5ba933b0269810b3c22462f9582aedd3 + md5: 4ef1bdb94d42055f511bb358f2048c58 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568010 + timestamp: 1747262879889 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda sha256: cb3cce2b312aa1fb7391672807001bbab4d6e2deb16d912caecf6219f58ee1f4 md5: a9513c41f070a9e2d5c370ba5d6c0c00 @@ -7361,15 +7331,6 @@ packages: - pkg:pypi/parso?source=hash-mapping size: 75295 timestamp: 1733271352153 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee - md5: 617f15191456cc6a13db418a275435e5 - depends: - - python >=3.9 - license: MPL-2.0 - license_family: MOZILLA - size: 41075 - timestamp: 1733233471940 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda sha256: 09717569649d89caafbf32f6cda1e65aef86e5a86c053d30e4ce77fca8d27b68 md5: 31614c73d7b103ef76faa4d83d261d34 @@ -8759,9 +8720,9 @@ packages: - pkg:pypi/rpds-py?source=hash-mapping size: 255547 timestamp: 1743037492141 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.8-py313h22842b3_0.conda - sha256: 7d0af5acc433527e9b3c5e186c9362cc5b7a9e394b28fbec5d62a269cdcc7316 - md5: 44c26d389f8ca7021164652849b49598 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.9-py313h22842b3_0.conda + sha256: b560f202f5940857b7a25e708a1734522de59bb024011e45408242bfcd21a22f + md5: 3dc9b639c9a5915d48dd69161f6c8a49 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8772,11 +8733,11 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT - size: 9195304 - timestamp: 1746123693954 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.8-py312h60e8e2e_0.conda - sha256: 13429a5e90436c82530a0da3dae9c51aaa29d2bd9f5d6977928445798ceffb59 - md5: 8ad1f9fa080144b2efd5a4d2fc5dca82 + size: 9211172 + timestamp: 1746841218728 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.9-py312h60e8e2e_0.conda + sha256: 04f11dd2c4dcc9a881a7d25818f4aa7b04654c4853d2101053701476abfef1a4 + md5: 49736f343a261ee7c73103548614ebd7 depends: - __osx >=10.13 - libcxx >=18 @@ -8786,11 +8747,11 @@ packages: - __osx >=10.13 license: MIT license_family: MIT - size: 8585161 - timestamp: 1746124127838 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.8-py313hd3a9b03_0.conda - sha256: 08b2053648f09b270b90e091a40e4f7dea668c68129848a9c6784d6d9926f17e - md5: 2ca5ff0de9dcca7d3f2b03f564074d56 + size: 8629558 + timestamp: 1746841407034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.9-py313hd3a9b03_0.conda + sha256: e79d09aad227c97e7a8875865fa2553b076fdc3d8fd3fd4bb173a7fb7169df17 + md5: a4e3b2f0cd18bc670201877ed3e81086 depends: - __osx >=11.0 - libcxx >=18 @@ -8801,11 +8762,11 @@ packages: - __osx >=11.0 license: MIT license_family: MIT - size: 8171789 - timestamp: 1746123877403 -- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.8-py313h9f3c1d7_0.conda - sha256: 6b37401392d54ee33778827a97d8dbff4c0196ba495a6cdbf239046c9e670e79 - md5: 1d194c5252ed0adb14d0fc05168c6142 + size: 8194821 + timestamp: 1746841562098 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.9-py313h9f3c1d7_0.conda + sha256: 5dc8a7428b8681376c351adbfa88a590ffa52fb2760923bbb6f8dc94f91cbfe1 + md5: cb6ca8d853dea68725b7aa1b93c886e3 depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 @@ -8814,8 +8775,8 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 8261537 - timestamp: 1746124842258 + size: 8273013 + timestamp: 1746841801808 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.7.dev0/scikit_learn-1.7.dev0-cp313-cp313t-macosx_10_13_x86_64.whl name: scikit-learn version: 1.7.dev0 diff --git a/pyproject.toml b/pyproject.toml index fcd8d29..d28af89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,16 +63,13 @@ pytest = "*" pytest-cov = "*" pandas = "*" -[tool.pixi.feature.fmt.dependencies] -black = "*" - -[tool.pixi.feature.lint.dependencies] +[tool.pixi.feature.static.dependencies] +# Static analysis tools ruff = "*" cython-lint = "*" - -[tool.pixi.feature.type.dependencies] mypy = "*" + [tool.pixi.feature.build.dependencies] python-build = "*" pip = "*" @@ -113,14 +110,10 @@ rebuild = "rm -rf build && pip install --no-deps --force-reinstall -e ." [tool.pixi.feature.build.target.win-64.tasks] rebuild = "rm -rf build && pip install --no-deps --force-reinstall -e . -Csetup-args=--vsenv" -[tool.pixi.feature.fmt.tasks] -fmt = { cmd = "black .", cwd = "fastcan" } - -[tool.pixi.feature.lint.tasks] +[tool.pixi.feature.static.tasks] +fmt = "ruff format" lint = "ruff check . --fix" cython-lint = { cmd = "cython-lint .", cwd = "fastcan" } - -[tool.pixi.feature.type.tasks] type = { cmd = "mypy . --ignore-missing-imports", cwd = "fastcan" } [tool.pixi.feature.docs.tasks] @@ -144,7 +137,7 @@ nogil-build = { cmd = "pip install --editable . --verbose --no-build-isolation - [tool.pixi.environments] dev = ["docs", "test", "build", "jupyter"] -lint = { features = ["fmt", "lint", "type"], no-default-feature = true } +static = { features = ["static"], no-default-feature = true } nogil = { features = ["nogil"], no-default-feature = true } [tool.black] @@ -166,7 +159,6 @@ exclude = ''' ''' [tool.ruff] -# max line length for black line-length = 88 exclude = [ @@ -183,16 +175,40 @@ exclude = [ preview = true # This enables us to use the explicit preview rules that we want only explicit-preview-rules = true -# all rules can be found here: https://beta.ruff.rs/docs/rules/ -select = ["E", "F", "W", "I", "CPY001"] - -ignore = [ - # space before : (needed for how black formats slicing) - "E203", +# all rules can be found here: https://docs.astral.sh/ruff/rules/ +extend-select = ["E501", "W", "I", "CPY001", "PGH", "RUF"] +ignore=[ # do not assign a lambda expression, use a def "E731", # do not use variables named 'l', 'O', or 'I' "E741", + # E721 gives many false positives. + # Use `is` and `is not` for type comparisons, or `isinstance()` for + # isinstance checks + "E721", + # We don't care much about F841. + # Local variable ... is assigned to but never used + "F841", + # some RUF rules trigger too many changes + "RUF002", + "RUF003", + "RUF005", + "RUF012", + "RUF015", + "RUF021", + # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules + "W191", + "E111", + "E114", + "E117", + "D206", + "D300", + "Q000", + "Q001", + "Q002", + "Q003", + "COM812", + "COM819", ] [tool.ruff.lint.flake8-copyright] @@ -205,17 +221,15 @@ notice-rgx = "\\#\\ Authors:\\ The\\ fastcan\\ developers\\\r?\\\n\\#\\ SPDX\\-L "doc/conf.py" = ["E402"] "tests/*" = ["CPY001"] "doc/*" = ["CPY001"] - +".github/*"=["CPY001"] [tool.cython-lint] # Ignore the same error codes as ruff # + E501 (line too long) because keeping it < 88 in cython # often makes code less readable. -lint.ignore = [ +ignore = [ # multiple spaces/tab after comma 'E24', - # space before : (needed for how black formats slicing) - 'E203', # line too long 'E501', # do not assign a lambda expression, use a def diff --git a/tests/test_fastcan.py b/tests/test_fastcan.py index a8c4475..380ede3 100644 --- a/tests/test_fastcan.py +++ b/tests/test_fastcan.py @@ -18,6 +18,7 @@ def test_fastcan_is_sklearn_estimator(): check_estimator(FastCan()) + def test_select_kbest_classif(): # Test whether the relative univariate feature selection # gets the correct items in a simple classification problem @@ -58,6 +59,7 @@ def test_select_kbest_classif(): gtruth[:n_informative] = 1 assert_array_equal(support, gtruth) + def test_indices_include_exclude(): # Test whether fastcan can select informative features based # on some pre-include features and pre-exclude features @@ -78,12 +80,10 @@ def test_indices_include_exclude(): ) include_filter = FastCan( - n_features_to_select=n_informative, - indices_include=indices_params + n_features_to_select=n_informative, indices_include=indices_params ) exclude_filter = FastCan( - n_features_to_select=n_informative, - indices_exclude=indices_params + n_features_to_select=n_informative, indices_exclude=indices_params ) include_filter.fit(X, y) exclude_filter.fit(X, y) @@ -96,6 +96,7 @@ def test_indices_include_exclude(): gtruth[indices_params] = 0 assert_array_equal(exclude_support[:n_informative], gtruth[:n_informative]) + def test_ssc_consistent_with_cca(): # Test whether the ssc got from the fastcan is consistent # with the ssc got from CCA @@ -127,6 +128,7 @@ def test_ssc_consistent_with_cca(): ssc = correlation_filter.scores_.sum() assert_almost_equal(actual=ssc, desired=gtruth_ssc) + def test_h_eta_consistency(): # Test whether the ssc got from h-correlation is # consistent with the ssc got from eta-cosine @@ -146,25 +148,20 @@ def test_h_eta_consistency(): random_state=0, ) - h_correlation = FastCan( - n_features_to_select=n_to_select, - eta=False - ) - eta_cosine = FastCan( - n_features_to_select=n_to_select, - eta=True - ) + h_correlation = FastCan(n_features_to_select=n_to_select, eta=False) + eta_cosine = FastCan(n_features_to_select=n_to_select, eta=True) h_correlation.fit(X, y) eta_cosine.fit(X, y) assert_array_almost_equal(h_correlation.scores_, eta_cosine.scores_) + def test_raise_errors(): # Test whether fastcan raise errors properly n_samples = 20 n_features = 20 n_classes = 10 n_informative = 15 - n_redundant = n_features-n_informative + n_redundant = n_features - n_informative X, y = make_classification( n_samples=n_samples, @@ -178,25 +175,21 @@ def test_raise_errors(): ) selector_n_select = FastCan( - n_features_to_select=n_features+1, + n_features_to_select=n_features + 1, ) selector_n_inclusions = FastCan( - n_features_to_select=n_features, - indices_include=range(n_features+1) + n_features_to_select=n_features, indices_include=range(n_features + 1) ) selector_eta_for_small_size_samples = FastCan( - n_features_to_select=n_features, - eta=True + n_features_to_select=n_features, eta=True ) selector_indices_include_bounds = FastCan( - n_features_to_select=n_features, - indices_include=[-1] + n_features_to_select=n_features, indices_include=[-1] ) selector_indices_include_ndim = FastCan( - n_features_to_select=n_features, - indices_include=[[0]] + n_features_to_select=n_features, indices_include=[[0]] ) selector_include_exclude_intersect = FastCan( @@ -247,13 +240,13 @@ def test_cython_errors(): x_sub = rng.random((n_samples, n_informative)) y = rng.random((n_samples)) - selector_no_cand = FastCan( - n_features_to_select=n_informative+1, + n_features_to_select=n_informative + 1, ) with pytest.raises(RuntimeError, match=r"No candidate feature can .*"): # No candidate - selector_no_cand.fit(np.c_[x_sub, x_sub[:, 0]+x_sub[:, 1]], y) + selector_no_cand.fit(np.c_[x_sub, x_sub[:, 0] + x_sub[:, 1]], y) + test_indices_include_exclude() diff --git a/tests/test_init.py b/tests/test_init.py index d7f82e0..4b2ed01 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,8 +1,7 @@ -# ruff: noqa """Basic unittests to test functioning of module's top-level""" try: - from fastcan import * + from fastcan import * # noqa: F403 _TOP_IMPORT_ERROR = None diff --git a/tests/test_minibatch.py b/tests/test_minibatch.py index c650ecd..b5b3a3b 100644 --- a/tests/test_minibatch.py +++ b/tests/test_minibatch.py @@ -1,4 +1,5 @@ """Test feature selection with mini-batch""" + import numpy as np import pytest from sklearn.cluster import KMeans @@ -21,14 +22,11 @@ def test_data_pruning(): random_state=random_state, ).fit(X) atoms = kmeans.cluster_centers_ - indices = minibatch( - X.T, atoms.T, n_to_select, batch_size=batch_size, verbose=0 - ) + indices = minibatch(X.T, atoms.T, n_to_select, batch_size=batch_size, verbose=0) assert np.unique(indices).size == n_to_select assert indices.size == n_to_select - def test_select_minibatch_cls(): # Test whether refine work correctly with random samples. n_samples = 200 @@ -61,6 +59,7 @@ def test_select_minibatch_cls(): assert np.unique(indices).size == n_to_select assert indices.size == n_to_select + def test_minibatch_error(): # Test refine raise error. n_samples = 200 @@ -83,4 +82,4 @@ def test_minibatch_error(): ) with pytest.raises(ValueError, match=r"n_features_to_select .*"): - _ = minibatch(X, y, n_features+1, batch_size=3) + _ = minibatch(X, y, n_features + 1, batch_size=3) diff --git a/tests/test_narx.py b/tests/test_narx.py index 339affe..26e827f 100644 --- a/tests/test_narx.py +++ b/tests/test_narx.py @@ -58,12 +58,12 @@ def test_narx(nan, multi_output): ) y1[i] = ( 0.6 * y1[i - 1] - - 0.2 * y0[i - 1]*y1[i - 2] + - 0.2 * y0[i - 1] * y1[i - 2] + 0.3 * u1[i] ** 2 + 1.5 * u1[i - 2] * u0[i - 3] + 0.5 ) - y = np.c_[y0[max_delay:]+e0, y1[max_delay:]+e1] + y = np.c_[y0[max_delay:] + e0, y1[max_delay:] + e1] X = np.c_[u0[max_delay:], u1[max_delay:]] n_outputs = 2 else: @@ -122,7 +122,7 @@ def test_narx(nan, multi_output): narx_default = make_narx(X=X, y=y, **params) if multi_output: - assert narx_default.feat_ids.shape[0] == params["n_terms_to_select"]*2 + assert narx_default.feat_ids.shape[0] == params["n_terms_to_select"] * 2 else: assert narx_default.feat_ids.shape[0] == params["n_terms_to_select"] @@ -159,9 +159,9 @@ def test_narx(nan, multi_output): else: output_ids = None feat_ids, delay_ids = tp2fd(time_shift_ids, poly_ids) - narx_osa = NARX( - feat_ids=feat_ids, delay_ids=delay_ids, output_ids=output_ids - ).fit(X, y) + narx_osa = NARX(feat_ids=feat_ids, delay_ids=delay_ids, output_ids=output_ids).fit( + X, y + ) assert narx_osa.coef_.size == poly_ids.shape[0] narx_osa_msa = narx_drop.fit(X, y, coef_init="one_step_ahead") narx_osa_msa_coef = narx_osa_msa.coef_ @@ -176,7 +176,7 @@ def test_narx(nan, multi_output): else: y_init = [1] * narx_array_init_msa.max_delay_ y_hat = narx_array_init_msa.predict(X, y_init=y_init) - assert_array_equal(y_hat[:narx_array_init_msa.max_delay_], y_init) + assert_array_equal(y_hat[: narx_array_init_msa.max_delay_], y_init) with pytest.raises(ValueError, match=r"`coef_init` should have the shape of .*"): narx_array_init_msa.fit(X, y, coef_init=np.zeros(narx_osa_msa_coef.size)) @@ -258,7 +258,9 @@ def test_mulit_output_warn(): narx = NARX(feat_ids=feat_ids, delay_ids=delay_ids) narx.fit(X, y) y_pred = narx.predict(X) - assert_almost_equal(np.std(y_pred[narx.max_delay_:, 1] - np.mean(y[:, 1])), 0.0) + assert_almost_equal( + np.std(y_pred[narx.max_delay_ :, 1] - np.mean(y[:, 1])), 0.0 + ) X_nan = np.copy(X) y_nan = np.copy(y) @@ -270,12 +272,13 @@ def test_mulit_output_warn(): y_nan_masked, y_pred_masked = mask_missing_values(y_nan, y_pred) assert_almost_equal( np.std( - y_pred_masked[y_pred_masked[:, 0]!=0, 1] -\ - np.mean(y_nan_masked[:, 1]) + y_pred_masked[y_pred_masked[:, 0] != 0, 1] + - np.mean(y_nan_masked[:, 1]) ), 0.0, ) + def test_fit_intercept(): X = np.random.rand(10, 2) y = np.random.rand(10, 1) @@ -316,6 +319,7 @@ def test_fit_intercept(): narx.fit(X, y, coef_init=[0, 0]) assert_array_equal(narx.intercept_, [0.0, 0.0]) + def test_mulit_output_error(): X = np.random.rand(10, 2) y = np.random.rand(10, 2) @@ -325,20 +329,20 @@ def test_mulit_output_error(): with pytest.raises(ValueError, match="The length of output_ids should"): narx = NARX( - feat_ids=feat_ids, - delay_ids=delay_ids, - output_ids=[0], - ) + feat_ids=feat_ids, + delay_ids=delay_ids, + output_ids=[0], + ) narx.fit(X, y) with pytest.raises( ValueError, match=r"The element x of output_ids should satisfy 0 <=.*" ): narx = NARX( - feat_ids=feat_ids, - delay_ids=delay_ids, - output_ids=[0, 2], - ) + feat_ids=feat_ids, + delay_ids=delay_ids, + output_ids=[0, 2], + ) narx.fit(X, y) with pytest.raises(ValueError, match="The length of `n_terms_to_select` should"): @@ -409,20 +413,18 @@ def test_sample_weight(): X_repeated = np.repeat(X, sw, axis=0) y_repeated = np.repeat(y, sw) narx_osa = NARX().fit(X_repeated, y_repeated) - narx_no_sw = NARX().fit(X_repeated, y_repeated, coef_init=[0]*3) + narx_no_sw = NARX().fit(X_repeated, y_repeated, coef_init=[0] * 3) assert_allclose( np.r_[narx_osa.coef_, narx_osa.intercept_], - np.r_[narx_no_sw.coef_, narx_no_sw.intercept_] - ) - narx_sw = NARX().fit( - X, y, sample_weight=sw, - coef_init=[0]*3 + np.r_[narx_no_sw.coef_, narx_no_sw.intercept_], ) + narx_sw = NARX().fit(X, y, sample_weight=sw, coef_init=[0] * 3) assert_allclose( np.r_[narx_no_sw.coef_, narx_no_sw.intercept_], - np.r_[narx_sw.coef_, narx_sw.intercept_] + np.r_[narx_sw.coef_, narx_sw.intercept_], ) + def test_divergence(): # Test divergence of NARX model rng = np.random.default_rng(12345) @@ -445,7 +447,8 @@ def test_divergence(): narx = make_narx(X, y, 3, 3, 2) narx.fit(X, y, coef_init=[-10, 0, 0, 0]) y_hat = narx.predict(X, y) - assert np.all(y_hat<=1e20) + assert np.all(y_hat <= 1e20) + def test_tp2fd(): time_shift_ids = np.array( @@ -491,6 +494,7 @@ def test_tp2fd(): with pytest.raises(ValueError, match=r"The element x of poly_ids should.*"): _, _ = tp2fd(time_shift_ids, poly_ids) + def test_print_narx(capsys): X = np.random.rand(10, 2) y = np.random.rand(10, 2) diff --git a/tests/test_narx_jac.py b/tests/test_narx_jac.py index 3ce2e68..f049741 100644 --- a/tests/test_narx_jac.py +++ b/tests/test_narx_jac.py @@ -1,11 +1,11 @@ """Test Jacobian matrix of NARX""" import numpy as np +from fastcan._narx_fast import _predict_step # type: ignore[attr-defined] from numpy.testing import assert_allclose, assert_almost_equal, assert_array_equal from scipy.integrate import odeint from sklearn.metrics import r2_score -from fastcan._narx_fast import _predict_step # type: ignore from fastcan.narx import NARX, make_narx @@ -26,7 +26,6 @@ def test_simple(): intercept = np.array([1], dtype=float) sample_weight = np.array([1, 1, 1], dtype=float).reshape(-1, 1) - y_hat = NARX._predict( _predict_step, X=X, @@ -41,7 +40,7 @@ def test_simple(): assert_array_equal(y_hat, y) delta_w = 0.00001 - coef_1 = np.array([0.4+delta_w, 1]) + coef_1 = np.array([0.4 + delta_w, 1]) y_hat_1 = NARX._predict( _predict_step, @@ -54,12 +53,17 @@ def test_simple(): output_ids=output_ids, ) - grad_truth = np.array([ - np.sum(np.array([0, y_hat_1[0, 0], y_hat_1[1, 0]+coef_1[0]]).reshape(-1, 1)), - np.sum(np.array([0, X[0, 0], X[0, 0]*coef_1[0]+X[0, 0]]).reshape(-1, 1)), - np.sum(np.array([0, 1, coef_1[0]+1]).reshape(-1, 1)), - ]) - + grad_truth = np.array( + [ + np.sum( + np.array([0, y_hat_1[0, 0], y_hat_1[1, 0] + coef_1[0]]).reshape(-1, 1) + ), + np.sum( + np.array([0, X[0, 0], X[0, 0] * coef_1[0] + X[0, 0]]).reshape(-1, 1) + ), + np.sum(np.array([0, 1, coef_1[0] + 1]).reshape(-1, 1)), + ] + ) grad_yyd_ids, grad_coef_ids, grad_feat_ids, grad_delay_ids = NARX._get_cfd_ids( feat_ids, delay_ids, output_ids, 1 @@ -113,6 +117,7 @@ def test_simple(): ) assert_almost_equal(grad.sum(axis=0), grad_0.sum(axis=0)[:-1]) + def test_complex(): """Complex model""" # Simulated model @@ -156,7 +161,7 @@ def test_complex(): [1, 1], [1, 0], ], - dtype=np.int32 + dtype=np.int32, ) delay_ids = np.array( @@ -171,7 +176,7 @@ def test_complex(): [0, 0], [2, 3], ], - dtype=np.int32 + dtype=np.int32, ) output_ids = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=np.int32) @@ -226,7 +231,7 @@ def test_complex(): e_0 = y_hat_0 - y delta_w = 0.00001 - for i in range(len(coef)+len(intercept)): + for i in range(len(coef) + len(intercept)): if i < len(coef): coef_1 = np.copy(coef) coef_1[i] += delta_w @@ -234,7 +239,7 @@ def test_complex(): else: coef_1 = np.copy(coef) intercept_1 = np.copy(intercept) - intercept_1[i-len(coef)] += delta_w + intercept_1[i - len(coef)] += delta_w y_hat_1 = NARX._predict( _predict_step, @@ -299,8 +304,10 @@ def test_complex(): assert_allclose(grad.sum(axis=0)[i], grad_num.sum(), rtol=1e-1) + def test_score_nan(): """Test fitting scores when data contain nan.""" + def duffing_equation(y, t): """Non-autonomous system""" y1, y2 = y @@ -308,7 +315,6 @@ def duffing_equation(y, t): dydt = [y2, -0.1 * y2 + y1 - 0.25 * y1**3 + u] return dydt - dur = 10 n_samples = 1000 diff --git a/tests/test_refine.py b/tests/test_refine.py index 37ee701..3a0dfb6 100644 --- a/tests/test_refine.py +++ b/tests/test_refine.py @@ -1,4 +1,5 @@ """Test refine""" + import pytest from sklearn.datasets import make_classification @@ -38,7 +39,7 @@ def test_select_refine_cls(): assert selector.scores_.sum() <= scores_1.sum() assert selector.scores_.sum() <= scores_23.sum() assert selector.scores_.sum() <= scores_all.sum() - assert (indices_inc[0]==1) and (indices_inc[1]==5) + assert (indices_inc[0] == 1) and (indices_inc[1] == 5) def test_refine_error(): diff --git a/tests/test_utils.py b/tests/test_utils.py index 8baf0e9..8d57c73 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -16,23 +16,27 @@ def test_sum_errs(): indices, scores = ols(X, y, 5) - y_hat = LinearRegression(fit_intercept=False)\ - .fit(X[:, indices], y)\ - .predict(X[:, indices]) - e = y-y_hat + y_hat = ( + LinearRegression(fit_intercept=False) + .fit(X[:, indices], y) + .predict(X[:, indices]) + ) + e = y - y_hat # Sum of Error Reduction Ratio - serrs = 1 - np.dot(e, e)/np.dot(y, y) + serrs = 1 - np.dot(e, e) / np.dot(y, y) assert_almost_equal(actual=scores.sum(), desired=serrs) + def test_pearson_r(): """Test Pearson's correlation.""" rng = np.random.default_rng(12345) X = rng.random(100) y = rng.random(100) r2 = ssc(X.reshape(-1, 1), y.reshape(-1, 1)) - gtruth_r2 = np.corrcoef(X, y)[0, 1]**2 + gtruth_r2 = np.corrcoef(X, y)[0, 1] ** 2 assert_almost_equal(actual=r2, desired=gtruth_r2) + def test_multi_r(): """Test multiple correlation.""" rng = np.random.default_rng(12345) @@ -48,6 +52,7 @@ def test_multi_r(): gtruth_r2 = LinearRegression().fit(y, X).score(y, X) assert_almost_equal(actual=r2, desired=gtruth_r2) + def test_mask_missing(): """Test mask missing values.""" assert mask_missing_values() is None