diff --git a/.coveragerc b/.coveragerc index f4dcf79b5..a473c0c00 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,21 +1,13 @@ -# Configuration for coverage.py - [run] branch = True -source = imblearn -include = */imblearn/* -omit = - */setup.py [report] exclude_lines = - pragma: no cover - def __repr__ if self.debug: - if settings.DEBUG - raise AssertionError + pragma: no cover raise NotImplementedError - if 0: - if __name__ == .__main__.: - if self.verbose: -show_missing = True \ No newline at end of file +ignore_errors = True +omit = + */tests/* + **/setup.py + **/_sklearn_compat.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 67be91051..000000000 --- a/.flake8 +++ /dev/null @@ -1,8 +0,0 @@ -[flake8] -max-line-length = 88 -# Default flake8 3.5 ignored flags -ignore=E121,E123,E126,E226,E24,E704,W503,W504,E203 -# It's fine not to put the import at the top of the file in the examples -# folder. -per-file-ignores = - examples/*: E402 diff --git a/.github/ISSUE_TEMPLATE/other--blank-template-.md b/.github/ISSUE_TEMPLATE/other--blank-template-.md index 5db6bc2b3..157c35a0b 100644 --- a/.github/ISSUE_TEMPLATE/other--blank-template-.md +++ b/.github/ISSUE_TEMPLATE/other--blank-template-.md @@ -6,5 +6,3 @@ labels: '' assignees: '' --- - - diff --git a/.github/check-changelog.yml b/.github/check-changelog.yml new file mode 100644 index 000000000..2bb23f374 --- /dev/null +++ b/.github/check-changelog.yml @@ -0,0 +1,68 @@ +name: Check Changelog +# This check makes sure that the changelog is properly updated +# when a PR introduces a change in a test file. +# To bypass this check, label the PR with "No Changelog Needed". +on: + pull_request: + types: [opened, edited, labeled, unlabeled, synchronize] + +jobs: + check: + name: A reviewer will let you know if it is required or can be bypassed + runs-on: ubuntu-latest + if: ${{ contains(github.event.pull_request.labels.*.name, 'No Changelog Needed') == 0 }} + steps: + - name: Get PR number and milestone + run: | + echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV + echo "TAGGED_MILESTONE=${{ github.event.pull_request.milestone.title }}" >> $GITHUB_ENV + - uses: actions/checkout@v4 + with: + fetch-depth: '0' + - name: Check the changelog entry + run: | + set -xe + changed_files=$(git diff --name-only origin/main) + # Changelog should be updated only if tests have been modified + if [[ ! "$changed_files" =~ tests ]] + then + exit 0 + fi + all_changelogs=$(cat ./doc/whats_new/v*.rst) + if [[ "$all_changelogs" =~ :pr:\`$PR_NUMBER\` ]] + then + echo "Changelog has been updated." + # If the pull request is milestoned check the correspondent changelog + if exist -f ./doc/whats_new/v${TAGGED_MILESTONE:0:4}.rst + then + expected_changelog=$(cat ./doc/whats_new/v${TAGGED_MILESTONE:0:4}.rst) + if [[ "$expected_changelog" =~ :pr:\`$PR_NUMBER\` ]] + then + echo "Changelog and milestone correspond." + else + echo "Changelog and milestone do not correspond." + echo "If you see this error make sure that the tagged milestone for the PR" + echo "and the edited changelog filename properly match." + exit 1 + fi + fi + else + echo "A Changelog entry is missing." + echo "" + echo "Please add an entry to the changelog at 'doc/whats_new/v*.rst'" + echo "to document your change assuming that the PR will be merged" + echo "in time for the next release of imbalanced-learn." + echo "" + echo "Look at other entries in that file for inspiration and please" + echo "reference this pull request using the ':pr:' directive and" + echo "credit yourself (and other contributors if applicable) with" + echo "the ':user:' directive." + echo "" + echo "If you see this error and there is already a changelog entry," + echo "check that the PR number is correct." + echo "" + echo "If you believe that this PR does not warrant a changelog" + echo "entry, say so in a comment so that a maintainer will label" + echo "the PR with 'No Changelog Needed' to bypass this check." + exit 1 + fi diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..b3340cd26 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions as recommended in SPEC8: + # https://github.com/scientific-python/specs/pull/325 + # At the time of writing, release critical workflows such as + # pypa/gh-action-pypi-publish should use hash-based versioning for security + # reasons. This strategy may be generalized to all other github actions + # in the future. + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + patterns: + - "*" + reviewers: + - "glemaitre" diff --git a/.github/workflows/circleci-artifacts-redirector.yml b/.github/workflows/circleci-artifacts-redirector.yml index 71f0cd932..8831cc4c5 100644 --- a/.github/workflows/circleci-artifacts-redirector.yml +++ b/.github/workflows/circleci-artifacts-redirector.yml @@ -1,14 +1,25 @@ -name: circleci-artifacts-redirector +name: CircleCI artifacts redirector on: [status] + +# Restrict the permissions granted to the use of secrets.GITHUB_TOKEN in this +# github actions workflow: +# https://docs.github.com/en/actions/security-guides/automatic-token-authentication +permissions: + statuses: write + jobs: circleci_artifacts_redirector_job: runs-on: ubuntu-latest + # For testing this action on a fork, remove the "github.repository =="" condition. + if: "github.repository == 'scikit-learn-contrib/imbalanced-learn' && github.event.context == 'ci/circleci: doc'" name: Run CircleCI artifacts redirector steps: - name: GitHub Action step - uses: larsoner/circleci-artifacts-redirector-action@master + uses: scientific-python/circleci-artifacts-redirector-action@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - artifact-path: doc/index.html - circleci-jobs: documentation + api-token: ${{ secrets.CIRCLE_CI }} + artifact-path: 0/doc/index.html + circleci-jobs: doc + job-title: Check the rendered docs here! diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml new file mode 100644 index 000000000..f78d4a747 --- /dev/null +++ b/.github/workflows/linters.yml @@ -0,0 +1,24 @@ +name: Run code format checks + +on: + push: + branches: + - "main" + pull_request: + branches: + - '*' + +jobs: + run-pre-commit-checks: + name: Run pre-commit checks + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: prefix-dev/setup-pixi@v0.8.14 + with: + pixi-version: v0.51.0 + frozen: true + + - name: Run tests + run: pixi run -e linters linters diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..f93eae909 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,56 @@ +name: 'tests' + +on: + push: + branches: + - "main" + pull_request: + branches: + - '*' + +jobs: + test: + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + environment: [ + ci-py310-min-dependencies, + ci-py310-min-optional-dependencies, + ci-py310-min-keras, + ci-py310-min-tensorflow, + ci-py311-sklearn-1-4, + ci-py311-sklearn-1-5, + ci-py312-sklearn-1-6, + ci-py311-latest-keras, + ci-py311-latest-tensorflow, + ci-py313-latest-dependencies, + ci-py313-latest-optional-dependencies, + ] + exclude: + - os: windows-latest + environment: ci-py310-min-keras + - os: windows-latest + environment: ci-py310-min-tensorflow + - os: windows-latest + environment: ci-py311-latest-keras + - os: windows-latest + environment: ci-py311-latest-tensorflow + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: prefix-dev/setup-pixi@v0.8.14 + with: + pixi-version: v0.51.0 + environments: ${{ matrix.environment }} + # we can freeze the environment and manually bump the dependencies to the + # latest version time to time. + frozen: true + + - name: Run tests + run: pixi run -e ${{ matrix.environment }} tests -n 3 + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v5.4.3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: scikit-learn-contrib/imbalanced-learn diff --git a/.gitignore b/.gitignore index c6c5ae3ec..c1ccc9afd 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,10 @@ doc/min_dependency_table.rst # MacOS .DS_Store + +# Pixi folder +.pixi/ + +# Generated files +doc/min_dependency_substitutions.rst +doc/sg_execution_times.rst diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d76915517..1b810970b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,19 +5,13 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace -- repo: https://github.com/psf/black - rev: 23.3.0 - hooks: - - id: black - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.272 + rev: v0.4.8 hooks: - id: ruff - args: ["--fix", "--show-source"] -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.3.0 + args: ["--fix", "--output-format=full"] +- repo: https://github.com/psf/black + rev: 23.3.0 hooks: - - id: mypy - files: imblearn/ - additional_dependencies: [pytest==6.2.4] + - id: black diff --git a/Makefile b/Makefile deleted file mode 100644 index cb8e8e773..000000000 --- a/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -.PHONY: all clean test - -clean: - find . -name "*.so" -o -name "*.pyc" -o -name "*.md5" -o -name "*.pyd" -o -name "*~" | xargs rm -f - find . -name "*.pyx" -exec ./tools/rm_pyx_c_file.sh {} \; - rm -rf coverage - rm -rf dist - rm -rf build - rm -rf doc/_build - rm -rf doc/auto_examples - rm -rf doc/generated - rm -rf doc/modules - rm -rf examples/.ipynb_checkpoints - -test-code: - pytest imblearn - -test-doc: - pytest doc/*.rst - -test-coverage: - rm -rf coverage .coverage - pytest --cov=imblearn imblearn - -test: test-coverage test-doc - -html: - export SPHINXOPTS=-W; make -C doc html - -conda: - conda-build conda-recipe - -code-analysis: - flake8 imblearn | grep -v __init__ - pylint -E imblearn/ -d E1103,E0611,E1101 diff --git a/README.rst b/README.rst index 84c741d3a..6a75694ce 100644 --- a/README.rst +++ b/README.rst @@ -4,10 +4,10 @@ .. _scikit-learn-contrib: https://github.com/scikit-learn-contrib -|Azure|_ |Codecov|_ |CircleCI|_ |PythonVersion|_ |Pypi|_ |Gitter|_ |Black|_ +|GitHubActions|_ |Codecov|_ |CircleCI|_ |PythonVersion|_ |Pypi|_ |Gitter|_ |Black|_ -.. |Azure| image:: https://dev.azure.com/imbalanced-learn/imbalanced-learn/_apis/build/status/scikit-learn-contrib.imbalanced-learn?branchName=master -.. _Azure: https://dev.azure.com/imbalanced-learn/imbalanced-learn/_build +.. |GitHubActions| image:: https://github.com/scikit-learn-contrib/imbalanced-learn/actions/workflows/tests.yml/badge.svg +.. _GitHubActions: https://github.com/scikit-learn-contrib/imbalanced-learn/actions/workflows/tests.yml .. |Codecov| image:: https://codecov.io/gh/scikit-learn-contrib/imbalanced-learn/branch/master/graph/badge.svg .. _Codecov: https://codecov.io/gh/scikit-learn-contrib/imbalanced-learn @@ -27,16 +27,16 @@ .. |Black| image:: https://img.shields.io/badge/code%20style-black-000000.svg .. _Black: :target: https://github.com/psf/black -.. |PythonMinVersion| replace:: 3.8 -.. |NumPyMinVersion| replace:: 1.17.3 -.. |SciPyMinVersion| replace:: 1.5.0 -.. |ScikitLearnMinVersion| replace:: 1.0.2 -.. |MatplotlibMinVersion| replace:: 3.1.2 -.. |PandasMinVersion| replace:: 1.0.5 -.. |TensorflowMinVersion| replace:: 2.4.3 -.. |KerasMinVersion| replace:: 2.4.3 -.. |SeabornMinVersion| replace:: 0.9.0 -.. |PytestMinVersion| replace:: 5.0.1 +.. |PythonMinVersion| replace:: 3.10 +.. |NumPyMinVersion| replace:: 1.25.2 +.. |SciPyMinVersion| replace:: 1.11.4 +.. |ScikitLearnMinVersion| replace:: 1.4.2 +.. |MatplotlibMinVersion| replace:: 3.7.3 +.. |PandasMinVersion| replace:: 2.0.3 +.. |TensorflowMinVersion| replace:: 2.16.1 +.. |KerasMinVersion| replace:: 3.3.3 +.. |SeabornMinVersion| replace:: 0.12.2 +.. |PytestMinVersion| replace:: 7.2.2 imbalanced-learn ================ @@ -66,6 +66,7 @@ Dependencies - NumPy (>= |NumPyMinVersion|) - SciPy (>= |SciPyMinVersion|) - Scikit-learn (>= |ScikitLearnMinVersion|) +- Pytest (>= |PytestMinVersion|) Additionally, `imbalanced-learn` requires the following optional dependencies: @@ -128,6 +129,21 @@ of the scikit-learn community. Therefore, you can refer to their `Development Guide `_. +Endorsement of the Scientific Python Specification +-------------------------------------------------- + +We endorse good practices from the Scientific Python Ecosystem Coordination (SPEC). +The full list of recommendations is available `here`_. + +See below the list of recommendations that we endorse for the imbalanced-learn project. + +|SPEC 0 — Minimum Supported Dependencies| + +.. |SPEC 0 — Minimum Supported Dependencies| image:: https://img.shields.io/badge/SPEC-0-green?labelColor=%23004811&color=%235CA038 + :target: https://scientific-python.org/specs/spec-0000/ + +.. _here: https://scientific-python.org/specs/ + About ----- diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 5c4218dec..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,308 +0,0 @@ -# Adapted from https://github.com/pandas-dev/pandas/blob/master/azure-pipelines.yml -schedules: -- cron: "30 2 * * *" - displayName: Run nightly build - branches: - include: - - main - always: true - -jobs: -- job: git_commit - displayName: Get Git Commit - pool: - vmImage: ubuntu-22.04 - steps: - - bash: | - set -ex - if [[ $BUILD_REASON == "PullRequest" ]]; then - # By default pull requests use refs/pull/PULL_ID/merge as the source branch - # which has a "Merge ID into ID" as a commit message. The latest commit - # message is the second to last commit - COMMIT_ID=$(echo $BUILD_SOURCEVERSIONMESSAGE | awk '{print $2}') - message=$(git log $COMMIT_ID -1 --pretty=%B) - else - message=$BUILD_SOURCEVERSIONMESSAGE - fi - echo "##vso[task.setvariable variable=message;isOutput=true]$message" - name: commit - displayName: Get source version message - -- job: linting - dependsOn: [git_commit] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[lint skip]')), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')) - ) - displayName: Linting - pool: - vmImage: ubuntu-22.04 - steps: - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.9' - - bash: | - # Include pytest compatibility with mypy - pip install flake8 pytest mypy==1.3.0 black==23.3 ruff==0.0.272 - displayName: Install linters - - bash: | - black --check --diff . - displayName: Run black - - bash: | - ruff check --show-source . - displayName: Run ruff - - bash: | - ./build_tools/azure/linting.sh - displayName: Run linting - - bash: | - mypy imblearn/ - displayName: Run mypy - -- template: build_tools/azure/posix.yml - parameters: - name: Linux_Nightly - vmImage: ubuntu-22.04 - dependsOn: [git_commit, linting] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), - or(eq(variables['Build.Reason'], 'Schedule'), - contains(dependencies['git_commit']['outputs']['commit.message'], '[scipy-dev]' - ) - ) - ) - matrix: - pylatest_pip_scipy_dev: - DISTRIB: 'conda-pip-scipy-dev' - PYTHON_VERSION: '*' - CHECK_WARNINGS: 'true' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - -# Will run all the time regardless of linting outcome. -- template: build_tools/azure/posix.yml - parameters: - name: Linux_Runs - vmImage: ubuntu-22.04 - dependsOn: [git_commit] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')) - ) - matrix: - pylatest_conda_forge_mkl: - DISTRIB: 'conda' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '*' - BLAS: 'mkl' - COVERAGE: 'true' - SHOW_SHORT_SUMMARY: 'true' - -# Check compilation with Ubuntu bionic 18.04 LTS and scipy from conda-forge -- template: build_tools/azure/posix.yml - parameters: - name: Ubuntu_Jammy_Jellyfish - vmImage: ubuntu-22.04 - dependsOn: [git_commit, linting] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), - ne(variables['Build.Reason'], 'Schedule') - ) - matrix: - py39_conda_forge_openblas_ubuntu_1804: - DISTRIB: 'conda' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.9' - BLAS: 'openblas' - COVERAGE: 'false' - -- template: build_tools/azure/posix.yml - parameters: - name: Linux - vmImage: ubuntu-22.04 - dependsOn: [linting, git_commit] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), - ne(variables['Build.Reason'], 'Schedule') - ) - matrix: - # Linux environment to test that scikit-learn can be built against - # versions of numpy, scipy with ATLAS that comes with Ubuntu Focal 20.04 - # i.e. numpy 1.17.4 and scipy 1.3.3 - ubuntu_atlas: - DISTRIB: 'ubuntu' - JOBLIB_VERSION: 'min' - PANDAS_VERSION: 'none' - THREADPOOLCTL_VERSION: 'min' - COVERAGE: 'false' - # Linux + Python 3.8 build with OpenBLAS and without SITE_JOBLIB - py38_conda_conda_forge_openblas: - DISTRIB: 'conda' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.8' - BLAS: 'openblas' - NUMPY_VERSION: '1.21.0' # we cannot get an older version of the dependencies resolution - SCIPY_VERSION: 'min' - SKLEARN_VERSION: 'min' - MATPLOTLIB_VERSION: 'none' - PANDAS_VERSION: 'none' - THREADPOOLCTL_VERSION: '2.2.0' - # Linux environment to test the latest available dependencies and MKL. - pylatest_pip_openblas_pandas: - DISTRIB: 'conda-pip-latest' - PYTHON_VERSION: '*' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'true' - # Test the intermediate version of scikit-learn - pylatest_pip_openblas_sklearn_intermediate: - DISTRIB: 'conda-pip-latest' - PYTHON_VERSION: '3.10' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'false' - SKLEARN_VERSION: '1.1.3' - pylatest_pip_openblas_sklearn_intermediate_bis: - DISTRIB: 'conda-pip-latest' - PYTHON_VERSION: '3.10' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'false' - SKLEARN_VERSION: '1.2.2' - pylatest_pip_tensorflow: - DISTRIB: 'conda-pip-latest-tensorflow' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.9' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'true' - COVERAGE: 'true' - pylatest_conda_tensorflow: - DISTRIB: 'conda-latest-tensorflow' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.9' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'true' - conda_tensorflow_minimum: - DISTRIB: 'conda-minimum-tensorflow' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.8' - NUMPY_VERSION: '1.19.5' # This version is the minimum requrired by tensorflow - SCIPY_VERSION: 'min' - SKLEARN_VERSION: 'min' - TENSORFLOW_VERSION: 'min' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'false' # it is going to fail because of scikit-learn inheritance - CHECK_WARNINGS: 'false' # in case the older version raise some FutureWarnings - pylatest_pip_keras: - DISTRIB: 'conda-pip-latest-keras' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.9' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'true' - COVERAGE: 'true' - pylatest_conda_keras: - DISTRIB: 'conda-latest-keras' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.9' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'true' - CHECK_WARNINGS: 'true' - conda_keras_minimum: - DISTRIB: 'conda-minimum-keras' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.8' - NUMPY_VERSION: '1.19.5' # This version is the minimum requrired by tensorflow - SCIPY_VERSION: 'min' - SKLEARN_VERSION: 'min' - KERAS_VERSION: 'min' - TEST_DOCS: 'true' - TEST_DOCSTRINGS: 'false' # it is going to fail because of scikit-learn inheritance - CHECK_WARNINGS: 'false' # in case the older version raise some FutureWarnings - -# Currently runs on Python 3.8 while only Python 3.7 available -# - template: build_tools/azure/posix-docker.yml -# parameters: -# name: Linux_Docker -# vmImage: ubuntu-20.04 -# dependsOn: [linting, git_commit] -# condition: | -# and( -# succeeded(), -# not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), -# ne(variables['Build.Reason'], 'Schedule') -# ) -# matrix: -# debian_atlas_32bit: -# DISTRIB: 'debian-32' -# DOCKER_CONTAINER: 'i386/debian:10.9' -# JOBLIB_VERSION: 'min' -# # disable pytest xdist due to unknown bug with 32-bit container -# PYTEST_XDIST_VERSION: 'none' -# PYTEST_VERSION: 'min' -# THREADPOOLCTL_VERSION: '2.2.0' - -- template: build_tools/azure/posix.yml - parameters: - name: macOS - vmImage: macOS-11 - dependsOn: [linting, git_commit] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), - ne(variables['Build.Reason'], 'Schedule') - ) - matrix: - pylatest_conda_forge_mkl: - DISTRIB: 'conda' - BLAS: 'mkl' - CONDA_CHANNEL: 'conda-forge' - CPU_COUNT: '3' - TEST_DOCS: 'true' - # TODO: re-enable when we find out why MKL on defaults segfaults - # It seems that scikit-learn from defaults channel is built with LLVM/CLANG OMP - # while we use MKL OMP. This could be the cause of the segfaults. - # pylatest_conda_mkl_no_openmp: - # DISTRIB: 'conda' - # BLAS: 'mkl' - # SKLEARN_SKIP_OPENMP_TEST: 'true' - # CPU_COUNT: '3' - # TEST_DOCS: 'true' - conda_conda_forge_openblas: - DISTRIB: 'conda' - CONDA_CHANNEL: 'conda-forge' - BLAS: 'openblas' - TEST_DOCS: 'true' - CPU_COUNT: '3' - -- template: build_tools/azure/windows.yml - parameters: - name: Windows - vmImage: windows-latest - dependsOn: [linting, git_commit] - condition: | - and( - succeeded(), - not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')), - ne(variables['Build.Reason'], 'Schedule') - ) - matrix: - py38_conda_forge_mkl: - DISTRIB: 'conda' - CONDA_CHANNEL: 'conda-forge' - PYTHON_VERSION: '3.10' - CHECK_WARNINGS: 'true' - PYTHON_ARCH: '64' - PYTEST_VERSION: '*' - COVERAGE: 'true' diff --git a/build_tools/azure/install.sh b/build_tools/azure/install.sh deleted file mode 100755 index 8d60203f7..000000000 --- a/build_tools/azure/install.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/bash - -set -e -set -x - -UNAMESTR=`uname` - -make_conda() { - conda update -yq conda - TO_INSTALL="$@" - if [[ "$DISTRIB" == *"mamba"* ]]; then - mamba create -n $VIRTUALENV --yes $TO_INSTALL - else - conda config --show - conda create -n $VIRTUALENV --yes $TO_INSTALL - fi - source activate $VIRTUALENV -} - -# imports get_dep -source build_tools/shared.sh - -if [[ "$DISTRIB" == "conda" || "$DISTRIB" == *"mamba"* ]]; then - - if [[ "$CONDA_CHANNEL" != "" ]]; then - TO_INSTALL="--override-channels -c $CONDA_CHANNEL" - else - TO_INSTALL="" - fi - - TO_INSTALL="$TO_INSTALL python=$PYTHON_VERSION" - TO_INSTALL="$TO_INSTALL pip blas[build=$BLAS]" - - TO_INSTALL="$TO_INSTALL $(get_dep numpy $NUMPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scipy $SCIPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scikit-learn $SKLEARN_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep joblib $JOBLIB_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep pandas $PANDAS_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep Pillow $PILLOW_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep matplotlib $MATPLOTLIB_VERSION)" - - make_conda $TO_INSTALL - -elif [[ "$DISTRIB" == "ubuntu" ]]; then - sudo add-apt-repository --remove ppa:ubuntu-toolchain-r/test - sudo apt-get update - sudo apt-get install python3-scipy python3-sklearn python3-matplotlib \ - libatlas3-base libatlas-base-dev python3-virtualenv - python3 -m virtualenv --system-site-packages --python=python3 $VIRTUALENV - source $VIRTUALENV/bin/activate - python -m pip install $(get_dep joblib $JOBLIB_VERSION) - -elif [[ "$DISTRIB" == "debian-32" ]]; then - apt-get update - apt-get install -y python3-dev python3-numpy python3-scipy python3-sklearn \ - python3-matplotlib libatlas3-base libatlas-base-dev python3-virtualenv \ - python3-pandas - - python3 -m virtualenv --system-site-packages --python=python3 $VIRTUALENV - source $VIRTUALENV/bin/activate - python -m pip install $(get_dep joblib $JOBLIB_VERSION) - -elif [[ "$DISTRIB" == "conda-pip-latest" ]]; then - # Since conda main channel usually lacks behind on the latest releases, - # we use pypi to test against the latest releases of the dependencies. - # conda is still used as a convenient way to install Python and pip. - make_conda "python=$PYTHON_VERSION" - python -m pip install -U pip - - python -m pip install pandas matplotlib - python -m pip install scikit-learn - -elif [[ "$DISTRIB" == "conda-pip-latest-tensorflow" ]]; then - make_conda "python=$PYTHON_VERSION" - python -m pip install -U pip - - python -m pip install numpy scipy scikit-learn pandas tensorflow - -elif [[ "$DISTRIB" == "conda-latest-tensorflow" ]]; then - make_conda "python=$PYTHON_VERSION numpy scipy scikit-learn pandas tensorflow" - -elif [[ "$DISTRIB" == "conda-minimum-tensorflow" ]]; then - TO_INSTALL="python=$PYTHON_VERSION" - TO_INSTALL="$TO_INSTALL $(get_dep numpy $NUMPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scipy $SCIPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scikit-learn $SKLEARN_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep pandas $PANDAS_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep tensorflow $TENSORFLOW_VERSION)" - make_conda $TO_INSTALL - -elif [[ "$DISTRIB" == "conda-pip-latest-keras" ]]; then - make_conda "python=$PYTHON_VERSION" - python -m pip install -U pip - - python -m pip install numpy scipy scikit-learn pandas keras - -elif [[ "$DISTRIB" == "conda-latest-keras" ]]; then - make_conda "python=$PYTHON_VERSION numpy scipy scikit-learn pandas keras" - -elif [[ "$DISTRIB" == "conda-minimum-keras" ]]; then - TO_INSTALL="python=$PYTHON_VERSION" - TO_INSTALL="$TO_INSTALL $(get_dep numpy $NUMPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scipy $SCIPY_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep scikit-learn $SKLEARN_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep pandas $PANDAS_VERSION)" - TO_INSTALL="$TO_INSTALL $(get_dep keras $KERAS_VERSION)" - make_conda $TO_INSTALL - -elif [[ "$DISTRIB" == "conda-pip-scipy-dev" ]]; then - make_conda "python=$PYTHON_VERSION" - python -m pip install -U pip - echo "Installing numpy and scipy master wheels" - dev_anaconda_url=https://pypi.anaconda.org/scipy-wheels-nightly/simple - pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url numpy pandas scipy scikit-learn - echo "Installing joblib master" - pip install https://github.com/joblib/joblib/archive/master.zip - echo "Installing tensorflow master" - pip install tf-nightly -fi - -python -m pip install $(get_dep threadpoolctl $THREADPOOLCTL_VERSION) \ - $(get_dep pytest $PYTEST_VERSION) \ - $(get_dep pytest-xdist $PYTEST_XDIST_VERSION) - -if [[ "$COVERAGE" == "true" ]]; then - python -m pip install codecov pytest-cov -fi - -if [[ "$PYTEST_XDIST_VERSION" != "none" ]]; then - python -m pip install pytest-xdist -fi - -if [[ "$TEST_DOCSTRINGS" == "true" ]]; then - # numpydoc requires sphinx - python -m pip install sphinx - python -m pip install numpydoc -fi - -python --version -python -c "import numpy; print('numpy %s' % numpy.__version__)" -python -c "import scipy; print('scipy %s' % scipy.__version__)" -python -c "\ -try: - import pandas - print('pandas %s' % pandas.__version__) -except ImportError: - print('pandas not installed') -" - -python -m pip list -pip install --verbose --editable . diff --git a/build_tools/azure/install_win.sh b/build_tools/azure/install_win.sh deleted file mode 100755 index 48814af55..000000000 --- a/build_tools/azure/install_win.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -set -e -set -x - -if [[ "$PYTHON_ARCH" == "64" ]]; then - conda create -n $VIRTUALENV -q -y python=$PYTHON_VERSION numpy scipy scikit-learn matplotlib wheel pillow joblib - - source activate $VIRTUALENV - - pip install threadpoolctl - - if [[ "$PYTEST_VERSION" == "*" ]]; then - pip install pytest - else - pip install pytest==$PYTEST_VERSION - fi -else - pip install numpy scipy scikit-learn pytest wheel pillow joblib threadpoolctl -fi - -if [[ "$PYTEST_XDIST_VERSION" != "none" ]]; then - pip install pytest-xdist -fi - -if [[ "$COVERAGE" == "true" ]]; then - pip install coverage codecov pytest-cov -fi - -python --version -pip --version - -python -m pip list -pip install --verbose --editable . diff --git a/build_tools/azure/linting.sh b/build_tools/azure/linting.sh deleted file mode 100755 index 890874614..000000000 --- a/build_tools/azure/linting.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -set -e -# pipefail is necessary to propagate exit codes -set -o pipefail - -# For docstrings and warnings of deprecated attributes to be rendered -# properly, the property decorator must come before the deprecated decorator -# (else they are treated as functions) - -# do not error when grep -B1 "@property" finds nothing -set +e -bad_deprecation_property_order=`git grep -A 10 "@property" -- "*.py" | awk '/@property/,/def /' | grep -B1 "@deprecated"` - -if [ ! -z "$bad_deprecation_property_order" ] -then - echo "property decorator should come before deprecated decorator" - echo "found the following occurrencies:" - echo $bad_deprecation_property_order - exit 1 -fi - -# Check for default doctest directives ELLIPSIS and NORMALIZE_WHITESPACE - -doctest_directive="$(git grep -nw -E "# doctest\: \+(ELLIPSIS|NORMALIZE_WHITESPACE)")" - -if [ ! -z "$doctest_directive" ] -then - echo "ELLIPSIS and NORMALIZE_WHITESPACE doctest directives are enabled by default, but were found in:" - echo "$doctest_directive" - exit 1 -fi diff --git a/build_tools/azure/posix-docker.yml b/build_tools/azure/posix-docker.yml deleted file mode 100644 index cd85e4644..000000000 --- a/build_tools/azure/posix-docker.yml +++ /dev/null @@ -1,93 +0,0 @@ -parameters: - name: '' - vmImage: '' - matrix: [] - dependsOn: [] - condition: ne(variables['Build.Reason'], 'Schedule') - -jobs: -- job: ${{ parameters.name }} - dependsOn: ${{ parameters.dependsOn }} - condition: ${{ parameters.condition }} - pool: - vmImage: ${{ parameters.vmImage }} - variables: - TEST_DIR: '$(Agent.WorkFolder)/tmp_folder' - JUNITXML: 'test-data.xml' - OMP_NUM_THREADS: '2' - OPENBLAS_NUM_THREADS: '2' - CPU_COUNT: '2' - NUMPY_VERSION: 'latest' - SCIPY_VERSION: 'latest' - SKLEARN_VERSION: 'latest' - TENSORFLOW_VERSION: 'none' - KERAS_VERSION: 'none' - JOBLIB_VERSION: 'latest' - PANDAS_VERSION: 'latest' - MATPLOTLIB_VERSION: 'latest' - PYTEST_VERSION: 'latest' - PYTEST_XDIST_VERSION: 'latest' - THREADPOOLCTL_VERSION: 'latest' - COVERAGE: 'false' - TEST_DOCSTRINGS: 'false' - CHECK_WARNINGS: 'false' - BLAS: 'openblas' - # Set in azure-pipelines.yml - DISTRIB: '' - DOCKER_CONTAINER: '' - SHOW_SHORT_SUMMARY: 'false' - strategy: - matrix: - ${{ insert }}: ${{ parameters.matrix }} - - steps: - # Container is detached and sleeping, allowing steps to run commands - # in the container. The TEST_DIR is mapped allowing the host to access - # the JUNITXML file - - script: > - docker container run --rm - --volume $TEST_DIR:/temp_dir - --volume $PWD:/io - -w /io - --detach - --name skcontainer - -e DISTRIB=$DISTRIB - -e TEST_DIR=/temp_dir - -e JUNITXML=$JUNITXML - -e VIRTUALENV=testvenv - -e NUMPY_VERSION=$NUMPY_VERSION - -e SCIPY_VERSION=$SCIPY_VERSION - -e SKLEARN_VERSION=$SKLEARN_VERSION - -e TENSORFLOW_VERSION=$TENSORFLOW_VERSION - -e KERAS_VERSION=$KERAS_VERSION - -e JOBLIB_VERSION=$JOBLIB_VERSION - -e PANDAS_VERSION=$PANDAS_VERSION - -e PILLOW_VERSION=$PILLOW_VERSION - -e MATPLOTLIB_VERSION=$MATPLOTLIB_VERSION - -e PYTEST_VERSION=$PYTEST_VERSION - -e PYTEST_XDIST_VERSION=$PYTEST_XDIST_VERSION - -e THREADPOOLCTL_VERSION=$THREADPOOLCTL_VERSION - -e OMP_NUM_THREADS=$OMP_NUM_THREADS - -e OPENBLAS_NUM_THREADS=$OPENBLAS_NUM_THREADS - -e SKLEARN_SKIP_NETWORK_TESTS=$SKLEARN_SKIP_NETWORK_TESTS - -e BLAS=$BLAS - -e CPU_COUNT=$CPU_COUNT - $DOCKER_CONTAINER - sleep 1000000 - displayName: 'Start container' - - script: > - docker exec skcontainer ./build_tools/azure/install.sh - displayName: 'Install' - - script: > - docker exec skcontainer ./build_tools/azure/test_script.sh - displayName: 'Test Library' - - task: PublishTestResults@2 - inputs: - testResultsFiles: '$(TEST_DIR)/$(JUNITXML)' - testRunTitle: ${{ format('{0}-$(Agent.JobName)', parameters.name) }} - displayName: 'Publish Test Results' - condition: succeededOrFailed() - - script: > - docker container stop skcontainer - displayName: 'Stop container' - condition: always() diff --git a/build_tools/azure/posix.yml b/build_tools/azure/posix.yml deleted file mode 100644 index 59367a29e..000000000 --- a/build_tools/azure/posix.yml +++ /dev/null @@ -1,77 +0,0 @@ -parameters: - name: '' - vmImage: '' - matrix: [] - dependsOn: [] - condition: '' - -jobs: -- job: ${{ parameters.name }} - dependsOn: ${{ parameters.dependsOn }} - condition: ${{ parameters.condition }} - timeoutInMinutes: 120 - pool: - vmImage: ${{ parameters.vmImage }} - variables: - TEST_DIR: '$(Agent.WorkFolder)/tmp_folder' - VIRTUALENV: 'testvenv' - JUNITXML: 'test-data.xml' - OMP_NUM_THREADS: '2' - OPENBLAS_NUM_THREADS: '2' - CPU_COUNT: '2' - SKLEARN_SKIP_NETWORK_TESTS: '1' - SKLEARN_DATA_DIR: $(System.DefaultWorkingDirectory)/scikit_learn_data - NUMPY_VERSION: 'latest' - SCIPY_VERSION: 'latest' - SKLEARN_VERSION: 'latest' - TENSORFLOW_VERSION: 'none' - KERAS_VERSION: 'none' - JOBLIB_VERSION: 'latest' - PANDAS_VERSION: 'latest' - PILLOW_VERSION: 'latest' - MATPLOTLIB_VERSION: 'latest' - PYTEST_VERSION: 'latest' - PYTEST_XDIST_VERSION: 'latest' - THREADPOOLCTL_VERSION: 'latest' - COVERAGE: 'true' - TEST_DOCS: 'false' - TEST_DOCSTRINGS: 'false' - CHECK_WARNINGS: 'false' - SHOW_SHORT_SUMMARY: 'false' - strategy: - matrix: - ${{ insert }}: ${{ parameters.matrix }} - - steps: - - bash: echo "##vso[task.prependpath]$CONDA/bin" - displayName: Add conda to PATH - condition: startsWith(variables['DISTRIB'], 'conda') - - bash: sudo chown -R $USER $CONDA - displayName: Take ownership of conda installation - condition: startsWith(variables['DISTRIB'], 'conda') - - script: | - build_tools/azure/install.sh - displayName: 'Install' - - script: | - build_tools/azure/test_script.sh - displayName: 'Test Library' - - script: | - build_tools/azure/test_docs.sh - displayName: 'Test Docs' - condition: eq(variables['TEST_DOCS'], 'true') - - script: | - build_tools/azure/test_docstring.sh - displayName: "Numpydoc validation" - condition: eq(variables['TEST_DOCSTRINGS'], 'true') - - task: PublishTestResults@2 - inputs: - testResultsFiles: '$(TEST_DIR)/$(JUNITXML)' - testRunTitle: ${{ format('{0}-$(Agent.JobName)', parameters.name) }} - displayName: 'Publish Test Results' - condition: succeededOrFailed() - - script: | - build_tools/azure/upload_codecov.sh - condition: and(succeeded(), eq(variables['COVERAGE'], 'true')) - displayName: 'Upload To Codecov' - env: - CODECOV_TOKEN: $(CODECOV_TOKEN) diff --git a/build_tools/azure/test_docs.sh b/build_tools/azure/test_docs.sh deleted file mode 100755 index b3a5ec97c..000000000 --- a/build_tools/azure/test_docs.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -if [[ "$DISTRIB" =~ ^conda.* ]]; then - source activate $VIRTUALENV -elif [[ "$DISTRIB" == "ubuntu" ]]; then - source $VIRTUALENV/bin/activate -fi - -make test-doc diff --git a/build_tools/azure/test_docstring.sh b/build_tools/azure/test_docstring.sh deleted file mode 100755 index 85df7ffd3..000000000 --- a/build_tools/azure/test_docstring.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -if [[ "$DISTRIB" =~ ^conda.* ]]; then - source activate $VIRTUALENV -elif [[ "$DISTRIB" == "ubuntu" ]]; then - source $VIRTUALENV/bin/activate -fi - -pytest -vsl maint_tools/test_docstring.py diff --git a/build_tools/azure/test_script.sh b/build_tools/azure/test_script.sh deleted file mode 100755 index 4d135f3e2..000000000 --- a/build_tools/azure/test_script.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -set -e - -if [[ "$DISTRIB" =~ ^conda.* ]]; then - source activate $VIRTUALENV -elif [[ "$DISTRIB" == "ubuntu" ]] || [[ "$DISTRIB" == "debian-32" ]]; then - source $VIRTUALENV/bin/activate -fi - -mkdir -p $TEST_DIR -cp setup.cfg $TEST_DIR -cd $TEST_DIR - -# python -c "import joblib; print(f'Number of cores (physical): \ -# {joblib.cpu_count()} ({joblib.cpu_count(only_physical_cores=True)})')" -# python -c "import sklearn; sklearn.show_versions()" -python -c "import imblearn; imblearn.show_versions()" - -if ! command -v conda &> /dev/null -then - pip list -else - # conda list provides more info than pip list (when available) - conda list -fi - -TEST_CMD="python -m pytest --showlocals --durations=20 --junitxml=$JUNITXML" - -if [[ "$COVERAGE" == "true" ]]; then - # Note: --cov-report= is used to disable to long text output report in the - # CI logs. The coverage data is consolidated by codecov to get an online - # web report across all the platforms so there is no need for this text - # report that otherwise hides the test failures and forces long scrolls in - # the CI logs. - export COVERAGE_PROCESS_START="$BUILD_SOURCESDIRECTORY/.coveragerc" - TEST_CMD="$TEST_CMD --cov-config='$COVERAGE_PROCESS_START' --cov imblearn --cov-report=" -fi - -if [[ "$CHECK_WARNINGS" == "true" ]]; then - # numpy's 1.19.0's tostring() deprecation is ignored until scipy and joblib removes its usage - TEST_CMD="$TEST_CMD -Werror::DeprecationWarning -Werror::FutureWarning -Wignore:tostring:DeprecationWarning" - - # numpy's 1.20's np.object deprecationg is ignored until tensorflow removes its usage - TEST_CMD="$TEST_CMD -Wignore:\`np.object\`:DeprecationWarning" - - # Python 3.10 deprecates disutils and is imported by numpy interally during import time - TEST_CMD="$TEST_CMD -Wignore:The\ distutils:DeprecationWarning" - - # Workaround for https://github.com/pypa/setuptools/issues/2885 - TEST_CMD="$TEST_CMD -Wignore:Creating\ a\ LegacyVersion:DeprecationWarning" -fi - -if [[ "$PYTEST_XDIST_VERSION" != "none" ]]; then - TEST_CMD="$TEST_CMD -n$CPU_COUNT" -fi - -if [[ "$SHOW_SHORT_SUMMARY" == "true" ]]; then - TEST_CMD="$TEST_CMD -ra" -fi - -set -x -eval "$TEST_CMD --pyargs imblearn" -set +x diff --git a/build_tools/azure/upload_codecov.sh b/build_tools/azure/upload_codecov.sh deleted file mode 100755 index 274106cb1..000000000 --- a/build_tools/azure/upload_codecov.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -# called when COVERAGE=="true" and DISTRIB=="conda" -export PATH=$HOME/miniconda3/bin:$PATH -source activate $VIRTUALENV - -# Need to run codecov from a git checkout, so we copy .coverage -# from TEST_DIR where pytest has been run -pushd $TEST_DIR -coverage combine --append -popd -cp $TEST_DIR/.coverage $BUILD_REPOSITORY_LOCALPATH - -codecov --root $BUILD_REPOSITORY_LOCALPATH -t $CODECOV_TOKEN || echo "codecov upload failed" diff --git a/build_tools/azure/windows.yml b/build_tools/azure/windows.yml deleted file mode 100644 index 240e4c24d..000000000 --- a/build_tools/azure/windows.yml +++ /dev/null @@ -1,54 +0,0 @@ - -parameters: - name: '' - vmImage: '' - matrix: [] - dependsOn: [] - condition: ne(variables['Build.Reason'], 'Schedule') - -jobs: -- job: ${{ parameters.name }} - dependsOn: ${{ parameters.dependsOn }} - condition: ${{ parameters.condition }} - pool: - vmImage: ${{ parameters.vmImage }} - variables: - VIRTUALENV: 'testvenv' - JUNITXML: 'test-data.xml' - SKLEARN_SKIP_NETWORK_TESTS: '1' - PYTEST_VERSION: '5.2.1' - PYTEST_XDIST: 'true' - PYTEST_XDIST_VERSION: 'latest' - TEST_DIR: '$(Agent.WorkFolder)/tmp_folder' - CPU_COUNT: '2' - CHECK_WARNINGS: 'false' - strategy: - matrix: - ${{ insert }}: ${{ parameters.matrix }} - - steps: - - bash: echo "##vso[task.prependpath]$CONDA/Scripts" - displayName: Add conda to PATH for 64 bit Python - condition: eq(variables['PYTHON_ARCH'], '64') - - task: UsePythonVersion@0 - inputs: - versionSpec: '$(PYTHON_VERSION)' - addToPath: true - architecture: 'x86' - displayName: Use 32 bit System Python - condition: eq(variables['PYTHON_ARCH'], '32') - - bash: ./build_tools/azure/install_win.sh - displayName: 'Install' - - bash: ./build_tools/azure/test_script.sh - displayName: 'Test Library' - - bash: ./build_tools/azure/upload_codecov.sh - condition: and(succeeded(), eq(variables['COVERAGE'], 'true')) - displayName: 'Upload To Codecov' - env: - CODECOV_TOKEN: $(CODECOV_TOKEN) - - task: PublishTestResults@2 - inputs: - testResultsFiles: '$(TEST_DIR)/$(JUNITXML)' - testRunTitle: ${{ format('{0}-$(Agent.JobName)', parameters.name) }} - displayName: 'Publish Test Results' - condition: succeededOrFailed() diff --git a/build_tools/circle/build_doc.sh b/build_tools/circle/build_doc.sh index 9601b44aa..57d2241f6 100755 --- a/build_tools/circle/build_doc.sh +++ b/build_tools/circle/build_doc.sh @@ -72,59 +72,15 @@ then exit 0 fi -make_args=html -make_args="SPHINXOPTS=-T $make_args" # show full traceback on exception - -# Installing required system packages to support the rendering of math -# notation in the HTML documentation and to optimize the image files -sudo -E apt-get -yq update --allow-releaseinfo-change -sudo -E apt-get -yq remove texlive-binaries --purge -sudo -E apt-get -yq --no-install-suggests --no-install-recommends \ -install dvipng texlive-latex-base texlive-latex-extra \ - texlive-latex-recommended texlive-fonts-recommended \ - latexmk gsfonts zip optipng - # deactivate circleci virtualenv and setup a miniconda env instead if [[ `type -t deactivate` ]]; then deactivate fi -MAMBAFORGE_PATH=$HOME/mambaforge -# Install dependencies with mamba -wget -q https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh \ - -O mambaforge.sh -chmod +x mambaforge.sh && ./mambaforge.sh -b -p $MAMBAFORGE_PATH -export PATH="$MAMBAFORGE_PATH/bin:$PATH" -mamba update --yes --quiet conda - -# imports get_dep -source build_tools/shared.sh - -# packaging won't be needed once setuptools starts shipping packaging>=17.0 -mamba create -n $CONDA_ENV_NAME --yes --quiet \ - python="${PYTHON_VERSION:-*}" \ - "$(get_dep numpy $NUMPY_VERSION)" \ - "$(get_dep scipy $SCIPY_VERSION)" \ - "$(get_dep scikit-learn $SKLEARN_VERSION)" \ - "$(get_dep matplotlib $MATPLOTLIB_VERSION)" \ - "$(get_dep sphinx $SPHINX_VERSION)" \ - "$(get_dep pandas $PANDAS_VERSION)" \ - "$(get_dep sphinx-gallery $SPHINX_GALLERY_VERSION)" \ - "$(get_dep numpydoc $NUMPYDOC_VERSION)" \ - "$(get_dep sphinxcontrib-bibtex $SPHINXCONTRIB_BIBTEX_VERSION)" \ - "$(get_dep sphinx-copybutton $SPHINXCONTRIB_BIBTEX_VERSION)" \ - "$(get_dep pydata-sphinx-theme $PYDATA_SPHINX_THEME_VERSION)" \ - "$(get_dep sphinx-design $SPHINX_DESIGN_VERSION)" \ - memory_profiler packaging seaborn pytest coverage compilers tensorflow - -source activate $CONDA_ENV_NAME - -# Build and install imbalanced-learn in dev mode -ls -l -pip install -e . --no-build-isolation +# Install pixi +curl -fsSL https://pixi.sh/install.sh | bash +export PATH=/home/circleci/.pixi/bin:$PATH # The pipefail is requested to propagate exit code -set -o pipefail && cd doc && make $make_args 2>&1 | tee ~/log.txt - -cd - +set -o pipefail && pixi run --frozen -e docs build-docs | tee ~/log.txt set +o pipefail diff --git a/build_tools/shared.sh b/build_tools/shared.sh deleted file mode 100644 index b7f94d497..000000000 --- a/build_tools/shared.sh +++ /dev/null @@ -1,16 +0,0 @@ -get_dep() { - package="$1" - version="$2" - if [[ "$version" == "none" ]]; then - # do not install with none - echo - elif [[ "${version%%[^0-9.]*}" ]]; then - # version number is explicitly passed - echo "$package==$version" - elif [[ "$version" == "latest" ]]; then - # use latest - echo "$package" - elif [[ "$version" == "min" ]]; then - echo "$package==$(python imblearn/_min_dependencies.py $package)" - fi -} diff --git a/conftest.py b/conftest.py index 45a5ce679..0dc6e5a23 100644 --- a/conftest.py +++ b/conftest.py @@ -7,7 +7,14 @@ import os +import numpy as np import pytest +from sklearn.utils.fixes import parse_version + +# use legacy numpy print options to avoid failures due to NumPy 2.+ scalar +# representation +if parse_version(np.__version__) > parse_version("2.0.0"): + np.set_printoptions(legacy="1.25") def pytest_runtest_setup(item): diff --git a/doc/_templates/numpydoc_docstring.rst b/doc/_templates/numpydoc_docstring.rst index db4cdfabc..fd6a35f76 100644 --- a/doc/_templates/numpydoc_docstring.rst +++ b/doc/_templates/numpydoc_docstring.rst @@ -13,4 +13,4 @@ {{notes}} {{references}} {{examples}} -{{methods}} \ No newline at end of file +{{methods}} diff --git a/doc/conf.py b/doc/conf.py index 5561808ab..1d92fe538 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -111,7 +111,9 @@ "show_toc_level": 1, # "navbar_align": "right", # For testing that the navbar items align properly "logo": { - "image_dark": "https://imbalanced-learn.org/stable/_static/img/logo_wide_dark.png" + "image_dark": ( + "https://imbalanced-learn.org/stable/_static/img/logo_wide_dark.png" + ) }, } @@ -187,9 +189,11 @@ # The following is used by sphinx.ext.linkcode to provide links to github linkcode_resolve = make_linkcode_resolve( "imblearn", - "https://github.com/scikit-learn-contrib/" - "imbalanced-learn/blob/{revision}/" - "{package}/{path}#L{lineno}", + ( + "https://github.com/scikit-learn-contrib/" + "imbalanced-learn/blob/{revision}/" + "{package}/{path}#L{lineno}" + ), ) # -- Options for LaTeX output --------------------------------------------- diff --git a/doc/ensemble.rst b/doc/ensemble.rst index d8b6751d3..e79be14d8 100644 --- a/doc/ensemble.rst +++ b/doc/ensemble.rst @@ -19,7 +19,7 @@ Bagging classifier In ensemble classifiers, bagging methods build several estimators on different randomly selected subset of data. In scikit-learn, this classifier is named :class:`~sklearn.ensemble.BaggingClassifier`. However, this classifier does not -allow to balance each subset of data. Therefore, when training on imbalanced +allow each subset of data to be balanced. Therefore, when training on an imbalanced data set, this classifier will favor the majority classes:: >>> from sklearn.datasets import make_classification @@ -59,10 +59,10 @@ sampling is controlled by the parameter `sampler` or the two parameters >>> balanced_accuracy_score(y_test, y_pred) 0.8... -Changing the `sampler` will give rise to different known implementation +Changing the `sampler` will give rise to different known implementations :cite:`maclin1997empirical`, :cite:`hido2009roughly`, -:cite:`wang2009diversity`. You can refer to the following example shows in -practice these different methods: +:cite:`wang2009diversity`. You can refer to the following example which shows these +different methods in practice: :ref:`sphx_glr_auto_examples_ensemble_plot_bagging_classifier.py` .. _forest: @@ -93,7 +93,7 @@ Boosting Several methods taking advantage of boosting have been designed. -:class:`RUSBoostClassifier` randomly under-sample the dataset before to perform +:class:`RUSBoostClassifier` randomly under-samples the dataset before performing a boosting iteration :cite:`seiffert2009rusboost`:: >>> from imblearn.ensemble import RUSBoostClassifier @@ -107,7 +107,7 @@ a boosting iteration :cite:`seiffert2009rusboost`:: A specific method which uses :class:`~sklearn.ensemble.AdaBoostClassifier` as learners in the bagging classifier is called "EasyEnsemble". The -:class:`EasyEnsembleClassifier` allows to bag AdaBoost learners which are +:class:`EasyEnsembleClassifier` allows bagging AdaBoost learners which are trained on balanced bootstrap samples :cite:`liu2008exploratory`. Similarly to the :class:`BalancedBaggingClassifier` API, one can construct the ensemble as:: diff --git a/doc/install.rst b/doc/install.rst index 3dcc45baa..6fe66f819 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -7,9 +7,35 @@ Getting Started Prerequisites ============= -You can find the complete list of the dependencies in the following table: - -.. include:: min_dependency_table.rst +.. |PythonMinVersion| replace:: 3.10 +.. |NumPyMinVersion| replace:: 1.25.2 +.. |SciPyMinVersion| replace:: 1.11.4 +.. |ScikitLearnMinVersion| replace:: 1.4.2 +.. |MatplotlibMinVersion| replace:: 3.7.3 +.. |PandasMinVersion| replace:: 2.0.3 +.. |TensorflowMinVersion| replace:: 2.16.1 +.. |KerasMinVersion| replace:: 3.3.3 +.. |SeabornMinVersion| replace:: 0.12.2 +.. |PytestMinVersion| replace:: 7.2.2 + +`imbalanced-learn` requires the following dependencies: + +- Python (>= |PythonMinVersion|) +- NumPy (>= |NumPyMinVersion|) +- SciPy (>= |SciPyMinVersion|) +- Scikit-learn (>= |ScikitLearnMinVersion|) +- Pytest (>= |PytestMinVersion|) + +Additionally, `imbalanced-learn` requires the following optional dependencies: + +- Pandas (>= |PandasMinVersion|) for dealing with dataframes +- Tensorflow (>= |TensorflowMinVersion|) for dealing with TensorFlow models +- Keras (>= |KerasMinVersion|) for dealing with Keras models + +The examples will requires the following additional dependencies: + +- Matplotlib (>= |MatplotlibMinVersion|) +- Seaborn (>= |SeabornMinVersion|) Install ======= diff --git a/doc/introduction.rst b/doc/introduction.rst index bc0e2bb61..5e9f54686 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -9,41 +9,45 @@ Introduction API's of imbalanced-learn samplers ---------------------------------- -The available samplers follows the scikit-learn API using the base estimator -and adding a sampling functionality through the ``sample`` method: +The available samplers follow the +`scikit-learn API `_ +using the base estimator +and incorporating a sampling functionality via the ``sample`` method: :Estimator: - The base object, implements a ``fit`` method to learn from data, either:: + The base object, implements a ``fit`` method to learn from data:: estimator = obj.fit(data, targets) :Resampler: - To resample a data sets, each sampler implements:: + To resample a data sets, each sampler implements a ``fit_resample`` method:: data_resampled, targets_resampled = obj.fit_resample(data, targets) -Imbalanced-learn samplers accept the same inputs that in scikit-learn: +Imbalanced-learn samplers accept the same inputs as scikit-learn estimators: -* `data`: - * 2-D :class:`list`, - * 2-D :class:`numpy.ndarray`, - * :class:`pandas.DataFrame`, - * :class:`scipy.sparse.csr_matrix` or :class:`scipy.sparse.csc_matrix`; -* `targets`: - * 1-D :class:`numpy.ndarray`, - * :class:`pandas.Series`. +* `data`, 2-dimensional array-like structures, such as: + * Python's list of lists :class:`list`, + * Numpy arrays :class:`numpy.ndarray`, + * Panda dataframes :class:`pandas.DataFrame`, + * Scipy sparse matrices :class:`scipy.sparse.csr_matrix` or :class:`scipy.sparse.csc_matrix`; + +* `targets`, 1-dimensional array-like structures, such as: + * Numpy arrays :class:`numpy.ndarray`, + * Pandas series :class:`pandas.Series`. The output will be of the following type: -* `data_resampled`: - * 2-D :class:`numpy.ndarray`, - * :class:`pandas.DataFrame`, - * :class:`scipy.sparse.csr_matrix` or :class:`scipy.sparse.csc_matrix`; -* `targets_resampled`: - * 1-D :class:`numpy.ndarray`, - * :class:`pandas.Series`. +* `data_resampled`, 2-dimensional aray-like structures, such as: + * Numpy arrays :class:`numpy.ndarray`, + * Pandas dataframes :class:`pandas.DataFrame`, + * Scipy sparse matrices :class:`scipy.sparse.csr_matrix` or :class:`scipy.sparse.csc_matrix`; + +* `targets_resampled`, 1-dimensional array-like structures, such as: + * Numpy arrays :class:`numpy.ndarray`, + * Pandas series :class:`pandas.Series`. .. topic:: Pandas in/out @@ -62,18 +66,19 @@ The output will be of the following type: Problem statement regarding imbalanced data sets ------------------------------------------------ -The learning phase and the subsequent prediction of machine learning algorithms -can be affected by the problem of imbalanced data set. The balancing issue -corresponds to the difference of the number of samples in the different -classes. We illustrate the effect of training a linear SVM classifier with -different levels of class balancing. +The learning and prediction phrases of machine learning algorithms +can be impacted by the issue of **imbalanced datasets**. This imbalance +refers to the difference in the number of samples across different classes. +We demonstrate the effect of training a `Logistic Regression classifier +`_ +with varying levels of class balancing by adjusting their weights. .. image:: ./auto_examples/over-sampling/images/sphx_glr_plot_comparison_over_sampling_001.png :target: ./auto_examples/over-sampling/plot_comparison_over_sampling.html :scale: 60 :align: center -As expected, the decision function of the linear SVM varies greatly depending -upon how imbalanced the data is. With a greater imbalanced ratio, the decision -function favors the class with the larger number of samples, usually referred -as the majority class. +As expected, the decision function of the Logistic Regression classifier varies significantly +depending on how imbalanced the data is. With a greater imbalance ratio, the decision function +tends to favour the class with the larger number of samples, usually referred to as the +**majority class**. diff --git a/doc/model_selection.rst b/doc/model_selection.rst new file mode 100644 index 000000000..31fad3ebb --- /dev/null +++ b/doc/model_selection.rst @@ -0,0 +1,128 @@ +.. _cross_validation: + +================ +Cross validation +================ + +.. currentmodule:: imblearn.model_selection + + +.. _instance_hardness_threshold_cv: + +The term instance hardness is used in literature to express the difficulty to correctly +classify an instance. An instance for which the predicted probability of the true class +is low, has large instance hardness. The way these hard-to-classify instances are +distributed over train and test sets in cross validation, has significant effect on the +test set performance metrics. The :class:`~imblearn.model_selection.InstanceHardnessCV` +splitter distributes samples with large instance hardness equally over the folds, +resulting in more robust cross validation. + +We will discuss instance hardness in this document and explain how to use the +:class:`~imblearn.model_selection.InstanceHardnessCV` splitter. + +Instance hardness and average precision +======================================= + +Instance hardness is defined as 1 minus the probability of the most probable class: + +.. math:: + + H(x) = 1 - P(\hat{y}|x) + +In this equation :math:`H(x)` is the instance hardness for a sample with features +:math:`x` and :math:`P(\hat{y}|x)` the probability of predicted label :math:`\hat{y}` +given the features. If the model predicts label 0 and gives a `predict_proba` output +of [0.9, 0.1], the probability of the most probable class (0) is 0.9 and the +instance hardness is `1-0.9=0.1`. + +Samples with large instance hardness have significant effect on the area under +precision-recall curve, or average precision. Especially samples with label 0 +with large instance hardness (so the model predicts label 1) reduce the average +precision a lot as these points affect the precision-recall curve in the left +where the area is largest; the precision is lowered in the range of low recall +and high thresholds. When doing cross validation, e.g. in case of hyperparameter +tuning or recursive feature elimination, random gathering of these points in +some folds introduce variance in CV results that deteriorates robustness of the +cross validation task. The :class:`~imblearn.model_selection.InstanceHardnessCV` +splitter aims to distribute the samples with large instance hardness over the +folds in order to reduce undesired variance. Note that one should use this +splitter to make model *selection* tasks robust like hyperparameter tuning and +feature selection but not for model *performance estimation* for which you also +want to know the variance of performance to be expected in production. + + +Create imbalanced dataset with samples with large instance hardness +=================================================================== + +Let's start by creating a dataset to work with. We create a dataset with 5% class +imbalance using scikit-learn's :func:`~sklearn.datasets.make_blobs` function. + + >>> import numpy as np + >>> from matplotlib import pyplot as plt + >>> from sklearn.datasets import make_blobs + >>> from imblearn.datasets import make_imbalance + >>> random_state = 10 + >>> X, y = make_blobs(n_samples=[950, 50], centers=((-3, 0), (3, 0)), + ... random_state=random_state) + >>> plt.scatter(X[:, 0], X[:, 1], c=y) + >>> plt.show() + +.. image:: ./auto_examples/model_selection/images/sphx_glr_plot_instance_hardness_cv_001.png + :target: ./auto_examples/model_selection/plot_instance_hardness_cv.html + :align: center + +Now we add some samples with large instance hardness + + >>> X_hard, y_hard = make_blobs(n_samples=10, centers=((3, 0), (-3, 0)), + ... cluster_std=1, + ... random_state=random_state) + >>> X = np.vstack((X, X_hard)) + >>> y = np.hstack((y, y_hard)) + >>> plt.scatter(X[:, 0], X[:, 1], c=y) + >>> plt.show() + +.. image:: ./auto_examples/model_selection/images/sphx_glr_plot_instance_hardness_cv_002.png + :target: ./auto_examples/model_selection/plot_instance_hardness_cv.html + :align: center + +Assess cross validation performance variance using `InstanceHardnessCV` splitter +================================================================================ + +Then we take a :class:`~sklearn.linear_model.LogisticRegression` and assess the +cross validation performance using a :class:`~sklearn.model_selection.StratifiedKFold` +cv splitter and the :func:`~sklearn.model_selection.cross_validate` function. + + >>> from sklearn.ensemble import LogisticRegressionClassifier + >>> clf = LogisticRegressionClassifier(random_state=random_state) + >>> skf_cv = StratifiedKFold(n_splits=5, shuffle=True, + ... random_state=random_state) + >>> skf_result = cross_validate(clf, X, y, cv=skf_cv, scoring="average_precision") + +Now, we do the same using an :class:`~imblearn.model_selection.InstanceHardnessCV` +splitter. We use provide our classifier to the splitter to calculate instance hardness +and distribute samples with large instance hardness equally over the folds. + + >>> ih_cv = InstanceHardnessCV(estimator=clf, n_splits=5, + ... random_state=random_state) + >>> ih_result = cross_validate(clf, X, y, cv=ih_cv, scoring="average_precision") + +When we plot the test scores for both cv splitters, we see that the variance using the +:class:`~imblearn.model_selection.InstanceHardnessCV` splitter is lower than for the +:class:`~sklearn.model_selection.StratifiedKFold` splitter. + + >>> plt.boxplot([skf_result['test_score'], ih_result['test_score']], + ... tick_labels=["StratifiedKFold", "InstanceHardnessCV"], + ... vert=False) + >>> plt.xlabel('Average precision') + >>> plt.tight_layout() + +.. image:: ./auto_examples/model_selection/images/sphx_glr_plot_instance_hardness_cv_003.png + :target: ./auto_examples/model_selection/plot_instance_hardness_cv.html + :align: center + +Be aware that the most important part of cross-validation splitters is to simulate the +conditions that one will encounter in production. Therefore, if it is likely to get +difficult samples in production, one should use a cross-validation splitter that +emulates this situation. In our case, the +:class:`~sklearn.model_selection.StratifiedKFold` splitter did not allow to distribute +the difficult samples over the folds and thus it was likely a problem for our use case. diff --git a/doc/references/index.rst b/doc/references/index.rst index f5fe3bf53..6b22f63a9 100644 --- a/doc/references/index.rst +++ b/doc/references/index.rst @@ -18,5 +18,6 @@ This is the full API documentation of the `imbalanced-learn` toolbox. miscellaneous pipeline metrics + model_selection datasets utils diff --git a/doc/references/model_selection.rst b/doc/references/model_selection.rst new file mode 100644 index 000000000..713781dd7 --- /dev/null +++ b/doc/references/model_selection.rst @@ -0,0 +1,23 @@ +.. _model_selection_ref: + +Model selection methods +======================= + +.. automodule:: imblearn.model_selection + :no-members: + :no-inherited-members: + +Cross-validation splitters +-------------------------- + +.. automodule:: imblearn.model_selection._split + :no-members: + :no-inherited-members: + +.. currentmodule:: imblearn.model_selection + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + InstanceHardnessCV diff --git a/doc/sphinxext/LICENSE.txt b/doc/sphinxext/LICENSE.txt index e00efc31e..abb36de3a 100644 --- a/doc/sphinxext/LICENSE.txt +++ b/doc/sphinxext/LICENSE.txt @@ -94,4 +94,3 @@ Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved. 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By copying, installing or otherwise using matplotlib 0.98.3, Licensee agrees to be bound by the terms and conditions of this License Agreement. - diff --git a/doc/sphinxext/github_link.py b/doc/sphinxext/github_link.py index 8f63a39a8..2cd1fbd83 100644 --- a/doc/sphinxext/github_link.py +++ b/doc/sphinxext/github_link.py @@ -26,10 +26,10 @@ def _linkcode_resolve(domain, info, package, url_fmt, revision): >>> _linkcode_resolve('py', {'module': 'tty', ... 'fullname': 'setraw'}, ... package='tty', - ... url_fmt='http://hg.python.org/cpython/file/' + ... url_fmt='https://hg.python.org/cpython/file/' ... '{revision}/Lib/{package}/{path}#L{lineno}', ... revision='xxxx') - 'http://hg.python.org/cpython/file/xxxx/Lib/tty/tty.py#L18' + 'https://hg.python.org/cpython/file/xxxx/Lib/tty/tty.py#L18' """ if revision is None: @@ -40,12 +40,13 @@ def _linkcode_resolve(domain, info, package, url_fmt, revision): return class_name = info["fullname"].split(".")[0] - if type(class_name) != str: - # Python 2 only - class_name = class_name.encode("utf-8") module = __import__(info["module"], fromlist=[class_name]) obj = attrgetter(info["fullname"])(module) + # Unwrap the object to get the correct source + # file in case that is wrapped by a decorator + obj = inspect.unwrap(obj) + try: fn = inspect.getsourcefile(obj) except Exception: diff --git a/doc/sphinxext/sphinx_issues.py b/doc/sphinxext/sphinx_issues.py index 047fcb6ac..1a01100f8 100644 --- a/doc/sphinxext/sphinx_issues.py +++ b/doc/sphinxext/sphinx_issues.py @@ -125,8 +125,9 @@ def make_node(self, name, issue_no, config, options=None): ) else: raise ValueError( - "Neither {} nor issues_github_path " - "is set".format(self.uri_config_option) + "Neither {} nor issues_github_path is set".format( + self.uri_config_option + ) ) issue_text = self.format_text(issue_no) link = nodes.reference(text=issue_text, refuri=ref, **options) diff --git a/doc/user_guide.rst b/doc/user_guide.rst index bfa8c00f9..9db06ca22 100644 --- a/doc/user_guide.rst +++ b/doc/user_guide.rst @@ -19,6 +19,7 @@ User Guide ensemble.rst miscellaneous.rst metrics.rst + model_selection.rst common_pitfalls.rst Dataset loading utilities developers_utils.rst diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 8007fe1d2..9cdfe0058 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -4,6 +4,10 @@ Release history =============== +.. include:: whats_new/v0.15.rst + +.. include:: whats_new/v0.14.rst + .. include:: whats_new/v0.13.rst .. include:: whats_new/v0.12.rst diff --git a/doc/whats_new/v0.12.rst b/doc/whats_new/v0.12.rst index fd95a4fb8..fb79497d8 100644 --- a/doc/whats_new/v0.12.rst +++ b/doc/whats_new/v0.12.rst @@ -1,5 +1,19 @@ .. _changes_0_12: +Version 0.12.4 +============== + +**October 4, 2024** + +Changelog +--------- + +Compatibility +............. + +- Compatibility with NumPy 2.0+ + :pr:`1097` by :user:`Guillaume Lemaitre `. + Version 0.12.3 ============== diff --git a/doc/whats_new/v0.13.rst b/doc/whats_new/v0.13.rst new file mode 100644 index 000000000..245139a02 --- /dev/null +++ b/doc/whats_new/v0.13.rst @@ -0,0 +1,35 @@ +.. _changes_0_13: + +Version 0.13.0 +============== + +**December 20, 2024** + +Changelog +--------- + +Bug fixes +......... + +- Fix `get_metadata_routing` in :class:`~imblearn.pipeline.Pipeline` such that one + can use a sampler with metadata routing. + :pr:`1115` by :user:`Guillaume Lemaitre `. + +Compatibility +............. + +- Compatibility with scikit-learn 1.6 + :pr:`1109` by :user:`Guillaume Lemaitre `. + +Deprecations +............ + +- :class:`~imblearn.pipeline.Pipeline` now uses + :func:`~sklearn.utils.check_is_fitted` instead of + :func:`~sklearn.utils.check_fitted` to check if the pipeline is fitted. In 0.15, it + will raise an error instead of a warning. + :pr:`1109` by :user:`Guillaume Lemaitre `. + +- `algorithm` parameter in :class:`~imblearn.ensemble.RUSBoostClassifier` is now + deprecated and will be removed in 0.14. + :pr:`1109` by :user:`Guillaume Lemaitre `. diff --git a/doc/whats_new/v0.14.rst b/doc/whats_new/v0.14.rst new file mode 100644 index 000000000..5c1751e1a --- /dev/null +++ b/doc/whats_new/v0.14.rst @@ -0,0 +1,28 @@ +.. _changes_0_14: + +Version 0.14.0 +============== + +**August 14, 2025** + +Changelog +--------- + +Bug fixes +......... + +Enhancements +............ + +- Add :class:`~imblearn.model_selection.InstanceHardnessCV` to split data and ensure + that samples are distributed in folds based on their instance hardness. + :pr:`1125` by :user:`Frits Hermans `. + +Compatibility +............. + +- Compatibility with scikit-learn 1.7 + :pr:`1137`, :pr:`1145`, :pr:`1146` by :user:`Guillaume Lemaitre `. + +Deprecations +............ diff --git a/doc/whats_new/0.13.rst b/doc/whats_new/v0.15.rst similarity index 76% rename from doc/whats_new/0.13.rst rename to doc/whats_new/v0.15.rst index 79cb6fe60..7ef7284b8 100644 --- a/doc/whats_new/0.13.rst +++ b/doc/whats_new/v0.15.rst @@ -1,6 +1,6 @@ -.. _changes_0_13: +.. _changes_0_15: -Version 0.13.0 (Under development) +Version 0.15.dev0 (In development) ================================== **TBD** @@ -11,11 +11,11 @@ Changelog Bug fixes ......... +Enhancements +............ + Compatibility ............. Deprecations ............ - -Enhancements -............ diff --git a/doc/zzz_references.rst b/doc/zzz_references.rst index 8f14beb0f..2eca14029 100644 --- a/doc/zzz_references.rst +++ b/doc/zzz_references.rst @@ -2,4 +2,4 @@ References ========== -.. bibliography:: bibtex/refs.bib \ No newline at end of file +.. bibliography:: bibtex/refs.bib diff --git a/examples/applications/plot_impact_imbalanced_classes.py b/examples/applications/plot_impact_imbalanced_classes.py index d18936065..61efcddcf 100644 --- a/examples/applications/plot_impact_imbalanced_classes.py +++ b/examples/applications/plot_impact_imbalanced_classes.py @@ -76,7 +76,7 @@ # %% print( - f"Balanced accuracy score of a dummy classifier: " + "Balanced accuracy score of a dummy classifier: " f"{cv_result['test_balanced_accuracy'].mean():.3f}" ) diff --git a/examples/model_selection/plot_instance_hardness_cv.py b/examples/model_selection/plot_instance_hardness_cv.py new file mode 100644 index 000000000..fe7eca6f0 --- /dev/null +++ b/examples/model_selection/plot_instance_hardness_cv.py @@ -0,0 +1,97 @@ +""" +==================================================== +Distribute hard-to-classify datapoints over CV folds +==================================================== + +'Instance hardness' refers to the difficulty to classify an instance. The way +hard-to-classify instances are distributed over train and test sets has +significant effect on the test set performance metrics. In this example we +show how to deal with this problem. We are making the comparison with normal +:class:`~sklearn.model_selection.StratifiedKFold` cross-validation splitter. +""" + +# Authors: Frits Hermans, https://fritshermans.github.io +# License: MIT + +# %% +print(__doc__) + +# %% +# Create an imbalanced dataset with instance hardness +# --------------------------------------------------- +# +# We create an imbalanced dataset with using scikit-learn's +# :func:`~sklearn.datasets.make_blobs` function and set the class imbalance ratio to +# 5%. +import numpy as np +from matplotlib import pyplot as plt +from sklearn.datasets import make_blobs + +X, y = make_blobs(n_samples=[950, 50], centers=((-3, 0), (3, 0)), random_state=10) +_ = plt.scatter(X[:, 0], X[:, 1], c=y) + +# %% +# To introduce instance hardness in our dataset, we add some hard to classify samples: +X_hard, y_hard = make_blobs( + n_samples=10, centers=((3, 0), (-3, 0)), cluster_std=1, random_state=10 +) +X, y = np.vstack((X, X_hard)), np.hstack((y, y_hard)) +_ = plt.scatter(X[:, 0], X[:, 1], c=y) + +# %% +# Compare cross validation scores using `StratifiedKFold` and `InstanceHardnessCV` +# -------------------------------------------------------------------------------- +# +# Now, we want to assess a linear predictive model. Therefore, we should use +# cross-validation. The most important concept with cross-validation is to create +# training and test splits that are representative of the the data in production to have +# statistical results that one can expect in production. +# +# By applying a standard :class:`~sklearn.model_selection.StratifiedKFold` +# cross-validation splitter, we do not control in which fold the hard-to-classify +# samples will be. +# +# The :class:`~imblearn.model_selection.InstanceHardnessCV` splitter allows to +# control the distribution of the hard-to-classify samples over the folds. +# +# Let's make an experiment to compare the results that we get with both splitters. +# We use a :class:`~sklearn.linear_model.LogisticRegression` classifier and +# :func:`~sklearn.model_selection.cross_validate` to calculate the cross validation +# scores. We use average precision for scoring. +import pandas as pd +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import StratifiedKFold, cross_validate + +from imblearn.model_selection import InstanceHardnessCV + +logistic_regression = LogisticRegression() + +results = {} +for cv in ( + StratifiedKFold(n_splits=5, shuffle=True, random_state=10), + InstanceHardnessCV(estimator=LogisticRegression()), +): + result = cross_validate( + logistic_regression, + X, + y, + cv=cv, + scoring="average_precision", + ) + results[cv.__class__.__name__] = result["test_score"] +results = pd.DataFrame(results) + +# %% +ax = results.plot.box(vert=False, whis=[0, 100]) +_ = ax.set( + xlabel="Average precision", + title="Cross validation scores with different splitters", + xlim=(0, 1), +) + +# %% +# The boxplot shows that the :class:`~imblearn.model_selection.InstanceHardnessCV` +# splitter results in less variation of average precision than +# :class:`~sklearn.model_selection.StratifiedKFold` splitter. When doing +# hyperparameter tuning or feature selection using a wrapper method (like +# :class:`~sklearn.feature_selection.RFECV`) this will give more stable results. diff --git a/examples/pipeline/README.txt b/examples/pipeline/README.txt index a433e93d2..0448da5af 100644 --- a/examples/pipeline/README.txt +++ b/examples/pipeline/README.txt @@ -3,4 +3,4 @@ Pipeline examples ================= -Example of how to use the a pipeline to include under-sampling with `scikit-learn` estimators. \ No newline at end of file +Example of how to use the a pipeline to include under-sampling with `scikit-learn` estimators. diff --git a/imblearn/VERSION.txt b/imblearn/VERSION.txt new file mode 100644 index 000000000..8bd8554bb --- /dev/null +++ b/imblearn/VERSION.txt @@ -0,0 +1 @@ +0.15.dev0 diff --git a/imblearn/__init__.py b/imblearn/__init__.py index 8a8e7ee2d..df05d4b34 100644 --- a/imblearn/__init__.py +++ b/imblearn/__init__.py @@ -11,7 +11,7 @@ Module which provides methods generating an ensemble of under-sampled subsets. exceptions - Module including custom warnings and error clases used across + Module including custom warnings and error classes used across imbalanced-learn. keras Module which provides custom generator, layers for deep learning using @@ -19,6 +19,8 @@ metrics Module which provides metrics to quantified the classification performance with imbalanced dataset. +model_selection + Module which provides methods to split the dataset into training and test sets. over_sampling Module which provides methods to over-sample a dataset. tensorflow @@ -54,6 +56,7 @@ ensemble, exceptions, metrics, + model_selection, over_sampling, pipeline, tensorflow, @@ -113,6 +116,7 @@ def __dir__(self): "exceptions", "keras", "metrics", + "model_selection", "over_sampling", "tensorflow", "under_sampling", diff --git a/imblearn/_config.py b/imblearn/_config.py deleted file mode 100644 index ef98e7305..000000000 --- a/imblearn/_config.py +++ /dev/null @@ -1,344 +0,0 @@ -"""This is copy of sklearn/_config.py -# TODO: remove this file when scikit-learn minimum version is 1.3 -We remove the array_api_dispatch for the moment. -""" -import os -import threading -from contextlib import contextmanager as contextmanager - -import sklearn -from sklearn.utils.fixes import parse_version - -sklearn_version = parse_version(sklearn.__version__) - -if sklearn_version < parse_version("1.3"): - _global_config = { - "assume_finite": bool(os.environ.get("SKLEARN_ASSUME_FINITE", False)), - "working_memory": int(os.environ.get("SKLEARN_WORKING_MEMORY", 1024)), - "print_changed_only": True, - "display": "diagram", - "pairwise_dist_chunk_size": int( - os.environ.get("SKLEARN_PAIRWISE_DIST_CHUNK_SIZE", 256) - ), - "enable_cython_pairwise_dist": True, - "transform_output": "default", - "enable_metadata_routing": False, - "skip_parameter_validation": False, - } - _threadlocal = threading.local() - - def _get_threadlocal_config(): - """Get a threadlocal **mutable** configuration. If the configuration - does not exist, copy the default global configuration.""" - if not hasattr(_threadlocal, "global_config"): - _threadlocal.global_config = _global_config.copy() - return _threadlocal.global_config - - def get_config(): - """Retrieve current values for configuration set by :func:`set_config`. - - Returns - ------- - config : dict - Keys are parameter names that can be passed to :func:`set_config`. - - See Also - -------- - config_context : Context manager for global scikit-learn configuration. - set_config : Set global scikit-learn configuration. - """ - # Return a copy of the threadlocal configuration so that users will - # not be able to modify the configuration with the returned dict. - return _get_threadlocal_config().copy() - - def set_config( - assume_finite=None, - working_memory=None, - print_changed_only=None, - display=None, - pairwise_dist_chunk_size=None, - enable_cython_pairwise_dist=None, - transform_output=None, - enable_metadata_routing=None, - skip_parameter_validation=None, - ): - """Set global scikit-learn configuration - - .. versionadded:: 0.19 - - Parameters - ---------- - assume_finite : bool, default=None - If True, validation for finiteness will be skipped, - saving time, but leading to potential crashes. If - False, validation for finiteness will be performed, - avoiding error. Global default: False. - - .. versionadded:: 0.19 - - working_memory : int, default=None - If set, scikit-learn will attempt to limit the size of temporary arrays - to this number of MiB (per job when parallelised), often saving both - computation time and memory on expensive operations that can be - performed in chunks. Global default: 1024. - - .. versionadded:: 0.20 - - print_changed_only : bool, default=None - If True, only the parameters that were set to non-default - values will be printed when printing an estimator. For example, - ``print(SVC())`` while True will only print 'SVC()' while the default - behaviour would be to print 'SVC(C=1.0, cache_size=200, ...)' with - all the non-changed parameters. - - .. versionadded:: 0.21 - - display : {'text', 'diagram'}, default=None - If 'diagram', estimators will be displayed as a diagram in a Jupyter - lab or notebook context. If 'text', estimators will be displayed as - text. Default is 'diagram'. - - .. versionadded:: 0.23 - - pairwise_dist_chunk_size : int, default=None - The number of row vectors per chunk for the accelerated pairwise- - distances reduction backend. Default is 256 (suitable for most of - modern laptops' caches and architectures). - - Intended for easier benchmarking and testing of scikit-learn internals. - End users are not expected to benefit from customizing this configuration - setting. - - .. versionadded:: 1.1 - - enable_cython_pairwise_dist : bool, default=None - Use the accelerated pairwise-distances reduction backend when - possible. Global default: True. - - Intended for easier benchmarking and testing of scikit-learn internals. - End users are not expected to benefit from customizing this configuration - setting. - - .. versionadded:: 1.1 - - transform_output : str, default=None - Configure output of `transform` and `fit_transform`. - - See :ref:`sphx_glr_auto_examples_miscellaneous_plot_set_output.py` - for an example on how to use the API. - - - `"default"`: Default output format of a transformer - - `"pandas"`: DataFrame output - - `None`: Transform configuration is unchanged - - .. versionadded:: 1.2 - - enable_metadata_routing : bool, default=None - Enable metadata routing. By default this feature is disabled. - - Refer to :ref:`metadata routing user guide ` for more - details. - - - `True`: Metadata routing is enabled - - `False`: Metadata routing is disabled, use the old syntax. - - `None`: Configuration is unchanged - - .. versionadded:: 1.3 - - skip_parameter_validation : bool, default=None - If `True`, disable the validation of the hyper-parameters' types - and values in the fit method of estimators and for arguments passed - to public helper functions. It can save time in some situations but - can lead to low level crashes and exceptions with confusing error - messages. - - Note that for data parameters, such as `X` and `y`, only type validation is - skipped but validation with `check_array` will continue to run. - - .. versionadded:: 1.3 - - See Also - -------- - config_context : Context manager for global scikit-learn configuration. - get_config : Retrieve current values of the global configuration. - """ - local_config = _get_threadlocal_config() - - if assume_finite is not None: - local_config["assume_finite"] = assume_finite - if working_memory is not None: - local_config["working_memory"] = working_memory - if print_changed_only is not None: - local_config["print_changed_only"] = print_changed_only - if display is not None: - local_config["display"] = display - if pairwise_dist_chunk_size is not None: - local_config["pairwise_dist_chunk_size"] = pairwise_dist_chunk_size - if enable_cython_pairwise_dist is not None: - local_config["enable_cython_pairwise_dist"] = enable_cython_pairwise_dist - if transform_output is not None: - local_config["transform_output"] = transform_output - if enable_metadata_routing is not None: - local_config["enable_metadata_routing"] = enable_metadata_routing - if skip_parameter_validation is not None: - local_config["skip_parameter_validation"] = skip_parameter_validation - - @contextmanager - def config_context( - *, - assume_finite=None, - working_memory=None, - print_changed_only=None, - display=None, - pairwise_dist_chunk_size=None, - enable_cython_pairwise_dist=None, - transform_output=None, - enable_metadata_routing=None, - skip_parameter_validation=None, - ): - """Context manager for global scikit-learn configuration. - - Parameters - ---------- - assume_finite : bool, default=None - If True, validation for finiteness will be skipped, - saving time, but leading to potential crashes. If - False, validation for finiteness will be performed, - avoiding error. If None, the existing value won't change. - The default value is False. - - working_memory : int, default=None - If set, scikit-learn will attempt to limit the size of temporary arrays - to this number of MiB (per job when parallelised), often saving both - computation time and memory on expensive operations that can be - performed in chunks. If None, the existing value won't change. - The default value is 1024. - - print_changed_only : bool, default=None - If True, only the parameters that were set to non-default - values will be printed when printing an estimator. For example, - ``print(SVC())`` while True will only print 'SVC()', but would print - 'SVC(C=1.0, cache_size=200, ...)' with all the non-changed parameters - when False. If None, the existing value won't change. - The default value is True. - - .. versionchanged:: 0.23 - Default changed from False to True. - - display : {'text', 'diagram'}, default=None - If 'diagram', estimators will be displayed as a diagram in a Jupyter - lab or notebook context. If 'text', estimators will be displayed as - text. If None, the existing value won't change. - The default value is 'diagram'. - - .. versionadded:: 0.23 - - pairwise_dist_chunk_size : int, default=None - The number of row vectors per chunk for the accelerated pairwise- - distances reduction backend. Default is 256 (suitable for most of - modern laptops' caches and architectures). - - Intended for easier benchmarking and testing of scikit-learn internals. - End users are not expected to benefit from customizing this configuration - setting. - - .. versionadded:: 1.1 - - enable_cython_pairwise_dist : bool, default=None - Use the accelerated pairwise-distances reduction backend when - possible. Global default: True. - - Intended for easier benchmarking and testing of scikit-learn internals. - End users are not expected to benefit from customizing this configuration - setting. - - .. versionadded:: 1.1 - - transform_output : str, default=None - Configure output of `transform` and `fit_transform`. - - See :ref:`sphx_glr_auto_examples_miscellaneous_plot_set_output.py` - for an example on how to use the API. - - - `"default"`: Default output format of a transformer - - `"pandas"`: DataFrame output - - `None`: Transform configuration is unchanged - - .. versionadded:: 1.2 - - enable_metadata_routing : bool, default=None - Enable metadata routing. By default this feature is disabled. - - Refer to :ref:`metadata routing user guide ` for more - details. - - - `True`: Metadata routing is enabled - - `False`: Metadata routing is disabled, use the old syntax. - - `None`: Configuration is unchanged - - .. versionadded:: 1.3 - - skip_parameter_validation : bool, default=None - If `True`, disable the validation of the hyper-parameters' types - and values in the fit method of estimators and for arguments passed - to public helper functions. It can save time in some situations but - can lead to low level crashes and exceptions with confusing error - messages. - - Note that for data parameters, such as `X` and `y`, only type validation is - skipped but validation with `check_array` will continue to run. - - .. versionadded:: 1.3 - - Yields - ------ - None. - - See Also - -------- - set_config : Set global scikit-learn configuration. - get_config : Retrieve current values of the global configuration. - - Notes - ----- - All settings, not just those presently modified, will be returned to - their previous values when the context manager is exited. - - Examples - -------- - >>> import sklearn - >>> from sklearn.utils.validation import assert_all_finite - >>> with sklearn.config_context(assume_finite=True): - ... assert_all_finite([float('nan')]) - >>> with sklearn.config_context(assume_finite=True): - ... with sklearn.config_context(assume_finite=False): - ... assert_all_finite([float('nan')]) - Traceback (most recent call last): - ... - ValueError: Input contains NaN... - """ - old_config = get_config() - set_config( - assume_finite=assume_finite, - working_memory=working_memory, - print_changed_only=print_changed_only, - display=display, - pairwise_dist_chunk_size=pairwise_dist_chunk_size, - enable_cython_pairwise_dist=enable_cython_pairwise_dist, - transform_output=transform_output, - enable_metadata_routing=enable_metadata_routing, - skip_parameter_validation=skip_parameter_validation, - ) - - try: - yield - finally: - set_config(**old_config) - -else: - from sklearn._config import ( # type: ignore[no-redef] - _get_threadlocal_config, - _global_config, - config_context, # noqa - get_config, - ) diff --git a/imblearn/_min_dependencies.py b/imblearn/_min_dependencies.py deleted file mode 100644 index ec1f5dedb..000000000 --- a/imblearn/_min_dependencies.py +++ /dev/null @@ -1,60 +0,0 @@ -"""All minimum dependencies for imbalanced-learn.""" -import argparse - -NUMPY_MIN_VERSION = "1.17.3" -SCIPY_MIN_VERSION = "1.5.0" -PANDAS_MIN_VERSION = "1.0.5" -SKLEARN_MIN_VERSION = "1.0.2" -TENSORFLOW_MIN_VERSION = "2.4.3" -KERAS_MIN_VERSION = "2.4.3" -JOBLIB_MIN_VERSION = "1.1.1" -THREADPOOLCTL_MIN_VERSION = "2.0.0" -PYTEST_MIN_VERSION = "5.0.1" - -# 'build' and 'install' is included to have structured metadata for CI. -# It will NOT be included in setup's extras_require -# The values are (version_spec, comma separated tags) -dependent_packages = { - "numpy": (NUMPY_MIN_VERSION, "install"), - "scipy": (SCIPY_MIN_VERSION, "install"), - "scikit-learn": (SKLEARN_MIN_VERSION, "install"), - "joblib": (JOBLIB_MIN_VERSION, "install"), - "threadpoolctl": (THREADPOOLCTL_MIN_VERSION, "install"), - "pandas": (PANDAS_MIN_VERSION, "optional, docs, examples, tests"), - "tensorflow": (TENSORFLOW_MIN_VERSION, "optional, docs, examples, tests"), - "keras": (KERAS_MIN_VERSION, "optional, docs, examples, tests"), - "matplotlib": ("3.1.2", "docs, examples"), - "seaborn": ("0.9.0", "docs, examples"), - "memory_profiler": ("0.57.0", "docs"), - "pytest": (PYTEST_MIN_VERSION, "tests"), - "pytest-cov": ("2.9.0", "tests"), - "flake8": ("3.8.2", "tests"), - "black": ("23.3.0", "tests"), - "mypy": ("1.3.0", "tests"), - "sphinx": ("6.0.0", "docs"), - "sphinx-gallery": ("0.13.0", "docs"), - "sphinx-copybutton": ("0.5.2", "docs"), - "numpydoc": ("1.5.0", "docs"), - "sphinxcontrib-bibtex": ("2.4.1", "docs"), - "pydata-sphinx-theme": ("0.13.3", "docs"), - "sphinx-design": ("0.5.0", "docs"), -} - - -# create inverse mapping for setuptools -tag_to_packages: dict = { - extra: [] for extra in ["install", "optional", "docs", "examples", "tests"] -} -for package, (min_version, extras) in dependent_packages.items(): - for extra in extras.split(", "): - tag_to_packages[extra].append("{}>={}".format(package, min_version)) - - -# Used by CI to get the min dependencies -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Get min dependencies for a package") - - parser.add_argument("package", choices=dependent_packages) - args = parser.parse_args() - min_version = dependent_packages[args.package][0] - print(min_version) diff --git a/imblearn/_version.py b/imblearn/_version.py index c352e6bdf..10a968e78 100644 --- a/imblearn/_version.py +++ b/imblearn/_version.py @@ -20,6 +20,8 @@ # # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' -# -__version__ = "0.13.0.dev0" +from pathlib import Path + +with open(Path(__file__).parent / "VERSION.txt") as _fh: + __version__ = _fh.read().strip() diff --git a/imblearn/base.py b/imblearn/base.py index 0b2d94e84..eeabf8322 100644 --- a/imblearn/base.py +++ b/imblearn/base.py @@ -7,46 +7,31 @@ from abc import ABCMeta, abstractmethod import numpy as np -import sklearn -from sklearn.base import BaseEstimator - -try: - # scikit-learn >= 1.2 - from sklearn.base import OneToOneFeatureMixin -except ImportError: - from sklearn.base import _OneToOneFeatureMixin as OneToOneFeatureMixin - +from sklearn.base import BaseEstimator, OneToOneFeatureMixin from sklearn.preprocessing import label_binarize -from sklearn.utils.fixes import parse_version +from sklearn.utils._metadata_requests import METHODS from sklearn.utils.multiclass import check_classification_targets from .utils import check_sampling_strategy, check_target_type -from .utils._param_validation import validate_parameter_constraints +from .utils._sklearn_compat import _fit_context, get_tags, validate_data from .utils._validation import ArraysTransformer -sklearn_version = parse_version(sklearn.__version__) +if "fit_predict" not in METHODS: + METHODS.append("fit_predict") +if "fit_transform" not in METHODS: + METHODS.append("fit_transform") +METHODS.append("fit_resample") +try: + from sklearn.utils._metadata_requests import SIMPLE_METHODS -class _ParamsValidationMixin: - """Mixin class to validate parameters.""" - - def _validate_params(self): - """Validate types and values of constructor parameters. - - The expected type and values must be defined in the `_parameter_constraints` - class attribute, which is a dictionary `param_name: list of constraints`. See - the docstring of `validate_parameter_constraints` for a description of the - accepted constraints. - """ - if hasattr(self, "_parameter_constraints"): - validate_parameter_constraints( - self._parameter_constraints, - self.get_params(deep=False), - caller_name=self.__class__.__name__, - ) + SIMPLE_METHODS.append("fit_resample") +except ImportError: + # in older versions of scikit-learn, only METHODS is used + pass -class SamplerMixin(_ParamsValidationMixin, BaseEstimator, metaclass=ABCMeta): +class SamplerMixin(metaclass=ABCMeta): """Mixin class for samplers with abstract method. Warning: This class should not be used directly. Use the derive classes @@ -55,7 +40,8 @@ class SamplerMixin(_ParamsValidationMixin, BaseEstimator, metaclass=ABCMeta): _estimator_type = "sampler" - def fit(self, X, y): + @_fit_context(prefer_skip_nested_validation=True) + def fit(self, X, y, **params): """Check inputs and statistics of the sampler. You should use ``fit_resample`` in all cases. @@ -69,6 +55,9 @@ def fit(self, X, y): y : array-like of shape (n_samples,) Target array. + **params : dict + Extra parameters to use by the sampler. + Returns ------- self : object @@ -80,7 +69,8 @@ def fit(self, X, y): ) return self - def fit_resample(self, X, y): + @_fit_context(prefer_skip_nested_validation=True) + def fit_resample(self, X, y, **params): """Resample the dataset. Parameters @@ -92,6 +82,9 @@ def fit_resample(self, X, y): y : array-like of shape (n_samples,) Corresponding label for each sample in X. + **params : dict + Extra parameters to use by the sampler. + Returns ------- X_resampled : {array-like, dataframe, sparse matrix} of shape \ @@ -109,7 +102,7 @@ def fit_resample(self, X, y): self.sampling_strategy, y, self._sampling_type ) - output = self._fit_resample(X, y) + output = self._fit_resample(X, y, **params) y_ = ( label_binarize(output[1], classes=np.unique(y)) if binarize_y else output[1] @@ -119,7 +112,7 @@ def fit_resample(self, X, y): return (X_, y_) if len(output) == 2 else (X_, y_, output[2]) @abstractmethod - def _fit_resample(self, X, y): + def _fit_resample(self, X, y, **params): """Base method defined in each sampler to defined the sampling strategy. @@ -131,6 +124,9 @@ def _fit_resample(self, X, y): y : array-like of shape (n_samples,) Corresponding label for each sample in X. + **params : dict + Extra parameters to use by the sampler. + Returns ------- X_resampled : {ndarray, sparse matrix} of shape \ @@ -144,7 +140,7 @@ def _fit_resample(self, X, y): pass -class BaseSampler(SamplerMixin, OneToOneFeatureMixin): +class BaseSampler(SamplerMixin, OneToOneFeatureMixin, BaseEstimator): """Base class for sampling algorithms. Warning: This class should not be used directly. Use the derive classes @@ -158,10 +154,10 @@ def _check_X_y(self, X, y, accept_sparse=None): if accept_sparse is None: accept_sparse = ["csr", "csc"] y, binarize_y = check_target_type(y, indicate_one_vs_all=True) - X, y = self._validate_data(X, y, reset=True, accept_sparse=accept_sparse) + X, y = validate_data(self, X=X, y=y, reset=True, accept_sparse=accept_sparse) return X, y, binarize_y - def fit(self, X, y): + def fit(self, X, y, **params): """Check inputs and statistics of the sampler. You should use ``fit_resample`` in all cases. @@ -180,10 +176,9 @@ def fit(self, X, y): self : object Return the instance itself. """ - self._validate_params() - return super().fit(X, y) + return super().fit(X, y, **params) - def fit_resample(self, X, y): + def fit_resample(self, X, y, **params): """Resample the dataset. Parameters @@ -204,12 +199,29 @@ def fit_resample(self, X, y): y_resampled : array-like of shape (n_samples_new,) The corresponding label of `X_resampled`. """ - self._validate_params() - return super().fit_resample(X, y) + return super().fit_resample(X, y, **params) def _more_tags(self): return {"X_types": ["2darray", "sparse", "dataframe"]} + def __sklearn_tags__(self): + from .utils._sklearn_compat import TargetTags + from .utils._tags import InputTags, SamplerTags, Tags + + tags = Tags( + estimator_type="sampler", + target_tags=TargetTags(required=True), + transformer_tags=None, + regressor_tags=None, + classifier_tags=None, + sampler_tags=SamplerTags(), + ) + tags.input_tags = InputTags() + tags.input_tags.two_d_array = True + tags.input_tags.sparse = True + tags.input_tags.dataframe = True + return tags + def _identity(X, y): return X, y @@ -228,7 +240,11 @@ def is_sampler(estimator): is_sampler : bool True if estimator is a sampler, otherwise False. """ - if estimator._estimator_type == "sampler": + + if hasattr(estimator, "_estimator_type") and estimator._estimator_type == "sampler": + return True + tags = get_tags(estimator) + if hasattr(tags, "sampler_tags") and tags.sampler_tags is not None: return True return False diff --git a/imblearn/combine/_smote_enn.py b/imblearn/combine/_smote_enn.py index 1b0ffe0b8..d9d65c792 100644 --- a/imblearn/combine/_smote_enn.py +++ b/imblearn/combine/_smote_enn.py @@ -141,7 +141,6 @@ def _validate_estimator(self): self.smote_ = SMOTE( sampling_strategy=self.sampling_strategy, random_state=self.random_state, - n_jobs=self.n_jobs, ) if self.enn is not None: diff --git a/imblearn/combine/_smote_tomek.py b/imblearn/combine/_smote_tomek.py index 94d7c4d01..a0c606dd0 100644 --- a/imblearn/combine/_smote_tomek.py +++ b/imblearn/combine/_smote_tomek.py @@ -140,7 +140,6 @@ def _validate_estimator(self): self.smote_ = SMOTE( sampling_strategy=self.sampling_strategy, random_state=self.random_state, - n_jobs=self.n_jobs, ) if self.tomek is not None: diff --git a/imblearn/combine/tests/test_smote_enn.py b/imblearn/combine/tests/test_smote_enn.py index df72cc749..f6eb7b37c 100644 --- a/imblearn/combine/tests/test_smote_enn.py +++ b/imblearn/combine/tests/test_smote_enn.py @@ -146,12 +146,10 @@ def test_parallelisation(): smt = SMOTEENN(random_state=RND_SEED) smt._validate_estimator() assert smt.n_jobs is None - assert smt.smote_.n_jobs is None assert smt.enn_.n_jobs is None # Check if job count is set smt = SMOTEENN(random_state=RND_SEED, n_jobs=8) smt._validate_estimator() assert smt.n_jobs == 8 - assert smt.smote_.n_jobs == 8 assert smt.enn_.n_jobs == 8 diff --git a/imblearn/combine/tests/test_smote_tomek.py b/imblearn/combine/tests/test_smote_tomek.py index 2ca3e38c2..97795e4bc 100644 --- a/imblearn/combine/tests/test_smote_tomek.py +++ b/imblearn/combine/tests/test_smote_tomek.py @@ -156,12 +156,10 @@ def test_parallelisation(): smt = SMOTETomek(random_state=RND_SEED) smt._validate_estimator() assert smt.n_jobs is None - assert smt.smote_.n_jobs is None assert smt.tomek_.n_jobs is None # Check if job count is set smt = SMOTETomek(random_state=RND_SEED, n_jobs=8) smt._validate_estimator() assert smt.n_jobs == 8 - assert smt.smote_.n_jobs == 8 assert smt.tomek_.n_jobs == 8 diff --git a/imblearn/datasets/_imbalance.py b/imblearn/datasets/_imbalance.py index 9e6e51290..c216042cf 100644 --- a/imblearn/datasets/_imbalance.py +++ b/imblearn/datasets/_imbalance.py @@ -10,7 +10,7 @@ from ..under_sampling import RandomUnderSampler from ..utils import check_sampling_strategy -from ..utils._param_validation import validate_params +from ..utils._sklearn_compat import validate_params @validate_params( diff --git a/imblearn/datasets/_zenodo.py b/imblearn/datasets/_zenodo.py index a73ef37b1..e8d8138ac 100644 --- a/imblearn/datasets/_zenodo.py +++ b/imblearn/datasets/_zenodo.py @@ -45,6 +45,7 @@ import tarfile from collections import OrderedDict +from inspect import signature from io import BytesIO from os import makedirs from os.path import isfile, join @@ -54,7 +55,7 @@ from sklearn.datasets import get_data_home from sklearn.utils import Bunch, check_random_state -from ..utils._param_validation import validate_params +from ..utils._sklearn_compat import validate_params URL = "https://zenodo.org/record/61452/files/benchmark-imbalanced-learn.tar.gz" PRE_FILENAME = "x" @@ -254,7 +255,7 @@ def fetch_datasets( if it < 1 or it > 27: raise ValueError( f"The dataset with the ID={it} is not an " - f"available dataset. The IDs are " + "available dataset. The IDs are " f"{range(1, 28)}" ) else: @@ -263,7 +264,7 @@ def fetch_datasets( filter_data_.append(MAP_ID_NAME[it]) else: raise ValueError( - f"The value in the tuple should be str or int." + "The value in the tuple should be str or int." f" Got {type(it)} instead." ) @@ -279,7 +280,10 @@ def fetch_datasets( print("Downloading %s" % URL) f = BytesIO(urlopen(URL).read()) tar = tarfile.open(fileobj=f) - tar.extractall(path=zenodo_dir) + if "filter" in signature(tar.extractall).parameters: + tar.extractall(path=zenodo_dir, filter="data") + else: # Python < 3.12 + tar.extractall(path=zenodo_dir) elif not download_if_missing and not available: raise IOError("Data not found and `download_if_missing` is False") diff --git a/imblearn/ensemble/_bagging.py b/imblearn/ensemble/_bagging.py index acb0c70fa..25e49c538 100644 --- a/imblearn/ensemble/_bagging.py +++ b/imblearn/ensemble/_bagging.py @@ -6,38 +6,19 @@ import copy import numbers -import warnings import numpy as np -import sklearn from sklearn.base import clone from sklearn.ensemble import BaggingClassifier -from sklearn.ensemble._bagging import _parallel_decision_function -from sklearn.ensemble._base import _partition_estimators -from sklearn.exceptions import NotFittedError from sklearn.tree import DecisionTreeClassifier -from sklearn.utils.fixes import parse_version -from sklearn.utils.validation import check_is_fitted +from sklearn.utils._param_validation import HasMethods, Interval, StrOptions -try: - # scikit-learn >= 1.2 - from sklearn.utils.parallel import Parallel, delayed -except (ImportError, ModuleNotFoundError): - from joblib import Parallel - from sklearn.utils.fixes import delayed - -from ..base import _ParamsValidationMixin from ..pipeline import Pipeline from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler from ..utils import Substitution, check_sampling_strategy, check_target_type -from ..utils._available_if import available_if from ..utils._docstring import _n_jobs_docstring, _random_state_docstring -from ..utils._param_validation import HasMethods, Interval, StrOptions -from ..utils.fixes import _fit_context -from ._common import _bagging_parameter_constraints, _estimator_has - -sklearn_version = parse_version(sklearn.__version__) +from ..utils._sklearn_compat import _fit_context @Substitution( @@ -45,7 +26,7 @@ n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) -class BalancedBaggingClassifier(_ParamsValidationMixin, BaggingClassifier): +class BalancedBaggingClassifier(BaggingClassifier): """A Bagging classifier with additional balancing. This implementation of Bagging is similar to the scikit-learn @@ -128,14 +109,6 @@ class BalancedBaggingClassifier(_ParamsValidationMixin, BaggingClassifier): .. versionadded:: 0.10 - n_features_ : int - The number of features when `fit` is performed. - - .. deprecated:: 1.0 - `n_features_` is deprecated in `scikit-learn` 1.0 and will be removed - in version 1.2. When the minimum version of `scikit-learn` supported - by `imbalanced-learn` will reach 1.2, this attribute will be removed. - estimators_ : list of estimators The collection of fitted base estimators. @@ -249,11 +222,7 @@ class BalancedBaggingClassifier(_ParamsValidationMixin, BaggingClassifier): """ # make a deepcopy to not modify the original dictionary - if sklearn_version >= parse_version("1.4"): - _parameter_constraints = copy.deepcopy(BaggingClassifier._parameter_constraints) - else: - _parameter_constraints = copy.deepcopy(_bagging_parameter_constraints) - + _parameter_constraints = copy.deepcopy(BaggingClassifier._parameter_constraints) _parameter_constraints.update( { "sampling_strategy": [ @@ -266,9 +235,6 @@ class BalancedBaggingClassifier(_ParamsValidationMixin, BaggingClassifier): "sampler": [HasMethods(["fit_resample"]), None], } ) - # TODO: remove when minimum supported version of scikit-learn is 1.4 - if "base_estimator" in _parameter_constraints: - del _parameter_constraints["base_estimator"] def __init__( self, @@ -338,18 +304,6 @@ def _validate_estimator(self, default=DecisionTreeClassifier()): [("sampler", self.sampler_), ("classifier", estimator)] ) - # TODO: remove when supporting scikit-learn>=1.2 - @property - def n_features_(self): - """Number of features when ``fit`` is performed.""" - warnings.warn( - "`n_features_` was deprecated in scikit-learn 1.0. This attribute will " - "not be accessible when the minimum supported version of scikit-learn " - "is 1.2.", - FutureWarning, - ) - return self.n_features_in_ - @_fit_context(prefer_skip_nested_validation=False) def fit(self, X, y): """Build a Bagging ensemble of estimators from the training set (X, y). @@ -388,67 +342,12 @@ def _fit(self, X, y, max_samples=None, max_depth=None, sample_weight=None): # None. return super()._fit(X, y, self.max_samples) - # TODO: remove when minimum supported version of scikit-learn is 1.1 - @available_if(_estimator_has("decision_function")) - def decision_function(self, X): - """Average of the decision functions of the base classifiers. - - Parameters - ---------- - X : {array-like, sparse matrix} of shape (n_samples, n_features) - The training input samples. Sparse matrices are accepted only if - they are supported by the base estimator. - - Returns - ------- - score : ndarray of shape (n_samples, k) - The decision function of the input samples. The columns correspond - to the classes in sorted order, as they appear in the attribute - ``classes_``. Regression and binary classification are special - cases with ``k == 1``, otherwise ``k==n_classes``. - """ - check_is_fitted(self) - - # Check data - X = self._validate_data( - X, - accept_sparse=["csr", "csc"], - dtype=None, - force_all_finite=False, - reset=False, - ) - - # Parallel loop - n_jobs, _, starts = _partition_estimators(self.n_estimators, self.n_jobs) - - all_decisions = Parallel(n_jobs=n_jobs, verbose=self.verbose)( - delayed(_parallel_decision_function)( - self.estimators_[starts[i] : starts[i + 1]], - self.estimators_features_[starts[i] : starts[i + 1]], - X, - ) - for i in range(n_jobs) - ) - - # Reduce - decisions = sum(all_decisions) / self.n_estimators - - return decisions - @property def base_estimator_(self): """Attribute for older sklearn version compatibility.""" error = AttributeError( f"{self.__class__.__name__} object has no attribute 'base_estimator_'." ) - if sklearn_version < parse_version("1.2"): - # The base class require to have the attribute defined. For scikit-learn - # > 1.2, we are going to raise an error. - try: - check_is_fitted(self) - return self.estimator_ - except NotFittedError: - raise error raise error def _more_tags(self): @@ -461,3 +360,7 @@ def _more_tags(self): else: tags[tags_key] = {failing_test: reason} return tags + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + return tags diff --git a/imblearn/ensemble/_common.py b/imblearn/ensemble/_common.py index 588fa5e2c..e7353887d 100644 --- a/imblearn/ensemble/_common.py +++ b/imblearn/ensemble/_common.py @@ -1,8 +1,7 @@ from numbers import Integral, Real from sklearn.tree._criterion import Criterion - -from ..utils._param_validation import ( +from sklearn.utils._param_validation import ( HasMethods, Hidden, Interval, @@ -20,10 +19,8 @@ def _estimator_has(attr): def check(self): if hasattr(self, "estimators_"): return hasattr(self.estimators_[0], attr) - elif self.estimator is not None: + else: # self.estimator is not None return hasattr(self.estimator, attr) - else: # TODO(1.4): Remove when the base_estimator deprecation cycle ends - return hasattr(self.base_estimator, attr) return check @@ -46,11 +43,6 @@ def check(self): "n_jobs": [None, Integral], "random_state": ["random_state"], "verbose": ["verbose"], - "base_estimator": [ - HasMethods(["fit", "predict"]), - StrOptions({"deprecated"}), - None, - ], } _adaboost_classifier_parameter_constraints = { diff --git a/imblearn/ensemble/_easy_ensemble.py b/imblearn/ensemble/_easy_ensemble.py index e3c85741c..afd0cae22 100644 --- a/imblearn/ensemble/_easy_ensemble.py +++ b/imblearn/ensemble/_easy_ensemble.py @@ -6,39 +6,26 @@ import copy import numbers -import warnings import numpy as np -import sklearn from sklearn.base import clone from sklearn.ensemble import AdaBoostClassifier, BaggingClassifier -from sklearn.ensemble._bagging import _parallel_decision_function -from sklearn.ensemble._base import _partition_estimators -from sklearn.exceptions import NotFittedError -from sklearn.utils._tags import _safe_tags +from sklearn.utils._param_validation import Interval, StrOptions from sklearn.utils.fixes import parse_version -from sklearn.utils.validation import check_is_fitted -try: - # scikit-learn >= 1.2 - from sklearn.utils.parallel import Parallel, delayed -except (ImportError, ModuleNotFoundError): - from joblib import Parallel - from sklearn.utils.fixes import delayed - -from ..base import _ParamsValidationMixin from ..pipeline import Pipeline from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler from ..utils import Substitution, check_sampling_strategy, check_target_type -from ..utils._available_if import available_if from ..utils._docstring import _n_jobs_docstring, _random_state_docstring -from ..utils._param_validation import Interval, StrOptions -from ..utils.fixes import _fit_context -from ._common import _bagging_parameter_constraints, _estimator_has +from ..utils._sklearn_compat import ( + _fit_context, + get_tags, + sklearn_version, +) +from ._common import _bagging_parameter_constraints MAX_INT = np.iinfo(np.int32).max -sklearn_version = parse_version(sklearn.__version__) @Substitution( @@ -46,7 +33,7 @@ n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) -class EasyEnsembleClassifier(_ParamsValidationMixin, BaggingClassifier): +class EasyEnsembleClassifier(BaggingClassifier): """Bag of balanced boosted learners also known as EasyEnsemble. This algorithm is known as EasyEnsemble [1]_. The classifier is an @@ -107,14 +94,6 @@ class EasyEnsembleClassifier(_ParamsValidationMixin, BaggingClassifier): n_classes_ : int or list The number of classes. - n_features_ : int - The number of features when `fit` is performed. - - .. deprecated:: 1.0 - `n_features_` is deprecated in `scikit-learn` 1.0 and will be removed - in version 1.2. When the minimum version of `scikit-learn` supported - by `imbalanced-learn` will reach 1.2, this attribute will be removed. - n_features_in_ : int Number of features in the input dataset. @@ -261,18 +240,6 @@ def _validate_estimator(self, default=AdaBoostClassifier(algorithm="SAMME")): ) self.estimator_ = Pipeline([("sampler", sampler), ("classifier", estimator)]) - # TODO: remove when supporting scikit-learn>=1.2 - @property - def n_features_(self): - """Number of features when ``fit`` is performed.""" - warnings.warn( - "`n_features_` was deprecated in scikit-learn 1.0. This attribute will " - "not be accessible when the minimum supported version of scikit-learn " - "is 1.2.", - FutureWarning, - ) - return self.n_features_in_ - @_fit_context(prefer_skip_nested_validation=False) def fit(self, X, y): """Build a Bagging ensemble of estimators from the training set (X, y). @@ -302,74 +269,26 @@ def _fit(self, X, y, max_samples=None, max_depth=None, sample_weight=None): # None. return super()._fit(X, y, self.max_samples) - # TODO: remove when minimum supported version of scikit-learn is 1.1 - @available_if(_estimator_has("decision_function")) - def decision_function(self, X): - """Average of the decision functions of the base classifiers. - - Parameters - ---------- - X : {array-like, sparse matrix} of shape (n_samples, n_features) - The training input samples. Sparse matrices are accepted only if - they are supported by the base estimator. - - Returns - ------- - score : ndarray of shape (n_samples, k) - The decision function of the input samples. The columns correspond - to the classes in sorted order, as they appear in the attribute - ``classes_``. Regression and binary classification are special - cases with ``k == 1``, otherwise ``k==n_classes``. - """ - check_is_fitted(self) - - # Check data - X = self._validate_data( - X, - accept_sparse=["csr", "csc"], - dtype=None, - force_all_finite=False, - reset=False, - ) - - # Parallel loop - n_jobs, _, starts = _partition_estimators(self.n_estimators, self.n_jobs) - - all_decisions = Parallel(n_jobs=n_jobs, verbose=self.verbose)( - delayed(_parallel_decision_function)( - self.estimators_[starts[i] : starts[i + 1]], - self.estimators_features_[starts[i] : starts[i + 1]], - X, - ) - for i in range(n_jobs) - ) - - # Reduce - decisions = sum(all_decisions) / self.n_estimators - - return decisions - @property def base_estimator_(self): """Attribute for older sklearn version compatibility.""" error = AttributeError( f"{self.__class__.__name__} object has no attribute 'base_estimator_'." ) - if sklearn_version < parse_version("1.2"): - # The base class require to have the attribute defined. For scikit-learn - # > 1.2, we are going to raise an error. - try: - check_is_fitted(self) - return self.estimator_ - except NotFittedError: - raise error raise error def _get_estimator(self): if self.estimator is None: - return AdaBoostClassifier(algorithm="SAMME") + if parse_version("1.4") <= sklearn_version < parse_version("1.6"): + return AdaBoostClassifier(algorithm="SAMME") + else: + return AdaBoostClassifier() return self.estimator - # TODO: remove when minimum supported version of scikit-learn is 1.5 def _more_tags(self): - return {"allow_nan": _safe_tags(self._get_estimator(), "allow_nan")} + return {"allow_nan": get_tags(self._get_estimator()).input_tags.allow_nan} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.allow_nan = get_tags(self._get_estimator()).input_tags.allow_nan + return tags diff --git a/imblearn/ensemble/_forest.py b/imblearn/ensemble/_forest.py index 5f8d08e91..a53ad9642 100644 --- a/imblearn/ensemble/_forest.py +++ b/imblearn/ensemble/_forest.py @@ -8,7 +8,6 @@ from warnings import warn import numpy as np -import sklearn from numpy import float32 as DTYPE from numpy import float64 as DOUBLE from scipy.sparse import issparse @@ -23,29 +22,21 @@ from sklearn.exceptions import DataConversionWarning from sklearn.tree import DecisionTreeClassifier from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import Hidden, Interval, StrOptions from sklearn.utils.fixes import parse_version from sklearn.utils.multiclass import type_of_target +from sklearn.utils.parallel import Parallel, delayed from sklearn.utils.validation import _check_sample_weight -try: - # scikit-learn >= 1.2 - from sklearn.utils.parallel import Parallel, delayed -except (ImportError, ModuleNotFoundError): - from joblib import Parallel - from sklearn.utils.fixes import delayed - -from ..base import _ParamsValidationMixin from ..pipeline import make_pipeline from ..under_sampling import RandomUnderSampler from ..utils import Substitution from ..utils._docstring import _n_jobs_docstring, _random_state_docstring -from ..utils._param_validation import Hidden, Interval, StrOptions +from ..utils._sklearn_compat import _fit_context, sklearn_version, validate_data from ..utils._validation import check_sampling_strategy -from ..utils.fixes import _fit_context from ._common import _random_forest_classifier_parameter_constraints MAX_INT = np.iinfo(np.int32).max -sklearn_version = parse_version(sklearn.__version__) def _local_parallel_build_trees( @@ -80,21 +71,12 @@ def _local_parallel_build_trees( "verbose": verbose, "class_weight": class_weight, "n_samples_bootstrap": n_samples_bootstrap, + "bootstrap": bootstrap, } - if parse_version(sklearn_version.base_version) >= parse_version("1.4"): - # TODO: remove when the minimum supported version of scikit-learn will be 1.4 - # support for missing values - params_parallel_build_trees[ - "missing_values_in_feature_mask" - ] = missing_values_in_feature_mask - - # TODO: remove when the minimum supported version of scikit-learn will be 1.1 - # change of signature in scikit-learn 1.1 - if parse_version(sklearn_version.base_version) >= parse_version("1.1"): - params_parallel_build_trees["bootstrap"] = bootstrap - else: - params_parallel_build_trees["forest"] = forest + params_parallel_build_trees["missing_values_in_feature_mask"] = ( + missing_values_in_feature_mask + ) tree = _parallel_build_trees(**params_parallel_build_trees) @@ -105,7 +87,7 @@ def _local_parallel_build_trees( n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) -class BalancedRandomForestClassifier(_ParamsValidationMixin, RandomForestClassifier): +class BalancedRandomForestClassifier(RandomForestClassifier): """A balanced random forest classifier. A balanced random forest differs from a classical random forest by the @@ -355,14 +337,6 @@ class labels (multi-output problem). The number of classes (single output problem), or a list containing the number of classes for each output (multi-output problem). - n_features_ : int - The number of features when `fit` is performed. - - .. deprecated:: 1.0 - `n_features_` is deprecated in `scikit-learn` 1.0 and will be removed - in version 1.2. When the minimum version of `scikit-learn` supported - by `imbalanced-learn` will reach 1.2, this attribute will be removed. - n_features_in_ : int Number of features in the input dataset. @@ -460,10 +434,10 @@ def __init__( max_features="sqrt", max_leaf_nodes=None, min_impurity_decrease=0.0, - bootstrap="warn", + bootstrap=False, oob_score=False, - sampling_strategy="warn", - replacement="warn", + sampling_strategy="all", + replacement=True, n_jobs=None, random_state=None, verbose=0, @@ -492,20 +466,9 @@ def __init__( "min_impurity_decrease": min_impurity_decrease, "ccp_alpha": ccp_alpha, "max_samples": max_samples, + "monotonic_cst": monotonic_cst, } - # TODO: remove when the minimum supported version of scikit-learn will be 1.4 - if parse_version(sklearn_version.base_version) >= parse_version("1.4"): - # use scikit-learn support for monotonic constraints - params_random_forest["monotonic_cst"] = monotonic_cst - else: - if monotonic_cst is not None: - raise ValueError( - "Monotonic constraints are not supported for scikit-learn " - "version < 1.4." - ) - # create an attribute for compatibility with other scikit-learn tools such - # as HTML representation. - self.monotonic_cst = monotonic_cst + super().__init__(**params_random_forest) self.sampling_strategy = sampling_strategy @@ -514,19 +477,14 @@ def __init__( def _validate_estimator(self, default=DecisionTreeClassifier()): """Check the estimator and the n_estimator attribute, set the `estimator_` attribute.""" - if hasattr(self, "estimator"): - base_estimator = self.estimator - else: - base_estimator = self.base_estimator - - if base_estimator is not None: - self.estimator_ = clone(base_estimator) + if self.estimator is not None: + self.estimator_ = clone(self.estimator) else: self.estimator_ = clone(default) self.base_sampler_ = RandomUnderSampler( sampling_strategy=self._sampling_strategy, - replacement=self._replacement, + replacement=self.replacement, ) def _make_sampler_estimator(self, random_state=None): @@ -572,77 +530,30 @@ def fit(self, X, y, sample_weight=None): The fitted instance. """ self._validate_params() - # TODO: remove in 0.13 - if self.sampling_strategy == "warn": - warn( - "The default of `sampling_strategy` will change from `'auto'` to " - "`'all'` in version 0.13. This change will follow the implementation " - "proposed in the original paper. Set to `'all'` to silence this " - "warning and adopt the future behaviour.", - FutureWarning, - ) - self._sampling_strategy = "auto" - else: - self._sampling_strategy = self.sampling_strategy - - if self.replacement == "warn": - warn( - "The default of `replacement` will change from `False` to " - "`True` in version 0.13. This change will follow the implementation " - "proposed in the original paper. Set to `True` to silence this " - "warning and adopt the future behaviour.", - FutureWarning, - ) - self._replacement = False - else: - self._replacement = self.replacement - - if self.bootstrap == "warn": - warn( - "The default of `bootstrap` will change from `True` to " - "`False` in version 0.13. This change will follow the implementation " - "proposed in the original paper. Set to `False` to silence this " - "warning and adopt the future behaviour.", - FutureWarning, - ) - self._bootstrap = True - else: - self._bootstrap = self.bootstrap - # Validate or convert input data if issparse(y): raise ValueError("sparse multilabel-indicator for y is not supported.") - # TODO: remove when the minimum supported version of scipy will be 1.4 - # Support for missing values - if parse_version(sklearn_version.base_version) >= parse_version("1.4"): - force_all_finite = False - else: - force_all_finite = True - - X, y = self._validate_data( - X, - y, + X, y = validate_data( + self, + X=X, + y=y, multi_output=True, accept_sparse="csc", dtype=DTYPE, - force_all_finite=force_all_finite, + ensure_all_finite=False, ) - # TODO: remove when the minimum supported version of scikit-learn will be 1.4 - if parse_version(sklearn_version.base_version) >= parse_version("1.4"): - # _compute_missing_values_in_feature_mask checks if X has missing values and - # will raise an error if the underlying tree base estimator can't handle - # missing values. Only the criterion is required to determine if the tree - # supports missing values. - estimator = type(self.estimator)(criterion=self.criterion) - missing_values_in_feature_mask = ( - estimator._compute_missing_values_in_feature_mask( - X, estimator_name=self.__class__.__name__ - ) + # _compute_missing_values_in_feature_mask checks if X has missing values and + # will raise an error if the underlying tree base estimator can't handle + # missing values. Only the criterion is required to determine if the tree + # supports missing values. + estimator = type(self.estimator)(criterion=self.criterion) + missing_values_in_feature_mask = ( + estimator._compute_missing_values_in_feature_mask( + X, estimator_name=self.__class__.__name__ ) - else: - missing_values_in_feature_mask = None + ) if sample_weight is not None: sample_weight = _check_sample_weight(sample_weight, X) @@ -657,9 +568,11 @@ def fit(self, X, y, sample_weight=None): y = np.atleast_1d(y) if y.ndim == 2 and y.shape[1] == 1: warn( - "A column-vector y was passed when a 1d array was" - " expected. Please change the shape of y to " - "(n_samples,), for example using ravel().", + ( + "A column-vector y was passed when a 1d array was" + " expected. Please change the shape of y to " + "(n_samples,), for example using ravel()." + ), DataConversionWarning, stacklevel=2, ) @@ -676,7 +589,7 @@ def fit(self, X, y, sample_weight=None): if getattr(y, "dtype", None) != DOUBLE or not y.flags.contiguous: y_encoded = np.ascontiguousarray(y_encoded, dtype=DOUBLE) - if isinstance(self._sampling_strategy, dict): + if isinstance(self.sampling_strategy, dict): self._sampling_strategy = { np.where(self.classes_[0] == key)[0][0]: value for key, value in check_sampling_strategy( @@ -686,7 +599,7 @@ def fit(self, X, y, sample_weight=None): ).items() } else: - self._sampling_strategy = self._sampling_strategy + self._sampling_strategy = self.sampling_strategy if expanded_class_weight is not None: if sample_weight is not None: @@ -702,7 +615,7 @@ def fit(self, X, y, sample_weight=None): # Check parameters self._validate_estimator() - if not self._bootstrap and self.oob_score: + if not self.bootstrap and self.oob_score: raise ValueError("Out of bag estimation only available if bootstrap=True") random_state = check_random_state(self.random_state) @@ -754,7 +667,7 @@ def fit(self, X, y, sample_weight=None): delayed(_local_parallel_build_trees)( s, t, - self._bootstrap, + self.bootstrap, X, y_encoded, sample_weight, @@ -885,9 +798,11 @@ def _compute_oob_predictions(self, X, y): for k in range(n_outputs): if (n_oob_pred == 0).any(): warn( - "Some inputs do not have OOB scores. This probably means " - "too few trees were used to compute any reliable OOB " - "estimates.", + ( + "Some inputs do not have OOB scores. This probably means " + "too few trees were used to compute any reliable OOB " + "estimates." + ), UserWarning, ) n_oob_pred[n_oob_pred == 0] = 1 @@ -895,20 +810,12 @@ def _compute_oob_predictions(self, X, y): return oob_pred - # TODO: remove when supporting scikit-learn>=1.2 - @property - def n_features_(self): - """Number of features when ``fit`` is performed.""" - warn( - "`n_features_` was deprecated in scikit-learn 1.0. This attribute will " - "not be accessible when the minimum supported version of scikit-learn " - "is 1.2.", - FutureWarning, - ) - return self.n_features_in_ - def _more_tags(self): - return { - "multioutput": False, - "multilabel": False, - } + return {"multioutput": False, "multilabel": False} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.target_tags.multi_output = False + tags.classifier_tags.multi_label = False + tags.input_tags.allow_nan = sklearn_version >= parse_version("1.4") + return tags diff --git a/imblearn/ensemble/_weight_boosting.py b/imblearn/ensemble/_weight_boosting.py index 9da02255e..177c6d872 100644 --- a/imblearn/ensemble/_weight_boosting.py +++ b/imblearn/ensemble/_weight_boosting.py @@ -1,35 +1,32 @@ import copy import numbers +import warnings from copy import deepcopy import numpy as np -import sklearn from sklearn.base import clone from sklearn.ensemble import AdaBoostClassifier from sklearn.ensemble._base import _set_random_states from sklearn.tree import DecisionTreeClassifier from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import Hidden, Interval, StrOptions from sklearn.utils.fixes import parse_version from sklearn.utils.validation import has_fit_parameter -from ..base import _ParamsValidationMixin from ..pipeline import make_pipeline from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler from ..utils import Substitution, check_target_type from ..utils._docstring import _random_state_docstring -from ..utils._param_validation import Interval, StrOptions -from ..utils.fixes import _fit_context +from ..utils._sklearn_compat import _fit_context, sklearn_version from ._common import _adaboost_classifier_parameter_constraints -sklearn_version = parse_version(sklearn.__version__) - @Substitution( sampling_strategy=BaseUnderSampler._sampling_strategy_docstring, random_state=_random_state_docstring, ) -class RUSBoostClassifier(_ParamsValidationMixin, AdaBoostClassifier): +class RUSBoostClassifier(AdaBoostClassifier): """Random under-sampling integrated in the learning of AdaBoost. During learning, the problem of class balancing is alleviated by random @@ -167,6 +164,10 @@ class RUSBoostClassifier(_ParamsValidationMixin, AdaBoostClassifier): _parameter_constraints.update( { + "algorithm": [ + StrOptions({"SAMME", "SAMME.R"}), + Hidden(StrOptions({"deprecated"})), + ], "sampling_strategy": [ Interval(numbers.Real, 0, 1, closed="right"), StrOptions({"auto", "majority", "not minority", "not majority", "all"}), @@ -186,7 +187,7 @@ def __init__( *, n_estimators=50, learning_rate=1.0, - algorithm="SAMME.R", + algorithm="deprecated", sampling_strategy="auto", replacement=False, random_state=None, @@ -194,9 +195,9 @@ def __init__( super().__init__( n_estimators=n_estimators, learning_rate=learning_rate, - algorithm=algorithm, random_state=random_state, ) + self.algorithm = algorithm self.estimator = estimator self.sampling_strategy = sampling_strategy self.replacement = replacement @@ -394,3 +395,19 @@ def _boost_discrete(self, iboost, X, y, sample_weight, random_state): sample_weight *= np.exp(estimator_weight * incorrect * (sample_weight > 0)) return sample_weight, estimator_weight, estimator_error + + # TODO(0.14): remove this method because algorithm is deprecated. + def _boost(self, iboost, X, y, sample_weight, random_state): + if self.algorithm != "deprecated": + warnings.warn( + ( + "`algorithm` parameter is deprecated in 0.12 and will be removed in" + " 0.14. In the future, the SAMME algorithm will always be used." + ), + FutureWarning, + ) + if self.algorithm == "SAMME.R": + return self._boost_real(iboost, X, y, sample_weight, random_state) + + else: # elif self.algorithm == "SAMME": + return self._boost_discrete(iboost, X, y, sample_weight, random_state) diff --git a/imblearn/ensemble/tests/test_bagging.py b/imblearn/ensemble/tests/test_bagging.py index 382597183..640007757 100644 --- a/imblearn/ensemble/tests/test_bagging.py +++ b/imblearn/ensemble/tests/test_bagging.py @@ -7,7 +7,6 @@ import numpy as np import pytest -import sklearn from sklearn.cluster import KMeans from sklearn.datasets import load_iris, make_classification, make_hastie_10_2 from sklearn.dummy import DummyClassifier @@ -22,7 +21,6 @@ assert_array_almost_equal, assert_array_equal, ) -from sklearn.utils.fixes import parse_version from imblearn import FunctionSampler from imblearn.datasets import make_imbalance @@ -31,7 +29,6 @@ from imblearn.pipeline import make_pipeline from imblearn.under_sampling import ClusterCentroids, RandomUnderSampler -sklearn_version = parse_version(sklearn.__version__) iris = load_iris() @@ -584,11 +581,3 @@ def roughly_balanced_bagging(X, y, replace=False): for estimator in rbb.estimators_: class_counts = estimator[-1].class_counts_ assert (class_counts[0] / class_counts[1]) > 0.78 - - -def test_balanced_bagging_classifier_n_features(): - """Check that we raise a FutureWarning when accessing `n_features_`.""" - X, y = load_iris(return_X_y=True) - estimator = BalancedBaggingClassifier().fit(X, y) - with pytest.warns(FutureWarning, match="`n_features_` was deprecated"): - estimator.n_features_ diff --git a/imblearn/ensemble/tests/test_easy_ensemble.py b/imblearn/ensemble/tests/test_easy_ensemble.py index 7dc04414a..b31bb6891 100644 --- a/imblearn/ensemble/tests/test_easy_ensemble.py +++ b/imblearn/ensemble/tests/test_easy_ensemble.py @@ -5,20 +5,17 @@ import numpy as np import pytest -import sklearn from sklearn.datasets import load_iris, make_hastie_10_2 -from sklearn.ensemble import AdaBoostClassifier +from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier from sklearn.feature_selection import SelectKBest from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.utils._testing import assert_allclose, assert_array_equal -from sklearn.utils.fixes import parse_version from imblearn.datasets import make_imbalance from imblearn.ensemble import EasyEnsembleClassifier from imblearn.pipeline import make_pipeline from imblearn.under_sampling import RandomUnderSampler -sklearn_version = parse_version(sklearn.__version__) iris = load_iris() # Generate a global dataset to use @@ -44,8 +41,8 @@ @pytest.mark.parametrize( "estimator", [ - AdaBoostClassifier(algorithm="SAMME", n_estimators=5), - AdaBoostClassifier(algorithm="SAMME", n_estimators=10), + GradientBoostingClassifier(n_estimators=5), + GradientBoostingClassifier(n_estimators=10), ], ) def test_easy_ensemble_classifier(n_estimators, estimator): @@ -92,10 +89,10 @@ def test_estimator(): assert isinstance(ensemble.estimator_.steps[-1][1], AdaBoostClassifier) ensemble = EasyEnsembleClassifier( - 2, AdaBoostClassifier(algorithm="SAMME"), n_jobs=-1, random_state=0 + 2, GradientBoostingClassifier(), n_jobs=-1, random_state=0 ).fit(X_train, y_train) - assert isinstance(ensemble.estimator_.steps[-1][1], AdaBoostClassifier) + assert isinstance(ensemble.estimator_.steps[-1][1], GradientBoostingClassifier) def test_bagging_with_pipeline(): @@ -107,9 +104,7 @@ def test_bagging_with_pipeline(): ) estimator = EasyEnsembleClassifier( n_estimators=2, - estimator=make_pipeline( - SelectKBest(k=1), AdaBoostClassifier(algorithm="SAMME") - ), + estimator=make_pipeline(SelectKBest(k=1), GradientBoostingClassifier()), ) estimator.fit(X, y).predict(X) @@ -201,7 +196,7 @@ def test_easy_ensemble_classifier_single_estimator(): clf1 = EasyEnsembleClassifier(n_estimators=1, random_state=0).fit(X_train, y_train) clf2 = make_pipeline( RandomUnderSampler(random_state=0), - AdaBoostClassifier(algorithm="SAMME", random_state=0), + GradientBoostingClassifier(random_state=0), ).fit(X_train, y_train) assert_array_equal(clf1.predict(X_test), clf2.predict(X_test)) @@ -220,16 +215,8 @@ def test_easy_ensemble_classifier_grid_search(): "estimator__n_estimators": [3, 4], } grid_search = GridSearchCV( - EasyEnsembleClassifier(estimator=AdaBoostClassifier(algorithm="SAMME")), + EasyEnsembleClassifier(estimator=GradientBoostingClassifier()), parameters, cv=5, ) grid_search.fit(X, y) - - -def test_easy_ensemble_classifier_n_features(): - """Check that we raise a FutureWarning when accessing `n_features_`.""" - X, y = load_iris(return_X_y=True) - estimator = EasyEnsembleClassifier().fit(X, y) - with pytest.warns(FutureWarning, match="`n_features_` was deprecated"): - estimator.n_features_ diff --git a/imblearn/ensemble/tests/test_forest.py b/imblearn/ensemble/tests/test_forest.py index 3719568e5..f9b059ef8 100644 --- a/imblearn/ensemble/tests/test_forest.py +++ b/imblearn/ensemble/tests/test_forest.py @@ -1,14 +1,12 @@ import numpy as np import pytest -import sklearn -from sklearn.datasets import load_iris, make_classification +from sklearn.datasets import make_classification from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.utils._testing import assert_allclose, assert_array_equal from sklearn.utils.fixes import parse_version from imblearn.ensemble import BalancedRandomForestClassifier - -sklearn_version = parse_version(sklearn.__version__) +from imblearn.utils._sklearn_compat import sklearn_version @pytest.fixture @@ -219,34 +217,6 @@ def test_balanced_random_forest_oob_binomial(ratio): assert np.abs(erf.oob_score_ - 0.5) < 0.1 -def test_balanced_bagging_classifier_n_features(): - """Check that we raise a FutureWarning when accessing `n_features_`.""" - X, y = load_iris(return_X_y=True) - estimator = BalancedRandomForestClassifier( - sampling_strategy="all", replacement=True, bootstrap=False - ).fit(X, y) - with pytest.warns(FutureWarning, match="`n_features_` was deprecated"): - estimator.n_features_ - - -# TODO: remove in 0.13 -def test_balanced_random_forest_change_behaviour(imbalanced_dataset): - """Check that we raise a change of behaviour for the parameters `sampling_strategy` - and `replacement`. - """ - estimator = BalancedRandomForestClassifier(sampling_strategy="all", bootstrap=False) - with pytest.warns(FutureWarning, match="The default of `replacement`"): - estimator.fit(*imbalanced_dataset) - estimator = BalancedRandomForestClassifier(replacement=True, bootstrap=False) - with pytest.warns(FutureWarning, match="The default of `sampling_strategy`"): - estimator.fit(*imbalanced_dataset) - estimator = BalancedRandomForestClassifier( - sampling_strategy="all", replacement=True - ) - with pytest.warns(FutureWarning, match="The default of `bootstrap`"): - estimator.fit(*imbalanced_dataset) - - @pytest.mark.skipif( parse_version(sklearn_version.base_version) < parse_version("1.4"), reason="scikit-learn should be >= 1.4", diff --git a/imblearn/ensemble/tests/test_weight_boosting.py b/imblearn/ensemble/tests/test_weight_boosting.py index ad3dbca04..7756154e3 100644 --- a/imblearn/ensemble/tests/test_weight_boosting.py +++ b/imblearn/ensemble/tests/test_weight_boosting.py @@ -1,15 +1,11 @@ import numpy as np import pytest -import sklearn from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.utils._testing import assert_array_equal -from sklearn.utils.fixes import parse_version from imblearn.ensemble import RUSBoostClassifier -sklearn_version = parse_version(sklearn.__version__) - @pytest.fixture def imbalanced_dataset(): @@ -27,9 +23,7 @@ def imbalanced_dataset(): ) -@pytest.mark.parametrize("algorithm", ["SAMME", "SAMME.R"]) -@pytest.mark.filterwarnings("ignore:The SAMME.R algorithm (the default) is") -def test_rusboost(imbalanced_dataset, algorithm): +def test_rusboost(imbalanced_dataset): X, y = imbalanced_dataset X_train, X_test, y_train, y_test = train_test_split( X, y, stratify=y, random_state=1 @@ -37,9 +31,7 @@ def test_rusboost(imbalanced_dataset, algorithm): classes = np.unique(y) n_estimators = 500 - rusboost = RUSBoostClassifier( - n_estimators=n_estimators, algorithm=algorithm, random_state=0 - ) + rusboost = RUSBoostClassifier(n_estimators=n_estimators, random_state=0) rusboost.fit(X_train, y_train) assert_array_equal(classes, rusboost.classes_) @@ -67,18 +59,16 @@ def test_rusboost(imbalanced_dataset, algorithm): assert rusboost.decision_function(X_test).shape[1] == len(classes) score = rusboost.score(X_test, y_test) - assert score > 0.6, f"Failed with algorithm {algorithm} and score {score}" + assert score > 0.6, f"Failed with score {score}" y_pred = rusboost.predict(X_test) assert y_pred.shape == y_test.shape -@pytest.mark.parametrize("algorithm", ["SAMME", "SAMME.R"]) -@pytest.mark.filterwarnings("ignore:The SAMME.R algorithm (the default) is") -def test_rusboost_sample_weight(imbalanced_dataset, algorithm): +def test_rusboost_sample_weight(imbalanced_dataset): X, y = imbalanced_dataset sample_weight = np.ones_like(y) - rusboost = RUSBoostClassifier(algorithm=algorithm, random_state=0) + rusboost = RUSBoostClassifier(random_state=0) # Predictions should be the same when sample_weight are all ones y_pred_sample_weight = rusboost.fit(X, y, sample_weight).predict(X) @@ -92,3 +82,13 @@ def test_rusboost_sample_weight(imbalanced_dataset, algorithm): with pytest.raises(AssertionError): assert_array_equal(y_pred_no_sample_weight, y_pred_sample_weight) + + +@pytest.mark.parametrize("algorithm", ["SAMME", "SAMME.R"]) +def test_rusboost_algorithm(imbalanced_dataset, algorithm): + X, y = imbalanced_dataset + + rusboost = RUSBoostClassifier(algorithm=algorithm) + warn_msg = "`algorithm` parameter is deprecated in 0.12 and will be removed" + with pytest.warns(FutureWarning, match=warn_msg): + rusboost.fit(X, y) diff --git a/imblearn/keras/_generator.py b/imblearn/keras/_generator.py index ce499355f..cf0c944dd 100644 --- a/imblearn/keras/_generator.py +++ b/imblearn/keras/_generator.py @@ -20,7 +20,7 @@ def import_from_keras(): if hasattr(keras.utils, "Sequence"): return (keras.utils.Sequence,), True else: - return (keras.utils.data_utils.Sequence,), True + return (keras.utils.PyDataset,), True except ImportError: return tuple(), False @@ -31,7 +31,7 @@ def import_from_tensforflow(): if hasattr(keras.utils, "Sequence"): return (keras.utils.Sequence,), True else: - return (keras.utils.data_utils.Sequence,), True + return (keras.utils.PyDataset,), True except ImportError: return tuple(), False diff --git a/imblearn/keras/tests/test_generator.py b/imblearn/keras/tests/test_generator.py index a073d846d..9b9239f57 100644 --- a/imblearn/keras/tests/test_generator.py +++ b/imblearn/keras/tests/test_generator.py @@ -10,17 +10,12 @@ from keras.models import Sequential # noqa: E402 from imblearn.datasets import make_imbalance # noqa: E402 -from imblearn.keras import ( - BalancedBatchGenerator, # noqa: E402 - balanced_batch_generator, # noqa: E402 +from imblearn.keras import ( # noqa: E402 + BalancedBatchGenerator, + balanced_batch_generator, ) from imblearn.over_sampling import RandomOverSampler # noqa: E402 -from imblearn.under_sampling import ( - ClusterCentroids, # noqa: E402 - NearMiss, # noqa: E402 -) - -3 +from imblearn.under_sampling import ClusterCentroids, NearMiss # noqa: E402 @pytest.fixture @@ -29,7 +24,8 @@ def data(): X, y = make_imbalance( iris.data, iris.target, sampling_strategy={0: 30, 1: 50, 2: 40} ) - y = LabelBinarizer().fit_transform(y) + X = X.astype(np.float32) + y = LabelBinarizer().fit_transform(y).astype(np.int32) return X, y @@ -108,7 +104,7 @@ def test_balanced_batch_generator_function_no_return_indices(data): (None, None), (RandomOverSampler(), None), (NearMiss(), None), - (None, np.random.uniform(size=120)), + (None, np.random.uniform(size=120).astype(np.float32)), ], ) def test_balanced_batch_generator_function(data, sampler, sample_weight): @@ -122,6 +118,7 @@ def test_balanced_batch_generator_function(data, sampler, sample_weight): batch_size=10, random_state=42, ) + print(next(training_generator)) model.fit( training_generator, steps_per_epoch=steps_per_epoch, diff --git a/imblearn/metrics/_classification.py b/imblearn/metrics/_classification.py index 489066d98..17797a9a7 100644 --- a/imblearn/metrics/_classification.py +++ b/imblearn/metrics/_classification.py @@ -24,10 +24,11 @@ from sklearn.metrics import mean_absolute_error, precision_recall_fscore_support from sklearn.metrics._classification import _check_targets, _prf_divide from sklearn.preprocessing import LabelEncoder +from sklearn.utils._param_validation import Interval, StrOptions from sklearn.utils.multiclass import unique_labels from sklearn.utils.validation import check_consistent_length, column_or_1d -from ..utils._param_validation import Interval, StrOptions, validate_params +from ..utils._sklearn_compat import validate_params @validate_params( @@ -799,9 +800,9 @@ def compute_score(*args, **kwargs): if prohibitied_y_pred.intersection(params_scoring_func): raise AttributeError( f"The function {scoring_func.__name__} has an unsupported" - f" attribute. Metric with`y_pred` are the" - f" only supported metrics is the only" - f" supported." + " attribute. Metric with`y_pred` are the" + " only supported metrics is the only" + " supported." ) args_scoring_func = signature_scoring_func.bind(*args, **kwargs) diff --git a/imblearn/metrics/pairwise.py b/imblearn/metrics/pairwise.py index 11f654f02..360ed812c 100644 --- a/imblearn/metrics/pairwise.py +++ b/imblearn/metrics/pairwise.py @@ -9,14 +9,14 @@ from scipy.spatial import distance_matrix from sklearn.base import BaseEstimator from sklearn.utils import check_consistent_length +from sklearn.utils._param_validation import StrOptions from sklearn.utils.multiclass import unique_labels from sklearn.utils.validation import check_is_fitted -from ..base import _ParamsValidationMixin -from ..utils._param_validation import StrOptions +from ..utils._sklearn_compat import _fit_context, check_array, validate_data -class ValueDifferenceMetric(_ParamsValidationMixin, BaseEstimator): +class ValueDifferenceMetric(BaseEstimator): r"""Class implementing the Value Difference Metric. This metric computes the distance between samples containing only @@ -118,6 +118,7 @@ class ValueDifferenceMetric(_ParamsValidationMixin, BaseEstimator): [0.04, 0. , 1.44], [1.96, 1.44, 0. ]]) """ + _parameter_constraints: dict = { "n_categories": [StrOptions({"auto"}), "array-like"], "k": [numbers.Integral], @@ -129,6 +130,7 @@ def __init__(self, *, n_categories="auto", k=1, r=2): self.k = k self.r = r + @_fit_context(prefer_skip_nested_validation=True) def fit(self, X, y): """Compute the necessary statistics from the training set. @@ -148,7 +150,8 @@ def fit(self, X, y): """ self._validate_params() check_consistent_length(X, y) - X, y = self._validate_data(X, y, reset=True, dtype=np.int32) + X, y = validate_data(self, X=X, y=y, reset=True, dtype=np.int32) + X = check_array(X, ensure_non_negative=True) if isinstance(self.n_categories, str) and self.n_categories == "auto": # categories are expected to be encoded from 0 to n_categories - 1 @@ -156,12 +159,12 @@ def fit(self, X, y): else: if len(self.n_categories) != self.n_features_in_: raise ValueError( - f"The length of n_categories is not consistent with the " + "The length of n_categories is not consistent with the " f"number of feature in X. Got {len(self.n_categories)} " f"elements in n_categories and {self.n_features_in_} in " - f"X." + "X." ) - self.n_categories_ = np.array(self.n_categories, copy=False) + self.n_categories_ = np.asarray(self.n_categories) classes = unique_labels(y) # list of length n_features of ndarray (n_categories, n_classes) @@ -207,11 +210,11 @@ def pairwise(self, X, Y=None): The VDM pairwise distance. """ check_is_fitted(self) - X = self._validate_data(X, reset=False, dtype=np.int32) + X = check_array(X, ensure_non_negative=True, dtype=np.int32) n_samples_X = X.shape[0] if Y is not None: - Y = self._validate_data(Y, reset=False, dtype=np.int32) + Y = check_array(Y, ensure_non_negative=True, dtype=np.int32) n_samples_Y = Y.shape[0] else: n_samples_Y = n_samples_X @@ -232,3 +235,8 @@ def _more_tags(self): return { "requires_positive_X": True, # X should be encoded with OrdinalEncoder } + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.positive_only = True + return tags diff --git a/imblearn/metrics/tests/test_classification.py b/imblearn/metrics/tests/test_classification.py index 8169cee81..4dbd18e06 100644 --- a/imblearn/metrics/tests/test_classification.py +++ b/imblearn/metrics/tests/test_classification.py @@ -23,7 +23,6 @@ from sklearn.utils._testing import ( assert_allclose, assert_array_equal, - assert_no_warnings, ) from sklearn.utils.validation import check_random_state @@ -105,10 +104,10 @@ def test_sensitivity_specificity_score_binary(): # binary class case the score is the value of the measure for the positive # class (e.g. label == 1). This is deprecated for average != 'binary'. for kwargs in ({}, {"average": "binary"}): - sen = assert_no_warnings(sensitivity_score, y_true, y_pred, **kwargs) + sen = sensitivity_score(y_true, y_pred, **kwargs) assert sen == pytest.approx(0.68, rel=R_TOL) - spe = assert_no_warnings(specificity_score, y_true, y_pred, **kwargs) + spe = specificity_score(y_true, y_pred, **kwargs) assert spe == pytest.approx(0.88, rel=R_TOL) @@ -455,7 +454,7 @@ def test_iba_error_y_score_prob_error(score_loss): y_true, y_pred, _ = make_prediction(binary=True) aps = make_index_balanced_accuracy(alpha=0.5, squared=True)(score_loss) - with pytest.raises(AttributeError): + with pytest.raises((AttributeError, TypeError)): aps(y_true, y_pred) diff --git a/imblearn/model_selection/__init__.py b/imblearn/model_selection/__init__.py new file mode 100644 index 000000000..aa47b21a3 --- /dev/null +++ b/imblearn/model_selection/__init__.py @@ -0,0 +1,8 @@ +""" +The :mod:`imblearn.model_selection` provides methods to split the dataset into +training and test sets. +""" + +from ._split import InstanceHardnessCV + +__all__ = ["InstanceHardnessCV"] diff --git a/imblearn/model_selection/_split.py b/imblearn/model_selection/_split.py new file mode 100644 index 000000000..fc28cbcb4 --- /dev/null +++ b/imblearn/model_selection/_split.py @@ -0,0 +1,122 @@ +import warnings + +import numpy as np +from sklearn.base import clone +from sklearn.model_selection import LeaveOneGroupOut, cross_val_predict +from sklearn.model_selection._split import BaseCrossValidator +from sklearn.utils.multiclass import type_of_target +from sklearn.utils.validation import _num_samples + + +class InstanceHardnessCV(BaseCrossValidator): + """Instance-hardness cross-validation splitter. + + Cross-validation splitter that distributes samples with large instance hardness + equally over the folds. The instance hardness is internally estimated by using + `estimator` and stratified cross-validation. + + Read more in the :ref:`User Guide `. + + Parameters + ---------- + estimator : estimator object + Classifier to be used to estimate instance hardness of the samples. + This classifier should implement `predict_proba`. + + n_splits : int, default=5 + Number of folds. Must be at least 2. + + pos_label : int, float, bool or str, default=None + The class considered the positive class when selecting the probability + representing the instance hardness. If None, the positive class is + automatically inferred by the estimator as `estimator.classes_[1]`. + + Examples + -------- + >>> from imblearn.model_selection import InstanceHardnessCV + >>> from sklearn.datasets import make_classification + >>> from sklearn.model_selection import cross_validate + >>> from sklearn.linear_model import LogisticRegression + >>> X, y = make_classification(weights=[0.9, 0.1], class_sep=2, + ... n_informative=3, n_redundant=1, flip_y=0.05, n_samples=1000, random_state=10) + >>> estimator = LogisticRegression() + >>> ih_cv = InstanceHardnessCV(estimator) + >>> cv_result = cross_validate(estimator, X, y, cv=ih_cv) + >>> print(f"Standard deviation of test_scores: {cv_result['test_score'].std():.3f}") + Standard deviation of test_scores: 0.00... + """ + + def __init__(self, estimator, *, n_splits=5, pos_label=None): + self.estimator = estimator + self.n_splits = n_splits + self.pos_label = pos_label + + def split(self, X, y, groups=None): + """Generate indices to split data into training and test set. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Training data, where `n_samples` is the number of samples + and `n_features` is the number of features. + + y : array-like of shape (n_samples,) + The target variable for supervised learning problems. + + groups : object + Always ignored, exists for compatibility. + + Yields + ------ + train : ndarray + The training set indices for that split. + + test : ndarray + The testing set indices for that split. + """ + if groups is not None: + warnings.warn( + f"The groups parameter is ignored by {self.__class__.__name__}", + UserWarning, + ) + + classes = np.unique(y) + y_type = type_of_target(y) + if y_type != "binary": + raise ValueError("InstanceHardnessCV only supports binary classification.") + if self.pos_label is None: + pos_label = 1 + else: + pos_label = np.flatnonzero(classes == self.pos_label)[0] + + y_proba = cross_val_predict( + clone(self.estimator), X, y, cv=self.n_splits, method="predict_proba" + ) + # sorting first on y and then by the instance hardness + sorted_indices = np.lexsort((y_proba[:, pos_label], y)) + groups = np.empty(_num_samples(X), dtype=int) + groups[sorted_indices] = np.arange(_num_samples(X)) % self.n_splits + cv = LeaveOneGroupOut() + for train_index, test_index in cv.split(X, y, groups): + yield train_index, test_index + + def get_n_splits(self, X=None, y=None, groups=None): + """Returns the number of splitting iterations in the cross-validator. + + Parameters + ---------- + X: object + Always ignored, exists for compatibility. + + y: object + Always ignored, exists for compatibility. + + groups: object + Always ignored, exists for compatibility. + + Returns + ------- + n_splits: int + Returns the number of splitting iterations in the cross-validator. + """ + return self.n_splits diff --git a/imblearn/model_selection/tests/__init__.py b/imblearn/model_selection/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/imblearn/model_selection/tests/test_split.py b/imblearn/model_selection/tests/test_split.py new file mode 100644 index 000000000..1b1d94e91 --- /dev/null +++ b/imblearn/model_selection/tests/test_split.py @@ -0,0 +1,99 @@ +import numpy as np +import pytest +from sklearn.datasets import make_classification +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import make_scorer, precision_score +from sklearn.model_selection import cross_validate +from sklearn.utils._testing import assert_allclose + +from imblearn.model_selection import InstanceHardnessCV + + +@pytest.fixture +def data(): + return make_classification( + weights=[0.5, 0.5], + class_sep=0.5, + n_informative=3, + n_redundant=1, + flip_y=0.05, + n_samples=50, + random_state=10, + ) + + +def test_groups_parameter_warning(data): + """Test that a warning is raised when groups parameter is provided.""" + X, y = data + ih_cv = InstanceHardnessCV(estimator=LogisticRegression(), n_splits=3) + + warning_msg = "The groups parameter is ignored by InstanceHardnessCV" + with pytest.warns(UserWarning, match=warning_msg): + list(ih_cv.split(X, y, groups=np.ones_like(y))) + + +def test_error_on_multiclass(): + """Test that an error is raised when the target is not binary.""" + X, y = make_classification(n_classes=3, n_clusters_per_class=1) + err_msg = "InstanceHardnessCV only supports binary classification." + with pytest.raises(ValueError, match=err_msg): + next(InstanceHardnessCV(estimator=LogisticRegression()).split(X, y)) + + +def test_default_params(data): + """Test that the default parameters are used.""" + X, y = data + ih_cv = InstanceHardnessCV(estimator=LogisticRegression(), n_splits=3) + cv_result = cross_validate( + LogisticRegression(), X, y, cv=ih_cv, scoring="precision" + ) + assert_allclose(cv_result["test_score"], [0.625, 0.6, 0.625], atol=1e-6, rtol=1e-6) + + +@pytest.mark.parametrize("dtype_target", [None, object]) +def test_target_string_labels(data, dtype_target): + """Test that the target can be a string array.""" + X, y = data + labels = np.array(["a", "b"], dtype=dtype_target) + y = labels[y] + ih_cv = InstanceHardnessCV(estimator=LogisticRegression(), n_splits=3) + cv_result = cross_validate( + LogisticRegression(), + X, + y, + cv=ih_cv, + scoring=make_scorer(precision_score, pos_label="b"), + ) + assert_allclose(cv_result["test_score"], [0.625, 0.6, 0.625], atol=1e-6, rtol=1e-6) + + +@pytest.mark.parametrize("dtype_target", [None, object]) +def test_target_string_pos_label(data, dtype_target): + """Test that the `pos_label` parameter can be used to select the positive class. + + Here, changing the `pos_label` will change the instance hardness and thus the + `cv_result`. + """ + X, y = data + labels = np.array(["a", "b"], dtype=dtype_target) + y = labels[y] + ih_cv = InstanceHardnessCV( + estimator=LogisticRegression(), pos_label="a", n_splits=3 + ) + cv_result = cross_validate( + LogisticRegression(), + X, + y, + cv=ih_cv, + scoring=make_scorer(precision_score, pos_label="a"), + ) + assert_allclose( + cv_result["test_score"], [0.666667, 0.666667, 0.4], atol=1e-6, rtol=1e-6 + ) + + +@pytest.mark.parametrize("n_splits", [2, 3, 4]) +def test_n_splits(n_splits): + """Test that the number of splits is correctly set.""" + ih_cv = InstanceHardnessCV(estimator=LogisticRegression(), n_splits=n_splits) + assert ih_cv.get_n_splits() == n_splits diff --git a/imblearn/over_sampling/_adasyn.py b/imblearn/over_sampling/_adasyn.py index 54e88b79f..a0a6d128a 100644 --- a/imblearn/over_sampling/_adasyn.py +++ b/imblearn/over_sampling/_adasyn.py @@ -5,21 +5,19 @@ # License: MIT import numbers -import warnings import numpy as np from scipy import sparse from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import HasMethods, Interval from ..utils import Substitution, check_neighbors_object -from ..utils._docstring import _n_jobs_docstring, _random_state_docstring -from ..utils._param_validation import HasMethods, Interval +from ..utils._docstring import _random_state_docstring from .base import BaseOverSampler @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class ADASYN(BaseOverSampler): @@ -50,14 +48,6 @@ class ADASYN(BaseOverSampler): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - Attributes ---------- sampling_strategy_ : dict @@ -128,7 +118,6 @@ class ADASYN(BaseOverSampler): Interval(numbers.Integral, 1, None, closed="left"), HasMethods(["kneighbors", "kneighbors_graph"]), ], - "n_jobs": [numbers.Integral, None], } def __init__( @@ -137,12 +126,10 @@ def __init__( sampling_strategy="auto", random_state=None, n_neighbors=5, - n_jobs=None, ): super().__init__(sampling_strategy=sampling_strategy) self.random_state = random_state self.n_neighbors = n_neighbors - self.n_jobs = n_jobs def _validate_estimator(self): """Create the necessary objects for ADASYN""" @@ -151,15 +138,6 @@ def _validate_estimator(self): ) def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - self._validate_estimator() random_state = check_random_state(self.random_state) @@ -231,3 +209,7 @@ def _more_tags(self): return { "X_types": ["2darray"], } + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + return tags diff --git a/imblearn/over_sampling/_random_over_sampler.py b/imblearn/over_sampling/_random_over_sampler.py index 63b5a66a7..6ac116305 100644 --- a/imblearn/over_sampling/_random_over_sampler.py +++ b/imblearn/over_sampling/_random_over_sampler.py @@ -10,11 +10,12 @@ import numpy as np from scipy import sparse from sklearn.utils import _safe_indexing, check_array, check_random_state +from sklearn.utils._param_validation import Interval from sklearn.utils.sparsefuncs import mean_variance_axis from ..utils import Substitution, check_target_type from ..utils._docstring import _random_state_docstring -from ..utils._param_validation import Interval +from ..utils._sklearn_compat import validate_data from ..utils._validation import _check_X from .base import BaseOverSampler @@ -156,8 +157,7 @@ def __init__( def _check_X_y(self, X, y): y, binarize_y = check_target_type(y, indicate_one_vs_all=True) X = _check_X(X) - self._check_n_features(X, reset=True) - self._check_feature_names(X, reset=True) + validate_data(self, X=X, y=y, reset=True, skip_check_array=True) return X, y, binarize_y def _fit_resample(self, X, y): @@ -176,15 +176,15 @@ def _fit_resample(self, X, y): ) if missing_shrinkage_keys: raise ValueError( - f"`shrinkage` should contain a shrinkage factor for " - f"each class that will be resampled. The missing " + "`shrinkage` should contain a shrinkage factor for " + "each class that will be resampled. The missing " f"classes are: {repr(missing_shrinkage_keys)}" ) for klass, shrink_factor in self.shrinkage_.items(): if shrink_factor < 0: raise ValueError( - f"The shrinkage factor needs to be >= 0. " + "The shrinkage factor needs to be >= 0. " f"Got {shrink_factor} for class {klass}." ) @@ -258,3 +258,10 @@ def _more_tags(self): "check_complex_data": "Robust to this type of data.", }, } + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.allow_nan = True + tags.input_tags.string = True + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/over_sampling/_smote/base.py b/imblearn/over_sampling/_smote/base.py index 8ef902920..c008a95e6 100644 --- a/imblearn/over_sampling/_smote/base.py +++ b/imblearn/over_sampling/_smote/base.py @@ -11,8 +11,8 @@ import warnings import numpy as np -import sklearn from scipy import sparse +from scipy.stats import mode from sklearn.base import clone from sklearn.exceptions import DataConversionWarning from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder @@ -21,7 +21,7 @@ check_array, check_random_state, ) -from sklearn.utils.fixes import parse_version +from sklearn.utils._param_validation import HasMethods, Interval, StrOptions from sklearn.utils.sparsefuncs_fast import ( csr_mean_variance_axis0, ) @@ -29,18 +29,11 @@ from ...metrics.pairwise import ValueDifferenceMetric from ...utils import Substitution, check_neighbors_object, check_target_type -from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods, Interval, StrOptions +from ...utils._docstring import _random_state_docstring +from ...utils._sklearn_compat import _get_column_indices, _is_pandas_df, validate_data from ...utils._validation import _check_X -from ...utils.fixes import _is_pandas_df, _mode from ..base import BaseOverSampler -sklearn_version = parse_version(sklearn.__version__).base_version -if parse_version(sklearn_version) < parse_version("1.5"): - from sklearn.utils import _get_column_indices -else: - from sklearn.utils._indexing import _get_column_indices - class BaseSMOTE(BaseOverSampler): """Base class for the different SMOTE algorithms.""" @@ -51,7 +44,6 @@ class BaseSMOTE(BaseOverSampler): Interval(numbers.Integral, 1, None, closed="left"), HasMethods(["kneighbors", "kneighbors_graph"]), ], - "n_jobs": [numbers.Integral, None], } def __init__( @@ -59,12 +51,10 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, ): super().__init__(sampling_strategy=sampling_strategy) self.random_state = random_state self.k_neighbors = k_neighbors - self.n_jobs = n_jobs def _validate_estimator(self): """Check the NN estimators shared across the different SMOTE @@ -245,7 +235,6 @@ def _in_danger_noise(self, nn_estimator, samples, target_class, y, kind="danger" @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class SMOTE(BaseSMOTE): @@ -275,14 +264,6 @@ class SMOTE(BaseSMOTE): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - Attributes ---------- sampling_strategy_ : dict @@ -355,25 +336,14 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, ): super().__init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - self._validate_estimator() X_resampled = [X.copy()] @@ -404,7 +374,6 @@ def _fit_resample(self, X, y): @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class SMOTENC(SMOTE): @@ -456,14 +425,6 @@ class SMOTENC(SMOTE): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - Attributes ---------- sampling_strategy_ : dict @@ -474,13 +435,6 @@ class SMOTENC(SMOTE): nn_k_ : estimator object Validated k-nearest neighbours created from the `k_neighbors` parameter. - ohe_ : :class:`~sklearn.preprocessing.OneHotEncoder` - The one-hot encoder used to encode the categorical features. - - .. deprecated:: 0.11 - `ohe_` is deprecated in 0.11 and will be removed in 0.13. Use - `categorical_encoder_` instead. - categorical_encoder_ : estimator The encoder used to encode the categorical features. @@ -582,13 +536,11 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, ): super().__init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) self.categorical_features = categorical_features self.categorical_encoder = categorical_encoder @@ -599,8 +551,7 @@ def _check_X_y(self, X, y): """ y, binarize_y = check_target_type(y, indicate_one_vs_all=True) X = _check_X(X) - self._check_n_features(X, reset=True) - self._check_feature_names(X, reset=True) + validate_data(self, X=X, y=y, reset=True, skip_check_array=True) return X, y, binarize_y def _validate_column_types(self, X): @@ -640,15 +591,6 @@ def _validate_estimator(self): ) def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - self.n_features_ = _num_features(X) self._validate_column_types(X) self._validate_estimator() @@ -779,9 +721,9 @@ def _generate_samples(self, X, nn_data, nn_num, rows, cols, steps, y_type, y=Non # In the case that the median std was equal to zeros, we have to # create non-null entry based on the encoded of OHE if math.isclose(self.median_std_[y_type], 0): - nn_data[ - :, self.continuous_features_.size : - ] = self._X_categorical_minority_encoded + nn_data[:, self.continuous_features_.size :] = ( + self._X_categorical_minority_encoded + ) all_neighbors = nn_data[nn_num[rows]] @@ -805,20 +747,18 @@ def _generate_samples(self, X, nn_data, nn_num, rows, cols, steps, y_type, y=Non return X_new - @property - def ohe_(self): - """One-hot encoder used to encode the categorical features.""" - warnings.warn( - "'ohe_' attribute has been deprecated in 0.11 and will be removed " - "in 0.13. Use 'categorical_encoder_' instead.", - FutureWarning, - ) - return self.categorical_encoder_ + def _more_tags(self): + return {"X_types": ["2darray", "dataframe", "string"]} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.sparse = False + tags.input_tags.string = True + return tags @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class SMOTEN(SMOTE): @@ -854,14 +794,6 @@ class SMOTEN(SMOTE): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - Attributes ---------- categorical_encoder_ : estimator @@ -944,22 +876,21 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, ): super().__init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) self.categorical_encoder = categorical_encoder def _check_X_y(self, X, y): """Check should accept strings and not sparse matrices.""" y, binarize_y = check_target_type(y, indicate_one_vs_all=True) - X, y = self._validate_data( - X, - y, + X, y = validate_data( + self, + X=X, + y=y, reset=True, dtype=None, accept_sparse=["csr", "csc"], @@ -981,27 +912,21 @@ def _make_samples(self, X_class, klass, y_dtype, nn_indices, n_samples): # where for each feature individually, each category generated is the # most common category X_new = np.squeeze( - _mode(X_class[nn_indices[samples_indices]], axis=1).mode, axis=1 + mode(X_class[nn_indices[samples_indices]], axis=1, keepdims=True).mode, + axis=1, ) y_new = np.full(n_samples, fill_value=klass, dtype=y_dtype) return X_new, y_new def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - if sparse.issparse(X): X_sparse_format = X.format X = X.toarray() warnings.warn( - "Passing a sparse matrix to SMOTEN is not really efficient since it is" - " converted to a dense array internally.", + ( + "Passing a sparse matrix to SMOTEN is not really efficient since it" + " is converted to a dense array internally." + ), DataConversionWarning, ) else: @@ -1053,3 +978,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"X_types": ["2darray", "dataframe", "string"]} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.string = True + return tags diff --git a/imblearn/over_sampling/_smote/cluster.py b/imblearn/over_sampling/_smote/cluster.py index 2852cfd13..59a28c635 100644 --- a/imblearn/over_sampling/_smote/cluster.py +++ b/imblearn/over_sampling/_smote/cluster.py @@ -14,10 +14,10 @@ from sklearn.cluster import MiniBatchKMeans from sklearn.metrics import pairwise_distances from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import HasMethods, Interval, StrOptions from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods, Interval, StrOptions from ..base import BaseOverSampler from .base import BaseSMOTE @@ -126,7 +126,7 @@ class KMeansSMOTE(BaseSMOTE): >>> from imblearn.over_sampling import KMeansSMOTE >>> from sklearn.datasets import make_blobs >>> blobs = [100, 800, 100] - >>> X, y = make_blobs(blobs, centers=[(-10, 0), (0,0), (10, 0)]) + >>> X, y = make_blobs(blobs, centers=[(-10, 0), (0,0), (10, 0)], random_state=0) >>> # Add a single 0 sample in the middle blob >>> X = np.concatenate([X, [[0, 0]]]) >>> y = np.append(y, 0) @@ -155,6 +155,7 @@ class KMeansSMOTE(BaseSMOTE): ], "cluster_balance_threshold": [StrOptions({"auto"}), numbers.Real], "density_exponent": [StrOptions({"auto"}), numbers.Real], + "n_jobs": [numbers.Integral, None], } def __init__( @@ -172,11 +173,11 @@ def __init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) self.kmeans_estimator = kmeans_estimator self.cluster_balance_threshold = cluster_balance_threshold self.density_exponent = density_exponent + self.n_jobs = n_jobs def _validate_estimator(self): super()._validate_estimator() @@ -267,10 +268,10 @@ def _fit_resample(self, X, y): if not valid_clusters: raise RuntimeError( - f"No clusters found with sufficient samples of " + "No clusters found with sufficient samples of " f"class {class_sample}. Try lowering the " - f"cluster_balance_threshold or increasing the number of " - f"clusters." + "cluster_balance_threshold or increasing the number of " + "clusters." ) for valid_cluster_idx, valid_cluster in enumerate(valid_clusters): diff --git a/imblearn/over_sampling/_smote/filter.py b/imblearn/over_sampling/_smote/filter.py index 2916b68ad..126ba533e 100644 --- a/imblearn/over_sampling/_smote/filter.py +++ b/imblearn/over_sampling/_smote/filter.py @@ -7,24 +7,22 @@ # License: MIT import numbers -import warnings import numpy as np from scipy import sparse from sklearn.base import clone from sklearn.svm import SVC from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import HasMethods, Interval, StrOptions from ...utils import Substitution, check_neighbors_object -from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods, Interval, StrOptions +from ...utils._docstring import _random_state_docstring from ..base import BaseOverSampler from .base import BaseSMOTE @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class BorderlineSMOTE(BaseSMOTE): @@ -57,14 +55,6 @@ class BorderlineSMOTE(BaseSMOTE): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - m_neighbors : int or object, default=10 The nearest neighbors used to determine if a minority sample is in "danger". You can pass: @@ -172,7 +162,6 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, m_neighbors=10, kind="borderline-1", ): @@ -180,7 +169,6 @@ def __init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) self.m_neighbors = m_neighbors self.kind = kind @@ -192,15 +180,6 @@ def _validate_estimator(self): ) def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - self._validate_estimator() X_resampled = X.copy() @@ -251,7 +230,6 @@ def _fit_resample(self, X, y): @Substitution( sampling_strategy=BaseOverSampler._sampling_strategy_docstring, - n_jobs=_n_jobs_docstring, random_state=_random_state_docstring, ) class SVMSMOTE(BaseSMOTE): @@ -283,14 +261,6 @@ class SVMSMOTE(BaseSMOTE): :class:`~sklearn.neighbors.NearestNeighbors` but could be extended to any compatible class. - {n_jobs} - - .. deprecated:: 0.10 - `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. - It was previously used to set `n_jobs` of nearest neighbors - algorithm. From now on, you can pass an estimator where `n_jobs` is - already set instead. - m_neighbors : int or object, default=10 The nearest neighbors used to determine if a minority sample is in "danger". You can pass: @@ -405,7 +375,6 @@ def __init__( sampling_strategy="auto", random_state=None, k_neighbors=5, - n_jobs=None, m_neighbors=10, svm_estimator=None, out_step=0.5, @@ -414,7 +383,6 @@ def __init__( sampling_strategy=sampling_strategy, random_state=random_state, k_neighbors=k_neighbors, - n_jobs=n_jobs, ) self.m_neighbors = m_neighbors self.svm_estimator = svm_estimator @@ -432,15 +400,6 @@ def _validate_estimator(self): self.svm_estimator_ = clone(self.svm_estimator) def _fit_resample(self, X, y): - # FIXME: to be removed in 0.12 - if self.n_jobs is not None: - warnings.warn( - "The parameter `n_jobs` has been deprecated in 0.10 and will be " - "removed in 0.12. You can pass an nearest neighbors estimator where " - "`n_jobs` is already set instead.", - FutureWarning, - ) - self._validate_estimator() random_state = check_random_state(self.random_state) X_resampled = X.copy() diff --git a/imblearn/over_sampling/_smote/tests/test_smote_nc.py b/imblearn/over_sampling/_smote/tests/test_smote_nc.py index 1314ea98b..2259acd3c 100644 --- a/imblearn/over_sampling/_smote/tests/test_smote_nc.py +++ b/imblearn/over_sampling/_smote/tests/test_smote_nc.py @@ -8,20 +8,12 @@ import numpy as np import pytest -import sklearn from scipy import sparse from sklearn.datasets import make_classification from sklearn.preprocessing import OneHotEncoder from sklearn.utils._testing import assert_allclose, assert_array_equal -from sklearn.utils.fixes import parse_version from imblearn.over_sampling import SMOTENC -from imblearn.utils.estimator_checks import ( - _set_checking_parameters, - check_param_validation, -) - -sklearn_version = parse_version(sklearn.__version__) def data_heterogneous_ordered(): @@ -272,43 +264,17 @@ def test_smote_nc_with_null_median_std(): def test_smotenc_categorical_encoder(): """Check that we can pass our own categorical encoder.""" - # TODO: only use `sparse_output` when sklearn >= 1.2 - param = "sparse" if sklearn_version < parse_version("1.2") else "sparse_output" - X, y, categorical_features = data_heterogneous_unordered() smote = SMOTENC(categorical_features=categorical_features, random_state=0) smote.fit_resample(X, y) - assert getattr(smote.categorical_encoder_, param) is True + assert getattr(smote.categorical_encoder_, "sparse_output") is True - encoder = OneHotEncoder() - encoder.set_params(**{param: False}) + encoder = OneHotEncoder(sparse_output=False) smote.set_params(categorical_encoder=encoder).fit_resample(X, y) assert smote.categorical_encoder is encoder assert smote.categorical_encoder_ is not encoder - assert getattr(smote.categorical_encoder_, param) is False - - -# TODO(0.13): remove this test -def test_smotenc_deprecation_ohe_(): - """Check that we raise a deprecation warning when using `ohe_`.""" - X, y, categorical_features = data_heterogneous_unordered() - smote = SMOTENC(categorical_features=categorical_features, random_state=0) - smote.fit_resample(X, y) - - with pytest.warns(FutureWarning, match="'ohe_' attribute has been deprecated"): - smote.ohe_ - - -def test_smotenc_param_validation(): - """Check that we validate the parameters correctly since this estimator requires - a specific parameter. - """ - categorical_features = [0] - smote = SMOTENC(categorical_features=categorical_features, random_state=0) - name = smote.__class__.__name__ - _set_checking_parameters(smote) - check_param_validation(name, smote) + assert getattr(smote.categorical_encoder_, "sparse_output") is False def test_smotenc_bool_categorical(): diff --git a/imblearn/over_sampling/base.py b/imblearn/over_sampling/base.py index fbd982bf2..95deeb48e 100644 --- a/imblearn/over_sampling/base.py +++ b/imblearn/over_sampling/base.py @@ -8,8 +8,9 @@ import numbers from collections.abc import Mapping +from sklearn.utils._param_validation import Interval, StrOptions + from ..base import BaseSampler -from ..utils._param_validation import Interval, StrOptions class BaseOverSampler(BaseSampler): @@ -21,7 +22,8 @@ class BaseOverSampler(BaseSampler): _sampling_type = "over-sampling" - _sampling_strategy_docstring = """sampling_strategy : float, str, dict or callable, default='auto' + _sampling_strategy_docstring = ( + """sampling_strategy : float, str, dict or callable, default='auto' Sampling information to resample the data set. - When ``float``, it corresponds to the desired ratio of the number of @@ -56,7 +58,8 @@ class BaseOverSampler(BaseSampler): - When callable, function taking ``y`` and returns a ``dict``. The keys correspond to the targeted classes. The values correspond to the desired number of samples for each class. - """.strip() # noqa: E501 + """.strip() + ) # noqa: E501 _parameter_constraints: dict = { "sampling_strategy": [ diff --git a/imblearn/over_sampling/tests/test_common.py b/imblearn/over_sampling/tests/test_common.py index cdd85c151..3e82dbb3c 100644 --- a/imblearn/over_sampling/tests/test_common.py +++ b/imblearn/over_sampling/tests/test_common.py @@ -123,23 +123,3 @@ def test_numerical_smote_extra_custom_nn(numerical_data, smote): assert X_res.shape == (120, 2) assert Counter(y_res) == {0: 60, 1: 60} - - -# FIXME: to be removed in 0.12 -@pytest.mark.parametrize( - "sampler", - [ - ADASYN(random_state=0), - BorderlineSMOTE(random_state=0), - SMOTE(random_state=0), - SMOTEN(random_state=0), - SMOTENC([0], random_state=0), - SVMSMOTE(random_state=0), - ], -) -def test_n_jobs_deprecation_warning(numerical_data, sampler): - X, y = numerical_data - sampler.set_params(n_jobs=2) - warning_msg = "The parameter `n_jobs` has been deprecated" - with pytest.warns(FutureWarning, match=warning_msg): - sampler.fit_resample(X, y) diff --git a/imblearn/over_sampling/tests/test_random_over_sampler.py b/imblearn/over_sampling/tests/test_random_over_sampler.py index efa40c855..e3a6c87d7 100644 --- a/imblearn/over_sampling/tests/test_random_over_sampler.py +++ b/imblearn/over_sampling/tests/test_random_over_sampler.py @@ -77,8 +77,7 @@ def test_ros_fit_resample(X_type, data, params): if X_type == "dataframe": assert hasattr(X_resampled, "loc") - # FIXME: we should use to_numpy with pandas >= 0.25 - X_resampled = X_resampled.values + X_resampled = X_resampled.to_numpy() assert_allclose(X_resampled, X_gt) assert_array_equal(y_resampled, y_gt) diff --git a/imblearn/pipeline.py b/imblearn/pipeline.py index 7453446ad..0449fd3f5 100644 --- a/imblearn/pipeline.py +++ b/imblearn/pipeline.py @@ -2,6 +2,7 @@ The :mod:`imblearn.pipeline` module implements utilities to build a composite estimator, as a chain of transforms, samples and estimators. """ + # Adapted from scikit-learn # Author: Edouard Duchesnay @@ -12,38 +13,105 @@ # Christos Aridas # Guillaume Lemaitre # License: BSD -import sklearn +import warnings +from contextlib import contextmanager +from copy import deepcopy + from sklearn import pipeline from sklearn.base import clone +from sklearn.exceptions import NotFittedError from sklearn.utils import Bunch +from sklearn.utils._param_validation import HasMethods from sklearn.utils.fixes import parse_version -from sklearn.utils.metaestimators import available_if -from sklearn.utils.validation import check_memory - -from .base import _ParamsValidationMixin -from .utils._metadata_requests import ( - METHODS, +from sklearn.utils.metadata_routing import ( MetadataRouter, MethodMapping, - _raise_for_params, _routing_enabled, - process_routing, + get_routing_for_object, ) -from .utils._param_validation import HasMethods, validate_params -from .utils.fixes import _fit_context +from sklearn.utils.metaestimators import available_if +from sklearn.utils.validation import check_is_fitted, check_memory -METHODS.append("fit_resample") +from .base import METHODS +from .utils._sklearn_compat import ( + _fit_context, + _print_elapsed_time, + _raise_for_params, + get_tags, + process_routing, + sklearn_version, + validate_params, +) __all__ = ["Pipeline", "make_pipeline"] -sklearn_version = parse_version(sklearn.__version__).base_version -if parse_version(sklearn_version) < parse_version("1.5"): - from sklearn.utils import _print_elapsed_time -else: - from sklearn.utils._user_interface import _print_elapsed_time + +@contextmanager +def _raise_or_warn_if_not_fitted(estimator): + """A context manager to make sure a NotFittedError is raised, if a sub-estimator + raises the error. + Otherwise, we raise a warning if the pipeline is not fitted, with the deprecation. + TODO(0.15): remove this context manager and replace with check_is_fitted. + """ + try: + yield + except NotFittedError as exc: + raise NotFittedError("Pipeline is not fitted yet.") from exc + + # we only get here if the above didn't raise + try: + check_is_fitted(estimator) + except NotFittedError: + warnings.warn( + ( + "This Pipeline instance is not fitted yet. Call 'fit' with " + "appropriate arguments before using other methods such as transform, " + "predict, etc. This will raise an error in 0.15 instead of the current " + "warning." + ), + FutureWarning, + ) + + +def _cached_transform( + sub_pipeline, *, cache, param_name, param_value, transform_params +): + """Transform a parameter value using a sub-pipeline and cache the result. + Parameters + ---------- + sub_pipeline : Pipeline + The sub-pipeline to be used for transformation. + cache : dict + The cache dictionary to store the transformed values. + param_name : str + The name of the parameter to be transformed. + param_value : object + The value of the parameter to be transformed. + transform_params : dict + The metadata to be used for transformation. This passed to the + `transform` method of the sub-pipeline. + Returns + ------- + transformed_value : object + The transformed value of the parameter. + """ + if param_name not in cache: + # If the parameter is a tuple, transform each element of the + # tuple. This is needed to support the pattern present in + # `lightgbm` and `xgboost` where users can pass multiple + # validation sets. + if isinstance(param_value, tuple): + cache[param_name] = tuple( + sub_pipeline.transform(element, **transform_params) + for element in param_value + ) + else: + cache[param_name] = sub_pipeline.transform(param_value, **transform_params) + + return cache[param_name] -class Pipeline(_ParamsValidationMixin, pipeline.Pipeline): +class Pipeline(pipeline.Pipeline): """Pipeline of transforms and resamples with a final estimator. Sequentially apply a list of transforms, sampling, and a final estimator. @@ -69,6 +137,20 @@ class Pipeline(_ParamsValidationMixin, pipeline.Pipeline): fit/transform/fit_resample) that are chained, in the order in which they are chained, with the last object an estimator. + transform_input : list of str, default=None + The names of the :term:`metadata` parameters that should be transformed by the + pipeline before passing it to the step consuming it. + + This enables transforming some input arguments to ``fit`` (other than ``X``) + to be transformed by the steps of the pipeline up to the step which requires + them. Requirement is defined via :ref:`metadata routing `. + For instance, this can be used to pass a validation set through the pipeline. + + You can only set this if metadata routing is enabled, which you + can enable using ``sklearn.set_config(enable_metadata_routing=True)``. + + .. versionadded:: 1.6 + memory : Instance of joblib.Memory or str, default=None Used to cache the fitted transformers of the pipeline. By default, no caching is performed. If a string is given, it is the path to @@ -95,6 +177,10 @@ class Pipeline(_ParamsValidationMixin, pipeline.Pipeline): n_features_in_ : int Number of features seen during first step `fit` method. + feature_names_in_ : ndarray of shape (`n_features_in_`,) + Names of features seen during :term:`fit`. Only defined if the + underlying estimator exposes such an attribute when fit. + See Also -------- make_pipeline : Helper function to make pipeline. @@ -152,10 +238,17 @@ class Pipeline(_ParamsValidationMixin, pipeline.Pipeline): _parameter_constraints: dict = { "steps": "no_validation", # validated in `_validate_steps` + "transform_input": [list, None], "memory": [None, str, HasMethods(["cache"])], "verbose": ["boolean"], } + def __init__(self, steps, *, transform_input=None, memory=None, verbose=False): + self.steps = steps + self.transform_input = transform_input + self.memory = memory + self.verbose = verbose + # BaseEstimator interface def _validate_steps(self): @@ -222,10 +315,87 @@ def _iter(self, with_final=True, filter_passthrough=True, filter_resample=True): else: return it + def _get_metadata_for_step(self, *, step_idx, step_params, all_params): + """Get params (metadata) for step `name`. + + This transforms the metadata up to this step if required, which is + indicated by the `transform_input` parameter. + + If a param in `step_params` is included in the `transform_input` list, + it will be transformed. + + Parameters + ---------- + step_idx : int + Index of the step in the pipeline. + + step_params : dict + Parameters specific to the step. These are routed parameters, e.g. + `routed_params[name]`. If a parameter name here is included in the + `pipeline.transform_input`, then it will be transformed. Note that + these parameters are *after* routing, so the aliases are already + resolved. + + all_params : dict + All parameters passed by the user. Here this is used to call + `transform` on the slice of the pipeline itself. + + Returns + ------- + dict + Parameters to be passed to the step. The ones which should be + transformed are transformed. + """ + if ( + self.transform_input is None + or not all_params + or not step_params + or step_idx == 0 + ): + # we only need to process step_params if transform_input is set + # and metadata is given by the user. + return step_params + + sub_pipeline = self[:step_idx] + sub_metadata_routing = get_routing_for_object(sub_pipeline) + # here we get the metadata required by sub_pipeline.transform + transform_params = { + key: value + for key, value in all_params.items() + if key + in sub_metadata_routing.consumes( + method="transform", params=all_params.keys() + ) + } + transformed_params = dict() # this is to be returned + transformed_cache = dict() # used to transform each param once + # `step_params` is the output of `process_routing`, so it has a dict for each + # method (e.g. fit, transform, predict), which are the args to be passed to + # those methods. We need to transform the parameters which are in the + # `transform_input`, before returning these dicts. + for method, method_params in step_params.items(): + transformed_params[method] = Bunch() + for param_name, param_value in method_params.items(): + # An example of `(param_name, param_value)` is + # `('sample_weight', array([0.5, 0.5, ...]))` + if param_name in self.transform_input: + # This parameter now needs to be transformed by the sub_pipeline, to + # this step. We cache these computations to avoid repeating them. + transformed_params[method][param_name] = _cached_transform( + sub_pipeline, + cache=transformed_cache, + param_name=param_name, + param_value=param_value, + transform_params=transform_params, + ) + else: + transformed_params[method][param_name] = param_value + return transformed_params + # Estimator interface # def _fit(self, X, y=None, **fit_params_steps): - def _fit(self, X, y=None, routed_params=None): + def _fit(self, X, y=None, routed_params=None, raw_params=None): self.steps = list(self.steps) self._validate_steps() # Setup the memory @@ -249,6 +419,11 @@ def _fit(self, X, y=None, routed_params=None): cloned_transformer = clone(transformer) # Fit or load from cache the current transformer + step_params = self._get_metadata_for_step( + step_idx=step_idx, + step_params=routed_params[name], + all_params=raw_params, + ) if hasattr(cloned_transformer, "transform") or hasattr( cloned_transformer, "fit_transform" ): @@ -256,10 +431,10 @@ def _fit(self, X, y=None, routed_params=None): cloned_transformer, X, y, - None, + weight=None, message_clsname="Pipeline", message=self._log_message(step_idx), - params=routed_params[name], + params=step_params, ) elif hasattr(cloned_transformer, "fit_resample"): X, y, fitted_transformer = fit_resample_one_cached( @@ -325,11 +500,29 @@ def fit(self, X, y=None, **params): self : Pipeline This estimator. """ + if not _routing_enabled() and self.transform_input is not None: + raise ValueError( + "The `transform_input` parameter can only be set if metadata " + "routing is enabled. You can enable metadata routing using " + "`sklearn.set_config(enable_metadata_routing=True)`." + ) + + if sklearn_version < parse_version("1.4") and self.transform_input is not None: + raise ValueError( + "The `transform_input` parameter is not supported in scikit-learn " + "versions prior to 1.4. Please upgrade to scikit-learn 1.4 or " + "later." + ) + routed_params = self._check_method_params(method="fit", props=params) - Xt, yt = self._fit(X, y, routed_params) + Xt, yt = self._fit(X, y, routed_params, raw_params=params) with _print_elapsed_time("Pipeline", self._log_message(len(self.steps) - 1)): if self._final_estimator != "passthrough": - last_step_params = routed_params[self.steps[-1][0]] + last_step_params = self._get_metadata_for_step( + step_idx=len(self) - 1, + step_params=routed_params[self.steps[-1][0]], + all_params=params, + ) self._final_estimator.fit(Xt, yt, **last_step_params["fit"]) return self @@ -395,7 +588,11 @@ def fit_transform(self, X, y=None, **params): with _print_elapsed_time("Pipeline", self._log_message(len(self.steps) - 1)): if last_step == "passthrough": return Xt - last_step_params = routed_params[self.steps[-1][0]] + last_step_params = self._get_metadata_for_step( + step_idx=len(self) - 1, + step_params=routed_params[self.steps[-1][0]], + all_params=params, + ) if hasattr(last_step, "fit_transform"): return last_step.fit_transform( Xt, yt, **last_step_params["fit_transform"] @@ -452,18 +649,22 @@ def predict(self, X, **params): y_pred : ndarray Result of calling `predict` on the final estimator. """ - Xt = X + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + Xt = X - if not _routing_enabled(): - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt) - return self.steps[-1][1].predict(Xt, **params) + if not _routing_enabled(): + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt) + return self.steps[-1][1].predict(Xt, **params) - # metadata routing enabled - routed_params = process_routing(self, "predict", **params) - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt, **routed_params[name].transform) - return self.steps[-1][1].predict(Xt, **routed_params[self.steps[-1][0]].predict) + # metadata routing enabled + routed_params = process_routing(self, "predict", **params) + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt, **routed_params[name].transform) + return self.steps[-1][1].predict( + Xt, **routed_params[self.steps[-1][0]].predict + ) def _can_fit_resample(self): return self._final_estimator == "passthrough" or hasattr( @@ -642,20 +843,22 @@ def predict_proba(self, X, **params): y_proba : ndarray of shape (n_samples, n_classes) Result of calling `predict_proba` on the final estimator. """ - Xt = X + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + Xt = X - if not _routing_enabled(): + if not _routing_enabled(): + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt) + return self.steps[-1][1].predict_proba(Xt, **params) + + # metadata routing enabled + routed_params = process_routing(self, "predict_proba", **params) for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt) - return self.steps[-1][1].predict_proba(Xt, **params) - - # metadata routing enabled - routed_params = process_routing(self, "predict_proba", **params) - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt, **routed_params[name].transform) - return self.steps[-1][1].predict_proba( - Xt, **routed_params[self.steps[-1][0]].predict_proba - ) + Xt = transform.transform(Xt, **routed_params[name].transform) + return self.steps[-1][1].predict_proba( + Xt, **routed_params[self.steps[-1][0]].predict_proba + ) @available_if(pipeline._final_estimator_has("decision_function")) def decision_function(self, X, **params): @@ -687,20 +890,23 @@ def decision_function(self, X, **params): y_score : ndarray of shape (n_samples, n_classes) Result of calling `decision_function` on the final estimator. """ - _raise_for_params(params, self, "decision_function") + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + _raise_for_params(params, self, "decision_function") - # not branching here since params is only available if - # enable_metadata_routing=True - routed_params = process_routing(self, "decision_function", **params) + # not branching here since params is only available if + # enable_metadata_routing=True + routed_params = process_routing(self, "decision_function", **params) - Xt = X - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform( - Xt, **routed_params.get(name, {}).get("transform", {}) + Xt = X + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform( + Xt, **routed_params.get(name, {}).get("transform", {}) + ) + return self.steps[-1][1].decision_function( + Xt, + **routed_params.get(self.steps[-1][0], {}).get("decision_function", {}), ) - return self.steps[-1][1].decision_function( - Xt, **routed_params.get(self.steps[-1][0], {}).get("decision_function", {}) - ) @available_if(pipeline._final_estimator_has("score_samples")) def score_samples(self, X): @@ -722,10 +928,12 @@ def score_samples(self, X): y_score : ndarray of shape (n_samples,) Result of calling `score_samples` on the final estimator. """ - Xt = X - for _, _, transformer in self._iter(with_final=False): - Xt = transformer.transform(Xt) - return self.steps[-1][1].score_samples(Xt) + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + Xt = X + for _, _, transformer in self._iter(with_final=False): + Xt = transformer.transform(Xt) + return self.steps[-1][1].score_samples(Xt) @available_if(pipeline._final_estimator_has("predict_log_proba")) def predict_log_proba(self, X, **params): @@ -769,20 +977,22 @@ def predict_log_proba(self, X, **params): y_log_proba : ndarray of shape (n_samples, n_classes) Result of calling `predict_log_proba` on the final estimator. """ - Xt = X + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + Xt = X - if not _routing_enabled(): + if not _routing_enabled(): + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt) + return self.steps[-1][1].predict_log_proba(Xt, **params) + + # metadata routing enabled + routed_params = process_routing(self, "predict_log_proba", **params) for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt) - return self.steps[-1][1].predict_log_proba(Xt, **params) - - # metadata routing enabled - routed_params = process_routing(self, "predict_log_proba", **params) - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt, **routed_params[name].transform) - return self.steps[-1][1].predict_log_proba( - Xt, **routed_params[self.steps[-1][0]].predict_log_proba - ) + Xt = transform.transform(Xt, **routed_params[name].transform) + return self.steps[-1][1].predict_log_proba( + Xt, **routed_params[self.steps[-1][0]].predict_log_proba + ) def _can_transform(self): return self._final_estimator == "passthrough" or hasattr( @@ -822,15 +1032,17 @@ def transform(self, X, **params): Xt : ndarray of shape (n_samples, n_transformed_features) Transformed data. """ - _raise_for_params(params, self, "transform") - - # not branching here since params is only available if - # enable_metadata_routing=True - routed_params = process_routing(self, "transform", **params) - Xt = X - for _, name, transform in self._iter(): - Xt = transform.transform(Xt, **routed_params[name].transform) - return Xt + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + _raise_for_params(params, self, "transform") + + # not branching here since params is only available if + # enable_metadata_routing=True + routed_params = process_routing(self, "transform", **params) + Xt = X + for _, name, transform in self._iter(): + Xt = transform.transform(Xt, **routed_params[name].transform) + return Xt def _can_inverse_transform(self): return all(hasattr(t, "inverse_transform") for _, _, t in self._iter()) @@ -865,17 +1077,19 @@ def inverse_transform(self, Xt, **params): Inverse transformed data, that is, data in the original feature space. """ - _raise_for_params(params, self, "inverse_transform") - - # we don't have to branch here, since params is only non-empty if - # enable_metadata_routing=True. - routed_params = process_routing(self, "inverse_transform", **params) - reverse_iter = reversed(list(self._iter())) - for _, name, transform in reverse_iter: - Xt = transform.inverse_transform( - Xt, **routed_params[name].inverse_transform - ) - return Xt + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + _raise_for_params(params, self, "inverse_transform") + + # we don't have to branch here, since params is only non-empty if + # enable_metadata_routing=True. + routed_params = process_routing(self, "inverse_transform", **params) + reverse_iter = reversed(list(self._iter())) + for _, name, transform in reverse_iter: + Xt = transform.inverse_transform( + Xt, **routed_params[name].inverse_transform + ) + return Xt @available_if(pipeline._final_estimator_has("score")) def score(self, X, y=None, sample_weight=None, **params): @@ -914,24 +1128,28 @@ def score(self, X, y=None, sample_weight=None, **params): score : float Result of calling `score` on the final estimator. """ - Xt = X - if not _routing_enabled(): - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt) - score_params = {} - if sample_weight is not None: - score_params["sample_weight"] = sample_weight - return self.steps[-1][1].score(Xt, y, **score_params) - - # metadata routing is enabled. - routed_params = process_routing( - self, "score", sample_weight=sample_weight, **params - ) + # TODO(0.15): Remove the context manager and use check_is_fitted(self) + with _raise_or_warn_if_not_fitted(self): + Xt = X + if not _routing_enabled(): + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt) + score_params = {} + if sample_weight is not None: + score_params["sample_weight"] = sample_weight + return self.steps[-1][1].score(Xt, y, **score_params) + + # metadata routing is enabled. + routed_params = process_routing( + self, "score", sample_weight=sample_weight, **params + ) - Xt = X - for _, name, transform in self._iter(with_final=False): - Xt = transform.transform(Xt, **routed_params[name].transform) - return self.steps[-1][1].score(Xt, y, **routed_params[self.steps[-1][0]].score) + Xt = X + for _, name, transform in self._iter(with_final=False): + Xt = transform.transform(Xt, **routed_params[name].transform) + return self.steps[-1][1].score( + Xt, y, **routed_params[self.steps[-1][0]].score + ) # TODO: once scikit-learn >= 1.4, the following function should be simplified by # calling `super().get_metadata_routing()` @@ -950,7 +1168,9 @@ def get_metadata_routing(self): router = MetadataRouter(owner=self.__class__.__name__) # first we add all steps except the last one - for _, name, trans in self._iter(with_final=False, filter_passthrough=True): + for _, name, trans in self._iter( + with_final=False, filter_passthrough=True, filter_resample=False + ): method_mapping = MethodMapping() # fit, fit_predict, and fit_transform call fit_transform if it # exists, or else fit and transform @@ -959,7 +1179,6 @@ def get_metadata_routing(self): method_mapping.add(caller="fit", callee="fit_transform") .add(caller="fit_transform", callee="fit_transform") .add(caller="fit_predict", callee="fit_transform") - .add(caller="fit_resample", callee="fit_transform") ) else: ( @@ -969,10 +1188,14 @@ def get_metadata_routing(self): .add(caller="fit_transform", callee="transform") .add(caller="fit_predict", callee="fit") .add(caller="fit_predict", callee="transform") - .add(caller="fit_resample", callee="fit") - .add(caller="fit_resample", callee="transform") ) + ( + # handling sampler if the fit_* stage + method_mapping.add(caller="fit", callee="fit_resample") + .add(caller="fit_transform", callee="fit_resample") + .add(caller="fit_predict", callee="fit_resample") + ) ( method_mapping.add(caller="predict", callee="transform") .add(caller="predict", callee="transform") @@ -994,17 +1217,12 @@ def get_metadata_routing(self): # then we add the last step method_mapping = MethodMapping() if hasattr(final_est, "fit_transform"): - ( - method_mapping.add(caller="fit_transform", callee="fit_transform").add( - caller="fit_resample", callee="fit_transform" - ) - ) + method_mapping.add(caller="fit_transform", callee="fit_transform") else: ( - method_mapping.add(caller="fit", callee="fit") - .add(caller="fit", callee="transform") - .add(caller="fit_resample", callee="fit") - .add(caller="fit_resample", callee="transform") + method_mapping.add(caller="fit", callee="fit").add( + caller="fit", callee="transform" + ) ) ( method_mapping.add(caller="fit", callee="fit") @@ -1051,6 +1269,67 @@ def _check_method_params(self, method, props, **kwargs): fit_params_steps[step]["fit_predict"][param] = pval return fit_params_steps + def __sklearn_is_fitted__(self): + """Indicate whether pipeline has been fit. + + This is done by checking whether the last non-`passthrough` step of the + pipeline is fitted. + + An empty pipeline is considered fitted. + """ + + # First find the last step that is not 'passthrough' + last_step = None + for _, estimator in reversed(self.steps): + if estimator != "passthrough": + last_step = estimator + break + + if last_step is None: + # All steps are 'passthrough', so the pipeline is considered fitted + return True + + try: + # check if the last step of the pipeline is fitted + # we only check the last step since if the last step is fit, it + # means the previous steps should also be fit. This is faster than + # checking if every step of the pipeline is fit. + check_is_fitted(last_step) + return True + except NotFittedError: + return False + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + + if not self.steps: + return tags + + try: + if self.steps[0][1] is not None and self.steps[0][1] != "passthrough": + tags.input_tags.pairwise = get_tags( + self.steps[0][1] + ).input_tags.pairwise + except (ValueError, AttributeError, TypeError): + # This happens when the `steps` is not a list of (name, estimator) + # tuples and `fit` is not called yet to validate the steps. + pass + + try: + if self.steps[-1][1] is not None and self.steps[-1][1] != "passthrough": + last_step_tags = get_tags(self.steps[-1][1]) + tags.estimator_type = last_step_tags.estimator_type + tags.target_tags.multi_output = last_step_tags.target_tags.multi_output + tags.classifier_tags = deepcopy(last_step_tags.classifier_tags) + tags.regressor_tags = deepcopy(last_step_tags.regressor_tags) + tags.transformer_tags = deepcopy(last_step_tags.transformer_tags) + except (ValueError, AttributeError, TypeError): + # This happens when the `steps` is not a list of (name, estimator) + # tuples and `fit` is not called yet to validate the steps. + pass + + return tags + def _fit_resample_one(sampler, X, y, message_clsname="", message=None, params=None): with _print_elapsed_time(message_clsname, message): @@ -1059,7 +1338,7 @@ def _fit_resample_one(sampler, X, y, message_clsname="", message=None, params=No return X_res, y_res, sampler -def _transform_one(transformer, X, y, weight, params): +def _transform_one(transformer, X, y, weight, params=None): """Call transform and apply weight to output. Parameters @@ -1113,10 +1392,14 @@ def _fit_transform_one( @validate_params( - {"memory": [None, str, HasMethods(["cache"])], "verbose": ["boolean"]}, + { + "memory": [None, str, HasMethods(["cache"])], + "transform_input": [None, list], + "verbose": ["boolean"], + }, prefer_skip_nested_validation=True, ) -def make_pipeline(*steps, memory=None, verbose=False): +def make_pipeline(*steps, memory=None, transform_input=None, verbose=False): """Construct a Pipeline from the given estimators. This is a shorthand for the Pipeline constructor; it does not require, and @@ -1138,6 +1421,17 @@ def make_pipeline(*steps, memory=None, verbose=False): inspect estimators within the pipeline. Caching the transformers is advantageous when fitting is time consuming. + transform_input : list of str, default=None + This enables transforming some input arguments to ``fit`` (other than ``X``) + to be transformed by the steps of the pipeline up to the step which requires + them. Requirement is defined via :ref:`metadata routing `. + This can be used to pass a validation set through the pipeline for instance. + + You can only set this if metadata routing is enabled, which you + can enable using ``sklearn.set_config(enable_metadata_routing=True)``. + + .. versionadded:: 1.6 + verbose : bool, default=False If True, the time elapsed while fitting each step will be printed as it is completed. @@ -1160,4 +1454,9 @@ def make_pipeline(*steps, memory=None, verbose=False): Pipeline(steps=[('standardscaler', StandardScaler()), ('gaussiannb', GaussianNB())]) """ - return Pipeline(pipeline._name_estimators(steps), memory=memory, verbose=verbose) + return Pipeline( + pipeline._name_estimators(steps), + memory=memory, + transform_input=transform_input, + verbose=verbose, + ) diff --git a/imblearn/tests/test_common.py b/imblearn/tests/test_common.py index d78cafd83..fee54b8b8 100644 --- a/imblearn/tests/test_common.py +++ b/imblearn/tests/test_common.py @@ -1,4 +1,5 @@ """Common tests""" + # Authors: Guillaume Lemaitre # Christos Aridas # License: MIT @@ -8,16 +9,19 @@ import numpy as np import pytest -from sklearn.base import clone from sklearn.exceptions import ConvergenceWarning -from sklearn.utils._testing import SkipTest, ignore_warnings, set_random_state -from sklearn.utils.estimator_checks import _construct_instance, _get_check_estimator_ids -from sklearn.utils.estimator_checks import ( - parametrize_with_checks as parametrize_with_checks_sklearn, -) +from sklearn.utils._testing import ignore_warnings from imblearn.over_sampling import RandomOverSampler -from imblearn.under_sampling import NearMiss, RandomUnderSampler +from imblearn.under_sampling import RandomUnderSampler +from imblearn.utils._sklearn_compat import ( + parametrize_with_checks as parametrize_with_checks_sklearn, +) +from imblearn.utils._test_common.instance_generator import ( + _get_check_estimator_ids, + _get_expected_failed_checks, + _tested_estimators, +) from imblearn.utils.estimator_checks import ( _set_checking_parameters, check_dataframe_column_names_consistency, @@ -30,33 +34,21 @@ @pytest.mark.parametrize("name, Estimator", all_estimators()) def test_all_estimator_no_base_class(name, Estimator): # test that all_estimators doesn't find abstract classes. - msg = f"Base estimators such as {name} should not be included" f" in all_estimators" + msg = f"Base estimators such as {name} should not be included in all_estimators" assert not name.lower().startswith("base"), msg -def _tested_estimators(): - for name, Estimator in all_estimators(): - try: - estimator = _construct_instance(Estimator) - set_random_state(estimator) - except SkipTest: - continue - - if isinstance(estimator, NearMiss): - # For NearMiss, let's check the three algorithms - for version in (1, 2, 3): - yield clone(estimator).set_params(version=version) - else: - yield estimator - - -@parametrize_with_checks_sklearn(list(_tested_estimators())) +@parametrize_with_checks_sklearn( + list(_tested_estimators()), expected_failed_checks=_get_expected_failed_checks +) def test_estimators_compatibility_sklearn(estimator, check, request): _set_checking_parameters(estimator) check(estimator) -@parametrize_with_checks(list(_tested_estimators())) +@parametrize_with_checks( + list(_tested_estimators()), expected_failed_checks=_get_expected_failed_checks +) def test_estimators_imblearn(estimator, check, request): # Common tests for estimator instances with ignore_warnings( diff --git a/imblearn/tests/test_docstring_parameters.py b/imblearn/tests/test_docstring_parameters.py index 1bd6ecf51..364ca09f9 100644 --- a/imblearn/tests/test_docstring_parameters.py +++ b/imblearn/tests/test_docstring_parameters.py @@ -10,29 +10,22 @@ import pytest from sklearn.datasets import make_classification -from sklearn.linear_model import LogisticRegression from sklearn.utils._testing import ( _get_func_name, check_docstring_parameters, ignore_warnings, ) -from sklearn.utils.estimator_checks import _enforce_estimator_tags_y - -try: - from sklearn.utils.estimator_checks import _enforce_estimator_tags_x -except ImportError: - # scikit-learn >= 1.2 - from sklearn.utils.estimator_checks import ( - _enforce_estimator_tags_X as _enforce_estimator_tags_x, - ) - from sklearn.utils.deprecation import _is_deprecated -from sklearn.utils.estimator_checks import _construct_instance +from sklearn.utils.estimator_checks import ( + _enforce_estimator_tags_X, + _enforce_estimator_tags_y, +) import imblearn from imblearn.base import is_sampler +from imblearn.under_sampling import NearMiss +from imblearn.utils._test_common.instance_generator import _tested_estimators from imblearn.utils.estimator_checks import _set_checking_parameters -from imblearn.utils.testing import all_estimators # walk_packages() ignores DeprecationWarnings, now we need to ignore # FutureWarnings @@ -49,10 +42,10 @@ ) # functions to ignore args / docstring of -_DOCSTRING_IGNORES = [ - "RUSBoostClassifier", # TODO remove after releasing scikit-learn 1.0.1 - "ValueDifferenceMetric", -] +_DOCSTRING_IGNORES = ["ValueDifferenceMetric"] +_IGNORE_ATTRIBUTES = { + NearMiss: ["nn_ver3_"], +} # Methods where y param should be ignored if y=None by default _METHODS_IGNORE_NONE_Y = [ @@ -165,28 +158,19 @@ def test_tabs(): ) -def _construct_compose_pipeline_instance(Estimator): - # Minimal / degenerate instances: only useful to test the docstrings. - if Estimator.__name__ == "Pipeline": - return Estimator(steps=[("clf", LogisticRegression())]) - - -@pytest.mark.parametrize("name, Estimator", all_estimators()) -def test_fit_docstring_attributes(name, Estimator): +@pytest.mark.parametrize("estimator", list(_tested_estimators())) +def test_fit_docstring_attributes(estimator): pytest.importorskip("numpydoc") from numpydoc import docscrape + Estimator = estimator.__class__ if Estimator.__name__ in _DOCSTRING_IGNORES: return doc = docscrape.ClassDoc(Estimator) attributes = doc["Attributes"] - if Estimator.__name__ == "Pipeline": - est = _construct_compose_pipeline_instance(Estimator) - else: - est = _construct_instance(Estimator) - _set_checking_parameters(est) + _set_checking_parameters(estimator) X, y = make_classification( n_samples=20, @@ -196,16 +180,16 @@ def test_fit_docstring_attributes(name, Estimator): random_state=2, ) - y = _enforce_estimator_tags_y(est, y) - X = _enforce_estimator_tags_x(est, X) + y = _enforce_estimator_tags_y(estimator, y) + X = _enforce_estimator_tags_X(estimator, X) - if "oob_score" in est.get_params(): - est.set_params(bootstrap=True, oob_score=True) + if "oob_score" in estimator.get_params(): + estimator.set_params(bootstrap=True, oob_score=True) - if is_sampler(est): - est.fit_resample(X, y) + if is_sampler(estimator): + estimator.fit_resample(X, y) else: - est.fit(X, y) + estimator.fit(X, y) skipped_attributes = set( [ @@ -224,9 +208,11 @@ def test_fit_docstring_attributes(name, Estimator): continue # ignore deprecation warnings with ignore_warnings(category=FutureWarning): - assert hasattr(est, attr.name) + if attr.name in _IGNORE_ATTRIBUTES.get(Estimator, []): + continue + assert hasattr(estimator, attr.name) - fit_attr = _get_all_fitted_attributes(est) + fit_attr = _get_all_fitted_attributes(estimator) fit_attr_names = [attr.name for attr in attributes] undocumented_attrs = set(fit_attr).difference(fit_attr_names) undocumented_attrs = set(undocumented_attrs).difference(skipped_attributes) diff --git a/imblearn/tests/test_pipeline.py b/imblearn/tests/test_pipeline.py index d89e03a11..d017b4e86 100644 --- a/imblearn/tests/test_pipeline.py +++ b/imblearn/tests/test_pipeline.py @@ -1,6 +1,7 @@ """ Test the pipeline module. """ + # Authors: Guillaume Lemaitre # Christos Aridas # License: MIT @@ -13,10 +14,10 @@ import numpy as np import pytest -import sklearn from joblib import Memory from pytest import raises -from sklearn.base import BaseEstimator, clone +from sklearn import config_context +from sklearn.base import BaseEstimator, ClassifierMixin, TransformerMixin, clone from sklearn.cluster import KMeans from sklearn.datasets import load_iris, make_classification from sklearn.decomposition import PCA @@ -33,14 +34,14 @@ ) from sklearn.utils.fixes import parse_version +from imblearn.base import BaseSampler from imblearn.datasets import make_imbalance from imblearn.pipeline import Pipeline, make_pipeline from imblearn.under_sampling import EditedNearestNeighbours as ENN from imblearn.under_sampling import RandomUnderSampler +from imblearn.utils._sklearn_compat import Tags, sklearn_version from imblearn.utils.estimator_checks import check_param_validation -sklearn_version = parse_version(sklearn.__version__) - JUNK_FOOD_DOCS = ( "the pizza pizza beer copyright", "the pizza burger beer copyright", @@ -60,6 +61,9 @@ def __init__(self, a=None, b=None): self.a = a self.b = b + def __sklearn_tags__(self): + return Tags() + class NoTrans(NoFit): def fit(self, X, y): @@ -96,6 +100,9 @@ class Mult(BaseEstimator): def __init__(self, mult=1): self.mult = mult + def __sklearn_is_fitted__(self): + return True + def fit(self, X, y): return self @@ -121,7 +128,9 @@ def __init__(self): self.successful = False def fit(self, X, y, should_succeed=False): + self.fitted_ = True self.successful = should_succeed + return self def predict(self, X): return self.successful @@ -150,6 +159,9 @@ def fit(self, X, y): class DummyEstimatorParams(BaseEstimator): """Mock classifier that takes params on predict""" + def __sklearn_is_fitted__(self): + return True + def fit(self, X, y): return self @@ -172,6 +184,9 @@ def fit_resample(self, X, y): class FitTransformSample(NoTrans): """Estimator implementing both transform and sample""" + def __sklearn_is_fitted__(self): + return True + def fit(self, X, y, should_succeed=False): pass @@ -538,6 +553,7 @@ def make(): "m2__mult": 2, "last__mult": 5, "verbose": False, + "transform_input": None, } assert pipeline.get_params(deep=True) == expected_params @@ -1338,9 +1354,6 @@ def test_pipeline_param_validation(): check_param_validation("Pipeline", model) -@pytest.mark.skipif( - sklearn_version < parse_version("1.2"), reason="requires scikit-learn >= 1.2" -) def test_pipeline_with_set_output(): pd = pytest.importorskip("pandas") X, y = load_iris(return_X_y=True, as_frame=True) @@ -1360,3 +1373,150 @@ def test_pipeline_with_set_output(): assert isinstance(X_res, pd.DataFrame) # transformer will not change `y` and sampler will always preserve the type of `y` assert isinstance(y_res, type(y)) + + +# TODO(0.15): change warning to checking for NotFittedError +@pytest.mark.parametrize( + "method", + [ + "predict", + "predict_proba", + "predict_log_proba", + "decision_function", + "score", + "score_samples", + "transform", + "inverse_transform", + ], +) +def test_pipeline_warns_not_fitted(method): + class StatelessEstimator(BaseEstimator): + """Stateless estimator that doesn't check if it's fitted. + Stateless estimators that don't require fit, should properly set the + `requires_fit` flag and implement a `__sklearn_check_is_fitted__` returning + `True`. + """ + + def fit(self, X, y): + return self # pragma: no cover + + def transform(self, X): + return X + + def predict(self, X): + return np.ones(len(X)) + + def predict_proba(self, X): + return np.ones(len(X)) + + def predict_log_proba(self, X): + return np.zeros(len(X)) + + def decision_function(self, X): + return np.ones(len(X)) + + def score(self, X, y): + return 1 + + def score_samples(self, X): + return np.ones(len(X)) + + def inverse_transform(self, X): + return X + + pipe = Pipeline([("estimator", StatelessEstimator())]) + with pytest.warns(FutureWarning, match="This Pipeline instance is not fitted yet."): + getattr(pipe, method)([[1]]) + + +# transform_input tests +# ===================== + + +@pytest.mark.skipif( + sklearn_version < parse_version("1.4"), + reason="scikit-learn < 1.4 does not support transform_input", +) +@config_context(enable_metadata_routing=True) +def test_transform_input_explicit_value_check(): + """Test that the right transformed values are passed to `fit`.""" + + class Transformer(TransformerMixin, BaseEstimator): + def fit(self, X, y): + self.fitted_ = True + return self + + def transform(self, X): + return X + 1 + + class Estimator(ClassifierMixin, BaseEstimator): + def fit(self, X, y, X_val=None, y_val=None): + assert_array_equal(X, np.array([[1, 2]])) + assert_array_equal(y, np.array([0, 1])) + assert_array_equal(X_val, np.array([[2, 3]])) + assert_array_equal(y_val, np.array([0, 1])) + return self + + X = np.array([[0, 1]]) + y = np.array([0, 1]) + X_val = np.array([[1, 2]]) + y_val = np.array([0, 1]) + pipe = Pipeline( + [ + ("transformer", Transformer()), + ("estimator", Estimator().set_fit_request(X_val=True, y_val=True)), + ], + transform_input=["X_val"], + ) + pipe.fit(X, y, X_val=X_val, y_val=y_val) + + +def test_transform_input_no_slep6(): + """Make sure the right error is raised if slep6 is not enabled.""" + X = np.array([[1, 2], [3, 4]]) + y = np.array([0, 1]) + msg = "The `transform_input` parameter can only be set if metadata" + with pytest.raises(ValueError, match=msg): + make_pipeline(DummyTransf(), transform_input=["blah"]).fit(X, y) + + +@pytest.mark.skipif( + sklearn_version >= parse_version("1.4"), + reason="scikit-learn >= 1.4 supports transform_input", +) +@config_context(enable_metadata_routing=True) +def test_transform_input_sklearn_version(): + """Test that transform_input raises error with sklearn < 1.4.""" + X = np.array([[1, 2], [3, 4]]) + y = np.array([0, 1]) + msg = ( + "The `transform_input` parameter is not supported in scikit-learn versions " + "prior to 1.4" + ) + with pytest.raises(ValueError, match=msg): + make_pipeline(DummyTransf(), transform_input=["blah"]).fit(X, y) + + +# end of transform_input tests +# ============================= + + +def test_metadata_routing_with_sampler(): + """Check that we can use a sampler with metadata routing.""" + X, y = make_classification() + cost_matrix = np.random.rand(X.shape[0], 2, 2) + + class CostSensitiveSampler(BaseSampler): + def fit_resample(self, X, y, cost_matrix=None): + return self._fit_resample(X, y, cost_matrix=cost_matrix) + + def _fit_resample(self, X, y, cost_matrix=None): + self.cost_matrix_ = cost_matrix + return X, y + + with config_context(enable_metadata_routing=True): + sampler = CostSensitiveSampler().set_fit_resample_request(cost_matrix=True) + pipeline = Pipeline([("sampler", sampler), ("model", LogisticRegression())]) + pipeline.fit(X, y, cost_matrix=cost_matrix) + + assert_allclose(pipeline[0].cost_matrix_, cost_matrix) diff --git a/imblearn/tests/test_public_functions.py b/imblearn/tests/test_public_functions.py index d84732007..067569ee6 100644 --- a/imblearn/tests/test_public_functions.py +++ b/imblearn/tests/test_public_functions.py @@ -5,8 +5,7 @@ from inspect import signature import pytest - -from imblearn.utils._param_validation import ( +from sklearn.utils._param_validation import ( generate_invalid_param_val, generate_valid_param, make_constraint, diff --git a/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py b/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py index 5e2ca3a82..9203527a1 100644 --- a/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py +++ b/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py @@ -12,10 +12,10 @@ from sklearn.cluster import KMeans from sklearn.neighbors import NearestNeighbors from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import HasMethods, StrOptions from ...utils import Substitution from ...utils._docstring import _random_state_docstring -from ...utils._param_validation import HasMethods, StrOptions from ..base import BaseUnderSampler VOTING_KIND = ("auto", "hard", "soft") @@ -203,3 +203,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": False} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = False + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py b/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py index ac012a073..8727fa92f 100644 --- a/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py +++ b/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py @@ -6,7 +6,6 @@ # License: MIT import numbers -import warnings from collections import Counter import numpy as np @@ -14,10 +13,10 @@ from sklearn.base import clone from sklearn.neighbors import KNeighborsClassifier from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import HasMethods, Interval from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods, Interval from ..base import BaseCleaningSampler @@ -57,14 +56,6 @@ class CondensedNearestNeighbour(BaseCleaningSampler): corresponds to the class labels from which to sample and the values are the number of samples to sample. - estimator_ : estimator object - The validated K-nearest neighbor estimator created from `n_neighbors` parameter. - - .. deprecated:: 0.12 - `estimator_` is deprecated in 0.12 and will be removed in 0.14. Use - `estimators_` instead that contains the list of all K-nearest - neighbors estimator used for each pair of class. - estimators_ : list of estimator objects of shape (n_resampled_classes - 1,) Contains the K-nearest neighbor estimator used for per of classes. @@ -247,15 +238,10 @@ def _fit_resample(self, X, y): return _safe_indexing(X, idx_under), _safe_indexing(y, idx_under) - @property - def estimator_(self): - """Last fitted k-NN estimator.""" - warnings.warn( - "`estimator_` attribute has been deprecated in 0.12 and will be " - "removed in 0.14. Use `estimators_` instead.", - FutureWarning, - ) - return self.estimators_[-1] - def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py b/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py index 38abd4bed..87832d2c0 100644 --- a/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py +++ b/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py @@ -10,12 +10,12 @@ from collections import Counter import numpy as np +from scipy.stats import mode from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import HasMethods, Interval, StrOptions from ...utils import Substitution, check_neighbors_object from ...utils._docstring import _n_jobs_docstring -from ...utils._param_validation import HasMethods, Interval, StrOptions -from ...utils.fixes import _mode from ..base import BaseCleaningSampler SEL_KIND = ("all", "mode") @@ -168,7 +168,7 @@ def _fit_resample(self, X, y): nnhood_idx = self.nn_.kneighbors(X_class, return_distance=False)[:, 1:] nnhood_label = y[nnhood_idx] if self.kind_sel == "mode": - nnhood_label, _ = _mode(nnhood_label, axis=1) + nnhood_label, _ = mode(nnhood_label, axis=1, keepdims=False) nnhood_bool = np.ravel(nnhood_label) == y_class elif self.kind_sel == "all": nnhood_label = nnhood_label == target_class @@ -192,6 +192,11 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags + @Substitution( sampling_strategy=BaseCleaningSampler._sampling_strategy_docstring, @@ -413,6 +418,11 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags + @Substitution( sampling_strategy=BaseCleaningSampler._sampling_strategy_docstring, @@ -621,3 +631,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py b/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py index dac3f3c33..56c7b56b9 100644 --- a/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py +++ b/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py @@ -15,10 +15,10 @@ from sklearn.ensemble._base import _set_random_states from sklearn.model_selection import StratifiedKFold, cross_val_predict from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import HasMethods from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods from ..base import BaseUnderSampler @@ -202,3 +202,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_nearmiss.py b/imblearn/under_sampling/_prototype_selection/_nearmiss.py index 70f647fa5..16c532d3b 100644 --- a/imblearn/under_sampling/_prototype_selection/_nearmiss.py +++ b/imblearn/under_sampling/_prototype_selection/_nearmiss.py @@ -10,10 +10,10 @@ import numpy as np from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import HasMethods, Interval from ...utils import Substitution, check_neighbors_object from ...utils._docstring import _n_jobs_docstring -from ...utils._param_validation import HasMethods, Interval from ..base import BaseUnderSampler @@ -62,6 +62,9 @@ class NearMiss(BaseUnderSampler): nn_ : estimator object Validated K-nearest Neighbours object created from `n_neighbors` parameter. + nn_ver3_ : estimator object + Validated K-nearest Neighbours object created from `n_neighbors_ver3` parameter. + sample_indices_ : ndarray of shape (n_new_samples,) Indices of the samples selected. @@ -312,3 +315,8 @@ def _more_tags(self): } } # fmt: on + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py b/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py index 188ba32f3..d0e40c4b7 100644 --- a/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py +++ b/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py @@ -5,17 +5,16 @@ # License: MIT import numbers -import warnings from collections import Counter import numpy as np from sklearn.base import clone from sklearn.neighbors import KNeighborsClassifier, NearestNeighbors from sklearn.utils import _safe_indexing +from sklearn.utils._param_validation import HasMethods, Interval from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring -from ...utils._param_validation import HasMethods, Hidden, Interval, StrOptions from ..base import BaseCleaningSampler from ._edited_nearest_neighbours import EditedNearestNeighbours @@ -48,22 +47,6 @@ class NeighbourhoodCleaningRule(BaseCleaningSampler): :class:`~sklearn.neighbors.base.KNeighborsMixin` that will be used to find the nearest-neighbors. By default, it will be a 3-NN. - kind_sel : {{"all", "mode"}}, default='all' - Strategy to use in order to exclude samples in the ENN sampling. - - - If ``'all'``, all neighbours will have to agree with the samples of - interest to not be excluded. - - If ``'mode'``, the majority vote of the neighbours will be used in - order to exclude a sample. - - The strategy `"all"` will be less conservative than `'mode'`. Thus, - more samples will be removed when `kind_sel="all"` generally. - - .. deprecated:: 0.12 - `kind_sel` is deprecated in 0.12 and will be removed in 0.14. - Currently the parameter has no effect and corresponds always to the - `"all"` strategy. - threshold_cleaning : float, default=0.5 Threshold used to whether consider a class or not during the cleaning after applying ENN. A class will be considered during cleaning when: @@ -150,7 +133,6 @@ class NeighbourhoodCleaningRule(BaseCleaningSampler): Interval(numbers.Integral, 1, None, closed="left"), HasMethods(["kneighbors", "kneighbors_graph"]), ], - "kind_sel": [StrOptions({"all", "mode"}), Hidden(StrOptions({"deprecated"}))], "threshold_cleaning": [Interval(numbers.Real, 0, None, closed="neither")], "n_jobs": [numbers.Integral, None], } @@ -161,14 +143,12 @@ def __init__( sampling_strategy="auto", edited_nearest_neighbours=None, n_neighbors=3, - kind_sel="deprecated", threshold_cleaning=0.5, n_jobs=None, ): super().__init__(sampling_strategy=sampling_strategy) self.edited_nearest_neighbours = edited_nearest_neighbours self.n_neighbors = n_neighbors - self.kind_sel = kind_sel self.threshold_cleaning = threshold_cleaning self.n_jobs = n_jobs @@ -197,12 +177,6 @@ def _validate_estimator(self): self.edited_nearest_neighbours_ = clone(self.edited_nearest_neighbours) def _fit_resample(self, X, y): - if self.kind_sel != "deprecated": - warnings.warn( - "`kind_sel` is deprecated in 0.12 and will be removed in 0.14. " - "It already has not effect and corresponds to the `'all'` option.", - FutureWarning, - ) self._validate_estimator() self.edited_nearest_neighbours_.fit_resample(X, y) index_not_a1 = self.edited_nearest_neighbours_.sample_indices_ @@ -256,3 +230,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py b/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py index e0e5b4111..fe2b3dde4 100644 --- a/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py +++ b/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py @@ -5,17 +5,16 @@ # License: MIT import numbers -import warnings from collections import Counter import numpy as np from sklearn.base import clone from sklearn.neighbors import KNeighborsClassifier from sklearn.utils import _safe_indexing, check_random_state +from sklearn.utils._param_validation import HasMethods, Interval from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring, _random_state_docstring -from ...utils._param_validation import HasMethods, Interval from ..base import BaseCleaningSampler from ._tomek_links import TomekLinks @@ -56,14 +55,6 @@ class OneSidedSelection(BaseCleaningSampler): corresponds to the class labels from which to sample and the values are the number of samples to sample. - estimator_ : estimator object - Validated K-nearest neighbors estimator created from parameter `n_neighbors`. - - .. deprecated:: 0.12 - `estimator_` is deprecated in 0.12 and will be removed in 0.14. Use - `estimators_` instead that contains the list of all K-nearest - neighbors estimator used for each pair of class. - estimators_ : list of estimator objects of shape (n_resampled_classes - 1,) Contains the K-nearest neighbor estimator used for per of classes. @@ -213,15 +204,10 @@ def _fit_resample(self, X, y): return X_cleaned, y_cleaned - @property - def estimator_(self): - """Last fitted k-NN estimator.""" - warnings.warn( - "`estimator_` attribute has been deprecated in 0.12 and will be " - "removed in 0.14. Use `estimators_` instead.", - FutureWarning, - ) - return self.estimators_[-1] - def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py b/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py index 876195a6d..6696069c3 100644 --- a/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py +++ b/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py @@ -9,6 +9,7 @@ from ...utils import Substitution, check_target_type from ...utils._docstring import _random_state_docstring +from ...utils._sklearn_compat import validate_data from ...utils._validation import _check_X from ..base import BaseUnderSampler @@ -99,8 +100,7 @@ def __init__( def _check_X_y(self, X, y): y, binarize_y = check_target_type(y, indicate_one_vs_all=True) X = _check_X(X) - self._check_n_features(X, reset=True) - self._check_feature_names(X, reset=True) + X, y = validate_data(self, X=X, y=y, reset=True, skip_check_array=True) return X, y, binarize_y def _fit_resample(self, X, y): @@ -140,3 +140,10 @@ def _more_tags(self): "check_complex_data": "Robust to this type of data.", }, } + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.input_tags.allow_nan = True + tags.input_tags.string = True + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/_tomek_links.py b/imblearn/under_sampling/_prototype_selection/_tomek_links.py index b0f954959..e1e8a0a3c 100644 --- a/imblearn/under_sampling/_prototype_selection/_tomek_links.py +++ b/imblearn/under_sampling/_prototype_selection/_tomek_links.py @@ -158,3 +158,8 @@ def _fit_resample(self, X, y): def _more_tags(self): return {"sample_indices": True} + + def __sklearn_tags__(self): + tags = super().__sklearn_tags__() + tags.sampler_tags.sample_indices = True + return tags diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py b/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py index 5cc8f4162..21fb47db2 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py @@ -117,13 +117,3 @@ def test_condensed_nearest_neighbour_multiclass(): assert est.classes_[1] in {1, 2, 3} # other classes other_classes.append(est.classes_[1]) assert len(set(other_classes)) == len(other_classes) - - -# TODO: remove in 0.14 -def test_condensed_nearest_neighbors_deprecation(): - """Check that we raise a FutureWarning when accessing the parameter `estimator_`.""" - cnn = CondensedNearestNeighbour(random_state=RND_SEED) - cnn.fit_resample(X, Y) - warn_msg = "`estimator_` attribute has been deprecated" - with pytest.warns(FutureWarning, match=warn_msg): - cnn.estimator_ diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py b/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py index 97a1d0259..8b5f57d1d 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py @@ -73,12 +73,3 @@ def test_ncr_n_neighbors(data): # we should have a more aggressive cleaning with n_neighbors is larger assert len(sample_indices_3_nn) > len(sample_indices_10_nn) - - -# TODO: remove in 0.14 -@pytest.mark.parametrize("kind_sel", ["all", "mode"]) -def test_ncr_deprecate_kind_sel(data, kind_sel): - X, y = data - - with pytest.warns(FutureWarning, match="`kind_sel` is deprecated"): - NeighbourhoodCleaningRule(kind_sel=kind_sel).fit_resample(X, y) diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py b/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py index 3fb5458c4..a5e99339a 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py @@ -117,13 +117,3 @@ def test_one_sided_selection_multiclass(): assert est.classes_[1] in {1, 2, 3} # other classes other_classes.append(est.classes_[1]) assert len(set(other_classes)) == len(other_classes) - - -# TODO: remove in 0.14 -def test_one_sided_selection_deprecation(): - """Check that we raise a FutureWarning when accessing the parameter `estimator_`.""" - oss = OneSidedSelection(random_state=RND_SEED) - oss.fit_resample(X, Y) - warn_msg = "`estimator_` attribute has been deprecated" - with pytest.warns(FutureWarning, match=warn_msg): - oss.estimator_ diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py b/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py index f4e927902..7bf0edbe6 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py @@ -55,8 +55,7 @@ def test_rus_fit_resample(as_frame): if as_frame: assert hasattr(X_resampled, "loc") - # FIXME: we should use to_numpy with pandas >= 0.25 - X_resampled = X_resampled.values + X_resampled = X_resampled.to_numpy() assert_array_equal(X_resampled, X_gt) assert_array_equal(y_resampled, y_gt) diff --git a/imblearn/under_sampling/base.py b/imblearn/under_sampling/base.py index 92da45723..72f9f6d4a 100644 --- a/imblearn/under_sampling/base.py +++ b/imblearn/under_sampling/base.py @@ -7,8 +7,9 @@ import numbers from collections.abc import Mapping +from sklearn.utils._param_validation import Interval, StrOptions + from ..base import BaseSampler -from ..utils._param_validation import Interval, StrOptions class BaseUnderSampler(BaseSampler): @@ -20,7 +21,8 @@ class BaseUnderSampler(BaseSampler): _sampling_type = "under-sampling" - _sampling_strategy_docstring = """sampling_strategy : float, str, dict, callable, default='auto' + _sampling_strategy_docstring = ( + """sampling_strategy : float, str, dict, callable, default='auto' Sampling information to sample the data set. - When ``float``, it corresponds to the desired ratio of the number of @@ -56,7 +58,8 @@ class BaseUnderSampler(BaseSampler): - When callable, function taking ``y`` and returns a ``dict``. The keys correspond to the targeted classes. The values correspond to the desired number of samples for each class. - """.rstrip() # noqa: E501 + """.rstrip() + ) # noqa: E501 _parameter_constraints: dict = { "sampling_strategy": [ diff --git a/imblearn/utils/_available_if.py b/imblearn/utils/_available_if.py deleted file mode 100644 index bca75e735..000000000 --- a/imblearn/utils/_available_if.py +++ /dev/null @@ -1,99 +0,0 @@ -"""This is a copy of sklearn/utils/_available_if.py. It can be removed when -we support scikit-learn >= 1.1. -""" -# mypy: ignore-errors - -from functools import update_wrapper, wraps -from types import MethodType - -import sklearn -from sklearn.utils.fixes import parse_version - -sklearn_version = parse_version(sklearn.__version__) - -if sklearn_version < parse_version("1.1"): - - class _AvailableIfDescriptor: - """Implements a conditional property using the descriptor protocol. - - Using this class to create a decorator will raise an ``AttributeError`` - if check(self) returns a falsey value. Note that if check raises an error - this will also result in hasattr returning false. - - See https://docs.python.org/3/howto/descriptor.html for an explanation of - descriptors. - """ - - def __init__(self, fn, check, attribute_name): - self.fn = fn - self.check = check - self.attribute_name = attribute_name - - # update the docstring of the descriptor - update_wrapper(self, fn) - - def __get__(self, obj, owner=None): - attr_err = AttributeError( - f"This {owner.__name__!r} has no attribute {self.attribute_name!r}" - ) - if obj is not None: - # delegate only on instances, not the classes. - # this is to allow access to the docstrings. - if not self.check(obj): - raise attr_err - out = MethodType(self.fn, obj) - - else: - # This makes it possible to use the decorated method as an - # unbound method, for instance when monkeypatching. - @wraps(self.fn) - def out(*args, **kwargs): - if not self.check(args[0]): - raise attr_err - return self.fn(*args, **kwargs) - - return out - - def available_if(check): - """An attribute that is available only if check returns a truthy value. - - Parameters - ---------- - check : callable - When passed the object with the decorated method, this should return - a truthy value if the attribute is available, and either return False - or raise an AttributeError if not available. - - Returns - ------- - callable - Callable makes the decorated method available if `check` returns - a truthy value, otherwise the decorated method is unavailable. - - Examples - -------- - >>> from sklearn.utils.metaestimators import available_if - >>> class HelloIfEven: - ... def __init__(self, x): - ... self.x = x - ... - ... def _x_is_even(self): - ... return self.x % 2 == 0 - ... - ... @available_if(_x_is_even) - ... def say_hello(self): - ... print("Hello") - ... - >>> obj = HelloIfEven(1) - >>> hasattr(obj, "say_hello") - False - >>> obj.x = 2 - >>> hasattr(obj, "say_hello") - True - >>> obj.say_hello() - Hello - """ - return lambda fn: _AvailableIfDescriptor(fn, check, attribute_name=fn.__name__) - -else: - from sklearn.utils.metaestimators import available_if # noqa diff --git a/imblearn/utils/_metadata_requests.py b/imblearn/utils/_metadata_requests.py deleted file mode 100644 index c81aa4ff0..000000000 --- a/imblearn/utils/_metadata_requests.py +++ /dev/null @@ -1,1603 +0,0 @@ -""" -This is a copy of sklearn/utils/_metadata_requests.py. It can be removed once -we support scikit-learn >= 1.4. - -Metadata Routing Utility - -In order to better understand the components implemented in this file, one -needs to understand their relationship to one another. - -The only relevant public API for end users are the ``set_{method}_request``, -e.g. ``estimator.set_fit_request(sample_weight=True)``. However, third-party -developers and users who implement custom meta-estimators, need to deal with -the objects implemented in this file. - -All estimators (should) implement a ``get_metadata_routing`` method, returning -the routing requests set for the estimator. This method is automatically -implemented via ``BaseEstimator`` for all simple estimators, but needs a custom -implementation for meta-estimators. - -In non-routing consumers, i.e. the simplest case, e.g. ``SVM``, -``get_metadata_routing`` returns a ``MetadataRequest`` object. - -In routers, e.g. meta-estimators and a multi metric scorer, -``get_metadata_routing`` returns a ``MetadataRouter`` object. - -An object which is both a router and a consumer, e.g. a meta-estimator which -consumes ``sample_weight`` and routes ``sample_weight`` to its sub-estimators, -routing information includes both information about the object itself (added -via ``MetadataRouter.add_self_request``), as well as the routing information -for its sub-estimators. - -A ``MetadataRequest`` instance includes one ``MethodMetadataRequest`` per -method in ``METHODS``, which includes ``fit``, ``score``, etc. - -Request values are added to the routing mechanism by adding them to -``MethodMetadataRequest`` instances, e.g. -``metadatarequest.fit.add(param="sample_weight", alias="my_weights")``. This is -used in ``set_{method}_request`` which are automatically generated, so users -and developers almost never need to directly call methods on a -``MethodMetadataRequest``. - -The ``alias`` above in the ``add`` method has to be either a string (an alias), -or a {True (requested), False (unrequested), None (error if passed)}``. There -are some other special values such as ``UNUSED`` and ``WARN`` which are used -for purposes such as warning of removing a metadata in a child class, but not -used by the end users. - -``MetadataRouter`` includes information about sub-objects' routing and how -methods are mapped together. For instance, the information about which methods -of a sub-estimator are called in which methods of the meta-estimator are all -stored here. Conceptually, this information looks like: - -``` -{ - "sub_estimator1": ( - mapping=[(caller="fit", callee="transform"), ...], - router=MetadataRequest(...), # or another MetadataRouter - ), - ... -} -``` - -To give the above representation some structure, we use the following objects: - -- ``(caller, callee)`` is a namedtuple called ``MethodPair`` - -- The list of ``MethodPair`` stored in the ``mapping`` field is a - ``MethodMapping`` object - -- ``(mapping=..., router=...)`` is a namedtuple called ``RouterMappingPair`` - -The ``set_{method}_request`` methods are dynamically generated for estimators -which inherit from the ``BaseEstimator``. This is done by attaching instances -of the ``RequestMethod`` descriptor to classes, which is done in the -``_MetadataRequester`` class, and ``BaseEstimator`` inherits from this mixin. -This mixin also implements the ``get_metadata_routing``, which meta-estimators -need to override, but it works for simple consumers as is. -""" - -# Author: Adrin Jalali -# License: BSD 3 clause - -import inspect -from collections import namedtuple -from copy import deepcopy -from typing import TYPE_CHECKING, Optional, Union -from warnings import warn - -from sklearn import __version__, get_config -from sklearn.utils import Bunch -from sklearn.utils.fixes import parse_version - -sklearn_version = parse_version(__version__) - -if parse_version(sklearn_version.base_version) < parse_version("1.4"): - # Only the following methods are supported in the routing mechanism. Adding new - # methods at the moment involves monkeypatching this list. - # Note that if this list is changed or monkeypatched, the corresponding method - # needs to be added under a TYPE_CHECKING condition like the one done here in - # _MetadataRequester - SIMPLE_METHODS = [ - "fit", - "partial_fit", - "predict", - "predict_proba", - "predict_log_proba", - "decision_function", - "score", - "split", - "transform", - "inverse_transform", - ] - - # These methods are a composite of other methods and one cannot set their - # requests directly. Instead they should be set by setting the requests of the - # simple methods which make the composite ones. - COMPOSITE_METHODS = { - "fit_transform": ["fit", "transform"], - "fit_predict": ["fit", "predict"], - } - - METHODS = SIMPLE_METHODS + list(COMPOSITE_METHODS.keys()) - - def _routing_enabled(): - """Return whether metadata routing is enabled. - - .. versionadded:: 1.3 - - Returns - ------- - enabled : bool - Whether metadata routing is enabled. If the config is not set, it - defaults to False. - """ - return get_config().get("enable_metadata_routing", False) - - def _raise_for_params(params, owner, method): - """Raise an error if metadata routing is not enabled and params are passed. - - .. versionadded:: 1.4 - - Parameters - ---------- - params : dict - The metadata passed to a method. - - owner : object - The object to which the method belongs. - - method : str - The name of the method, e.g. "fit". - - Raises - ------ - ValueError - If metadata routing is not enabled and params are passed. - """ - caller = ( - f"{owner.__class__.__name__}.{method}" - if method - else owner.__class__.__name__ - ) - if not _routing_enabled() and params: - raise ValueError( - f"Passing extra keyword arguments to {caller} is only supported if" - " enable_metadata_routing=True, which you can set using" - " `sklearn.set_config`. See the User Guide" - " for more" - f" details. Extra parameters passed are: {set(params)}" - ) - - def _raise_for_unsupported_routing(obj, method, **kwargs): - """Raise when metadata routing is enabled and metadata is passed. - - This is used in meta-estimators which have not implemented metadata routing - to prevent silent bugs. There is no need to use this function if the - meta-estimator is not accepting any metadata, especially in `fit`, since - if a meta-estimator accepts any metadata, they would do that in `fit` as - well. - - Parameters - ---------- - obj : estimator - The estimator for which we're raising the error. - - method : str - The method where the error is raised. - - **kwargs : dict - The metadata passed to the method. - """ - kwargs = {key: value for key, value in kwargs.items() if value is not None} - if _routing_enabled() and kwargs: - cls_name = obj.__class__.__name__ - raise NotImplementedError( - f"{cls_name}.{method} cannot accept given metadata " - f"({set(kwargs.keys())}) since metadata routing is not yet implemented " - f"for {cls_name}." - ) - - class _RoutingNotSupportedMixin: - """A mixin to be used to remove the default `get_metadata_routing`. - - This is used in meta-estimators where metadata routing is not yet - implemented. - - This also makes it clear in our rendered documentation that this method - cannot be used. - """ - - def get_metadata_routing(self): - """Raise `NotImplementedError`. - - This estimator does not support metadata routing yet.""" - raise NotImplementedError( - f"{self.__class__.__name__} has not implemented metadata routing yet." - ) - - # Request values - # ============== - # Each request value needs to be one of the following values, or an alias. - - # this is used in `__metadata_request__*` attributes to indicate that a - # metadata is not present even though it may be present in the - # corresponding method's signature. - UNUSED = "$UNUSED$" - - # this is used whenever a default value is changed, and therefore the user - # should explicitly set the value, otherwise a warning is shown. An example - # is when a meta-estimator is only a router, but then becomes also a - # consumer in a new release. - WARN = "$WARN$" - - # this is the default used in `set_{method}_request` methods to indicate no - # change requested by the user. - UNCHANGED = "$UNCHANGED$" - - VALID_REQUEST_VALUES = [False, True, None, UNUSED, WARN] - - def request_is_alias(item): - """Check if an item is a valid alias. - - Values in ``VALID_REQUEST_VALUES`` are not considered aliases in this - context. Only a string which is a valid identifier is. - - Parameters - ---------- - item : object - The given item to be checked if it can be an alias. - - Returns - ------- - result : bool - Whether the given item is a valid alias. - """ - if item in VALID_REQUEST_VALUES: - return False - - # item is only an alias if it's a valid identifier - return isinstance(item, str) and item.isidentifier() - - def request_is_valid(item): - """Check if an item is a valid request value (and not an alias). - - Parameters - ---------- - item : object - The given item to be checked. - - Returns - ------- - result : bool - Whether the given item is valid. - """ - return item in VALID_REQUEST_VALUES - - # Metadata Request for Simple Consumers - # ===================================== - # This section includes MethodMetadataRequest and MetadataRequest which are - # used in simple consumers. - - class MethodMetadataRequest: - """A prescription of how metadata is to be passed to a single method. - - Refer to :class:`MetadataRequest` for how this class is used. - - .. versionadded:: 1.3 - - Parameters - ---------- - owner : str - A display name for the object owning these requests. - - method : str - The name of the method to which these requests belong. - - requests : dict of {str: bool, None or str}, default=None - The initial requests for this method. - """ - - def __init__(self, owner, method, requests=None): - self._requests = requests or dict() - self.owner = owner - self.method = method - - @property - def requests(self): - """Dictionary of the form: ``{key: alias}``.""" - return self._requests - - def add_request( - self, - *, - param, - alias, - ): - """Add request info for a metadata. - - Parameters - ---------- - param : str - The property for which a request is set. - - alias : str, or {True, False, None} - Specifies which metadata should be routed to `param` - - - str: the name (or alias) of metadata given to a meta-estimator that - should be routed to this parameter. - - - True: requested - - - False: not requested - - - None: error if passed - """ - if not request_is_alias(alias) and not request_is_valid(alias): - raise ValueError( - f"The alias you're setting for `{param}` should be either a " - "valid identifier or one of {None, True, False}, but given " - f"value is: `{alias}`" - ) - - if alias == param: - alias = True - - if alias == UNUSED: - if param in self._requests: - del self._requests[param] - else: - raise ValueError( - f"Trying to remove parameter {param} with UNUSED which doesn't" - " exist." - ) - else: - self._requests[param] = alias - - return self - - def _get_param_names(self, return_alias): - """Get names of all metadata that can be consumed or routed by this method. - - This method returns the names of all metadata, even the ``False`` - ones. - - Parameters - ---------- - return_alias : bool - Controls whether original or aliased names should be returned. If - ``False``, aliases are ignored and original names are returned. - - Returns - ------- - names : set of str - A set of strings with the names of all parameters. - """ - return set( - alias if return_alias and not request_is_valid(alias) else prop - for prop, alias in self._requests.items() - if not request_is_valid(alias) or alias is not False - ) - - def _check_warnings(self, *, params): - """Check whether metadata is passed which is marked as WARN. - - If any metadata is passed which is marked as WARN, a warning is raised. - - Parameters - ---------- - params : dict - The metadata passed to a method. - """ - params = {} if params is None else params - warn_params = { - prop - for prop, alias in self._requests.items() - if alias == WARN and prop in params - } - for param in warn_params: - warn( - f"Support for {param} has recently been added to this class. " - "To maintain backward compatibility, it is ignored now. " - "You can set the request value to False to silence this " - "warning, or to True to consume and use the metadata." - ) - - def _route_params(self, params): - """Prepare the given parameters to be passed to the method. - - The output of this method can be used directly as the input to the - corresponding method as extra props. - - Parameters - ---------- - params : dict - A dictionary of provided metadata. - - Returns - ------- - params : Bunch - A :class:`~sklearn.utils.Bunch` of {prop: value} which can be given to - the corresponding method. - """ - self._check_warnings(params=params) - unrequested = dict() - args = {arg: value for arg, value in params.items() if value is not None} - res = Bunch() - for prop, alias in self._requests.items(): - if alias is False or alias == WARN: - continue - elif alias is True and prop in args: - res[prop] = args[prop] - elif alias is None and prop in args: - unrequested[prop] = args[prop] - elif alias in args: - res[prop] = args[alias] - if unrequested: - raise UnsetMetadataPassedError( - message=( - f"[{', '.join([key for key in unrequested])}] are passed but " - "are not explicitly set as requested or not for" - f" {self.owner}.{self.method}" - ), - unrequested_params=unrequested, - routed_params=res, - ) - return res - - def _consumes(self, params): - """Check whether the given parameters are consumed by this method. - - Parameters - ---------- - params : iterable of str - An iterable of parameters to check. - - Returns - ------- - consumed : set of str - A set of parameters which are consumed by this method. - """ - params = set(params) - res = set() - for prop, alias in self._requests.items(): - if alias is True and prop in params: - res.add(prop) - elif isinstance(alias, str) and alias in params: - res.add(alias) - return res - - def _serialize(self): - """Serialize the object. - - Returns - ------- - obj : dict - A serialized version of the instance in the form of a dictionary. - """ - return self._requests - - def __repr__(self): - return str(self._serialize()) - - def __str__(self): - return str(repr(self)) - - class MetadataRequest: - """Contains the metadata request info of a consumer. - - Instances of `MethodMetadataRequest` are used in this class for each - available method under `metadatarequest.{method}`. - - Consumer-only classes such as simple estimators return a serialized - version of this class as the output of `get_metadata_routing()`. - - .. versionadded:: 1.3 - - Parameters - ---------- - owner : str - The name of the object to which these requests belong. - """ - - # this is here for us to use this attribute's value instead of doing - # `isinstance` in our checks, so that we avoid issues when people vendor - # this file instead of using it directly from scikit-learn. - _type = "metadata_request" - - def __init__(self, owner): - self.owner = owner - for method in SIMPLE_METHODS: - setattr( - self, - method, - MethodMetadataRequest(owner=owner, method=method), - ) - - def consumes(self, method, params): - """Check whether the given parameters are consumed by the given method. - - .. versionadded:: 1.4 - - Parameters - ---------- - method : str - The name of the method to check. - - params : iterable of str - An iterable of parameters to check. - - Returns - ------- - consumed : set of str - A set of parameters which are consumed by the given method. - """ - return getattr(self, method)._consumes(params=params) - - def __getattr__(self, name): - # Called when the default attribute access fails with an AttributeError - # (either __getattribute__() raises an AttributeError because name is - # not an instance attribute or an attribute in the class tree for self; - # or __get__() of a name property raises AttributeError). This method - # should either return the (computed) attribute value or raise an - # AttributeError exception. - # https://docs.python.org/3/reference/datamodel.html#object.__getattr__ - if name not in COMPOSITE_METHODS: - raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'" - ) - - requests = {} - for method in COMPOSITE_METHODS[name]: - mmr = getattr(self, method) - existing = set(requests.keys()) - upcoming = set(mmr.requests.keys()) - common = existing & upcoming - conflicts = [ - key for key in common if requests[key] != mmr._requests[key] - ] - if conflicts: - raise ValueError( - f"Conflicting metadata requests for {', '.join(conflicts)} " - f"while composing the requests for {name}. Metadata with the " - f"same name for methods {', '.join(COMPOSITE_METHODS[name])} " - "should have the same request value." - ) - requests.update(mmr._requests) - return MethodMetadataRequest( - owner=self.owner, method=name, requests=requests - ) - - def _get_param_names(self, method, return_alias, ignore_self_request=None): - """Get names of all metadata that can be consumed or routed by specified \ - method. - - This method returns the names of all metadata, even the ``False`` - ones. - - Parameters - ---------- - method : str - The name of the method for which metadata names are requested. - - return_alias : bool - Controls whether original or aliased names should be returned. If - ``False``, aliases are ignored and original names are returned. - - ignore_self_request : bool - Ignored. Present for API compatibility. - - Returns - ------- - names : set of str - A set of strings with the names of all parameters. - """ - return getattr(self, method)._get_param_names(return_alias=return_alias) - - def _route_params(self, *, method, params): - """Prepare the given parameters to be passed to the method. - - The output of this method can be used directly as the input to the - corresponding method as extra keyword arguments to pass metadata. - - Parameters - ---------- - method : str - The name of the method for which the parameters are requested and - routed. - - params : dict - A dictionary of provided metadata. - - Returns - ------- - params : Bunch - A :class:`~sklearn.utils.Bunch` of {prop: value} which can be given to - the corresponding method. - """ - return getattr(self, method)._route_params(params=params) - - def _check_warnings(self, *, method, params): - """Check whether metadata is passed which is marked as WARN. - - If any metadata is passed which is marked as WARN, a warning is raised. - - Parameters - ---------- - method : str - The name of the method for which the warnings should be checked. - - params : dict - The metadata passed to a method. - """ - getattr(self, method)._check_warnings(params=params) - - def _serialize(self): - """Serialize the object. - - Returns - ------- - obj : dict - A serialized version of the instance in the form of a dictionary. - """ - output = dict() - for method in SIMPLE_METHODS: - mmr = getattr(self, method) - if len(mmr.requests): - output[method] = mmr._serialize() - return output - - def __repr__(self): - return str(self._serialize()) - - def __str__(self): - return str(repr(self)) - - # Metadata Request for Routers - # ============================ - # This section includes all objects required for MetadataRouter which is used - # in routers, returned by their ``get_metadata_routing``. - - # This namedtuple is used to store a (mapping, routing) pair. Mapping is a - # MethodMapping object, and routing is the output of `get_metadata_routing`. - # MetadataRouter stores a collection of these namedtuples. - RouterMappingPair = namedtuple("RouterMappingPair", ["mapping", "router"]) - - # A namedtuple storing a single method route. A collection of these namedtuples - # is stored in a MetadataRouter. - MethodPair = namedtuple("MethodPair", ["callee", "caller"]) - - class MethodMapping: - """Stores the mapping between callee and caller methods for a router. - - This class is primarily used in a ``get_metadata_routing()`` of a router - object when defining the mapping between a sub-object (a sub-estimator or a - scorer) to the router's methods. It stores a collection of ``Route`` - namedtuples. - - Iterating through an instance of this class will yield named - ``MethodPair(callee, caller)`` tuples. - - .. versionadded:: 1.3 - """ - - def __init__(self): - self._routes = [] - - def __iter__(self): - return iter(self._routes) - - def add(self, *, callee, caller): - """Add a method mapping. - - Parameters - ---------- - callee : str - Child object's method name. This method is called in ``caller``. - - caller : str - Parent estimator's method name in which the ``callee`` is called. - - Returns - ------- - self : MethodMapping - Returns self. - """ - if callee not in METHODS: - raise ValueError( - f"Given callee:{callee} is not a valid method. Valid methods are:" - f" {METHODS}" - ) - if caller not in METHODS: - raise ValueError( - f"Given caller:{caller} is not a valid method. Valid methods are:" - f" {METHODS}" - ) - self._routes.append(MethodPair(callee=callee, caller=caller)) - return self - - def _serialize(self): - """Serialize the object. - - Returns - ------- - obj : list - A serialized version of the instance in the form of a list. - """ - result = list() - for route in self._routes: - result.append({"callee": route.callee, "caller": route.caller}) - return result - - @classmethod - def from_str(cls, route): - """Construct an instance from a string. - - Parameters - ---------- - route : str - A string representing the mapping, it can be: - - - `"one-to-one"`: a one to one mapping for all methods. - - `"method"`: the name of a single method, such as ``fit``, - ``transform``, ``score``, etc. - - Returns - ------- - obj : MethodMapping - A :class:`~sklearn.utils.metadata_routing.MethodMapping` instance - constructed from the given string. - """ - routing = cls() - if route == "one-to-one": - for method in METHODS: - routing.add(callee=method, caller=method) - elif route in METHODS: - routing.add(callee=route, caller=route) - else: - raise ValueError("route should be 'one-to-one' or a single method!") - return routing - - def __repr__(self): - return str(self._serialize()) - - def __str__(self): - return str(repr(self)) - - class MetadataRouter: - """Stores and handles metadata routing for a router object. - - This class is used by router objects to store and handle metadata routing. - Routing information is stored as a dictionary of the form ``{"object_name": - RouteMappingPair(method_mapping, routing_info)}``, where ``method_mapping`` - is an instance of :class:`~sklearn.utils.metadata_routing.MethodMapping` and - ``routing_info`` is either a - :class:`~sklearn.utils.metadata_routing.MetadataRequest` or a - :class:`~sklearn.utils.metadata_routing.MetadataRouter` instance. - - .. versionadded:: 1.3 - - Parameters - ---------- - owner : str - The name of the object to which these requests belong. - """ - - # this is here for us to use this attribute's value instead of doing - # `isinstance`` in our checks, so that we avoid issues when people vendor - # this file instead of using it directly from scikit-learn. - _type = "metadata_router" - - def __init__(self, owner): - self._route_mappings = dict() - # `_self_request` is used if the router is also a consumer. - # _self_request, (added using `add_self_request()`) is treated - # differently from the other objects which are stored in - # _route_mappings. - self._self_request = None - self.owner = owner - - def add_self_request(self, obj): - """Add `self` (as a consumer) to the routing. - - This method is used if the router is also a consumer, and hence the - router itself needs to be included in the routing. The passed object - can be an estimator or a - :class:`~sklearn.utils.metadata_routing.MetadataRequest`. - - A router should add itself using this method instead of `add` since it - should be treated differently than the other objects to which metadata - is routed by the router. - - Parameters - ---------- - obj : object - This is typically the router instance, i.e. `self` in a - ``get_metadata_routing()`` implementation. It can also be a - ``MetadataRequest`` instance. - - Returns - ------- - self : MetadataRouter - Returns `self`. - """ - if getattr(obj, "_type", None) == "metadata_request": - self._self_request = deepcopy(obj) - elif hasattr(obj, "_get_metadata_request"): - self._self_request = deepcopy(obj._get_metadata_request()) - else: - raise ValueError( - "Given `obj` is neither a `MetadataRequest` nor does it implement " - "the required API. Inheriting from `BaseEstimator` implements the " - "required API." - ) - return self - - def add(self, *, method_mapping, **objs): - """Add named objects with their corresponding method mapping. - - Parameters - ---------- - method_mapping : MethodMapping or str - The mapping between the child and the parent's methods. If str, the - output of :func:`~sklearn.utils.metadata_routing.MethodMapping.from_str` - is used. - - **objs : dict - A dictionary of objects from which metadata is extracted by calling - :func:`~sklearn.utils.metadata_routing.get_routing_for_object` on them. - - Returns - ------- - self : MetadataRouter - Returns `self`. - """ - if isinstance(method_mapping, str): - method_mapping = MethodMapping.from_str(method_mapping) - else: - method_mapping = deepcopy(method_mapping) - - for name, obj in objs.items(): - self._route_mappings[name] = RouterMappingPair( - mapping=method_mapping, router=get_routing_for_object(obj) - ) - return self - - def consumes(self, method, params): - """Check whether the given parameters are consumed by the given method. - - .. versionadded:: 1.4 - - Parameters - ---------- - method : str - The name of the method to check. - - params : iterable of str - An iterable of parameters to check. - - Returns - ------- - consumed : set of str - A set of parameters which are consumed by the given method. - """ - res = set() - if self._self_request: - res = res | self._self_request.consumes(method=method, params=params) - - for _, route_mapping in self._route_mappings.items(): - for callee, caller in route_mapping.mapping: - if caller == method: - res = res | route_mapping.router.consumes( - method=callee, params=params - ) - - return res - - def _get_param_names(self, *, method, return_alias, ignore_self_request): - """Get names of all metadata that can be consumed or routed by specified \ - method. - - This method returns the names of all metadata, even the ``False`` - ones. - - Parameters - ---------- - method : str - The name of the method for which metadata names are requested. - - return_alias : bool - Controls whether original or aliased names should be returned, - which only applies to the stored `self`. If no `self` routing - object is stored, this parameter has no effect. - - ignore_self_request : bool - If `self._self_request` should be ignored. This is used in - `_route_params`. If ``True``, ``return_alias`` has no effect. - - Returns - ------- - names : set of str - A set of strings with the names of all parameters. - """ - res = set() - if self._self_request and not ignore_self_request: - res = res.union( - self._self_request._get_param_names( - method=method, return_alias=return_alias - ) - ) - - for name, route_mapping in self._route_mappings.items(): - for callee, caller in route_mapping.mapping: - if caller == method: - res = res.union( - route_mapping.router._get_param_names( - method=callee, - return_alias=True, - ignore_self_request=False, - ) - ) - return res - - def _route_params(self, *, params, method): - """Prepare the given parameters to be passed to the method. - - This is used when a router is used as a child object of another router. - The parent router then passes all parameters understood by the child - object to it and delegates their validation to the child. - - The output of this method can be used directly as the input to the - corresponding method as extra props. - - Parameters - ---------- - method : str - The name of the method for which the parameters are requested and - routed. - - params : dict - A dictionary of provided metadata. - - Returns - ------- - params : Bunch - A :class:`~sklearn.utils.Bunch` of {prop: value} which can be given to - the corresponding method. - """ - res = Bunch() - if self._self_request: - res.update( - self._self_request._route_params(params=params, method=method) - ) - - param_names = self._get_param_names( - method=method, return_alias=True, ignore_self_request=True - ) - child_params = { - key: value for key, value in params.items() if key in param_names - } - for key in set(res.keys()).intersection(child_params.keys()): - # conflicts are okay if the passed objects are the same, but it's - # an issue if they're different objects. - if child_params[key] is not res[key]: - raise ValueError( - f"In {self.owner}, there is a conflict on {key} between what is" - " requested for this estimator and what is requested by its" - " children. You can resolve this conflict by using an alias for" - " the child estimator(s) requested metadata." - ) - - res.update(child_params) - return res - - def route_params(self, *, caller, params): - """Return the input parameters requested by child objects. - - The output of this method is a bunch, which includes the inputs for all - methods of each child object that are used in the router's `caller` - method. - - If the router is also a consumer, it also checks for warnings of - `self`'s/consumer's requested metadata. - - Parameters - ---------- - caller : str - The name of the method for which the parameters are requested and - routed. If called inside the :term:`fit` method of a router, it - would be `"fit"`. - - params : dict - A dictionary of provided metadata. - - Returns - ------- - params : Bunch - A :class:`~sklearn.utils.Bunch` of the form - ``{"object_name": {"method_name": {prop: value}}}`` which can be - used to pass the required metadata to corresponding methods or - corresponding child objects. - """ - if self._self_request: - self._self_request._check_warnings(params=params, method=caller) - - res = Bunch() - for name, route_mapping in self._route_mappings.items(): - router, mapping = route_mapping.router, route_mapping.mapping - - res[name] = Bunch() - for _callee, _caller in mapping: - if _caller == caller: - res[name][_callee] = router._route_params( - params=params, method=_callee - ) - return res - - def validate_metadata(self, *, method, params): - """Validate given metadata for a method. - - This raises a ``TypeError`` if some of the passed metadata are not - understood by child objects. - - Parameters - ---------- - method : str - The name of the method for which the parameters are requested and - routed. If called inside the :term:`fit` method of a router, it - would be `"fit"`. - - params : dict - A dictionary of provided metadata. - """ - param_names = self._get_param_names( - method=method, return_alias=False, ignore_self_request=False - ) - if self._self_request: - self_params = self._self_request._get_param_names( - method=method, return_alias=False - ) - else: - self_params = set() - extra_keys = set(params.keys()) - param_names - self_params - if extra_keys: - raise TypeError( - f"{self.owner}.{method} got unexpected argument(s) {extra_keys}, " - "which are not requested metadata in any object." - ) - - def _serialize(self): - """Serialize the object. - - Returns - ------- - obj : dict - A serialized version of the instance in the form of a dictionary. - """ - res = dict() - if self._self_request: - res["$self_request"] = self._self_request._serialize() - for name, route_mapping in self._route_mappings.items(): - res[name] = dict() - res[name]["mapping"] = route_mapping.mapping._serialize() - res[name]["router"] = route_mapping.router._serialize() - - return res - - def __iter__(self): - if self._self_request: - yield ( - "$self_request", - RouterMappingPair( - mapping=MethodMapping.from_str("one-to-one"), - router=self._self_request, - ), - ) - for name, route_mapping in self._route_mappings.items(): - yield (name, route_mapping) - - def __repr__(self): - return str(self._serialize()) - - def __str__(self): - return str(repr(self)) - - def get_routing_for_object(obj=None): - """Get a ``Metadata{Router, Request}`` instance from the given object. - - This function returns a - :class:`~sklearn.utils.metadata_routing.MetadataRouter` or a - :class:`~sklearn.utils.metadata_routing.MetadataRequest` from the given input. - - This function always returns a copy or an instance constructed from the - input, such that changing the output of this function will not change the - original object. - - .. versionadded:: 1.3 - - Parameters - ---------- - obj : object - - If the object is already a - :class:`~sklearn.utils.metadata_routing.MetadataRequest` or a - :class:`~sklearn.utils.metadata_routing.MetadataRouter`, return a copy - of that. - - If the object provides a `get_metadata_routing` method, return a copy - of the output of that method. - - Returns an empty :class:`~sklearn.utils.metadata_routing.MetadataRequest` - otherwise. - - Returns - ------- - obj : MetadataRequest or MetadataRouting - A ``MetadataRequest`` or a ``MetadataRouting`` taken or created from - the given object. - """ - # doing this instead of a try/except since an AttributeError could be raised - # for other reasons. - if hasattr(obj, "get_metadata_routing"): - return deepcopy(obj.get_metadata_routing()) - - elif getattr(obj, "_type", None) in ["metadata_request", "metadata_router"]: - return deepcopy(obj) - - return MetadataRequest(owner=None) - - # Request method - # ============== - # This section includes what's needed for the request method descriptor and - # their dynamic generation in a meta class. - - # These strings are used to dynamically generate the docstrings for - # set_{method}_request methods. - REQUESTER_DOC = """ Request metadata passed to the ``{method}`` method. - - Note that this method is only relevant if - ``enable_metadata_routing=True`` (see :func:`sklearn.set_config`). - Please see :ref:`User Guide ` on how the routing - mechanism works. - - The options for each parameter are: - - - ``True``: metadata is requested, and \ - passed to ``{method}`` if provided. The request is ignored if \ - metadata is not provided. - - - ``False``: metadata is not requested and the meta-estimator \ - will not pass it to ``{method}``. - - - ``None``: metadata is not requested, and the meta-estimator \ - will raise an error if the user provides it. - - - ``str``: metadata should be passed to the meta-estimator with \ - this given alias instead of the original name. - - The default (``sklearn.utils.metadata_routing.UNCHANGED``) retains the - existing request. This allows you to change the request for some - parameters and not others. - - .. versionadded:: 1.3 - - .. note:: - This method is only relevant if this estimator is used as a - sub-estimator of a meta-estimator, e.g. used inside a - :class:`~sklearn.pipeline.Pipeline`. Otherwise it has no effect. - - Parameters - ---------- - """ - REQUESTER_DOC_PARAM = """ {metadata} : str, True, False, or None, \ - default=sklearn.utils.metadata_routing.UNCHANGED - Metadata routing for ``{metadata}`` parameter in ``{method}``. - - """ - REQUESTER_DOC_RETURN = """ Returns - ------- - self : object - The updated object. - """ - - class RequestMethod: - """ - A descriptor for request methods. - - .. versionadded:: 1.3 - - Parameters - ---------- - name : str - The name of the method for which the request function should be - created, e.g. ``"fit"`` would create a ``set_fit_request`` function. - - keys : list of str - A list of strings which are accepted parameters by the created - function, e.g. ``["sample_weight"]`` if the corresponding method - accepts it as a metadata. - - validate_keys : bool, default=True - Whether to check if the requested parameters fit the actual parameters - of the method. - - Notes - ----- - This class is a descriptor [1]_ and uses PEP-362 to set the signature of - the returned function [2]_. - - References - ---------- - .. [1] https://docs.python.org/3/howto/descriptor.html - - .. [2] https://www.python.org/dev/peps/pep-0362/ - """ - - def __init__(self, name, keys, validate_keys=True): - self.name = name - self.keys = keys - self.validate_keys = validate_keys - - def __get__(self, instance, owner): - # we would want to have a method which accepts only the expected args - def func(*args, **kw): - """Updates the request for provided parameters - - This docstring is overwritten below. - See REQUESTER_DOC for expected functionality - """ - if not _routing_enabled(): - raise RuntimeError( - "This method is only available when metadata routing is " - "enabled. You can enable it using" - " sklearn.set_config(enable_metadata_routing=True)." - ) - - if self.validate_keys and (set(kw) - set(self.keys)): - raise TypeError( - f"Unexpected args: {set(kw) - set(self.keys)}. Accepted " - f"arguments are: {set(self.keys)}" - ) - - # This makes it possible to use the decorated method as an unbound - # method, for instance when monkeypatching. - # https://github.com/scikit-learn/scikit-learn/issues/28632 - if instance is None: - _instance = args[0] - args = args[1:] - else: - _instance = instance - - # Replicating python's behavior when positional args are given other - # than `self`, and `self` is only allowed if this method is unbound. - if args: - raise TypeError( - f"set_{self.name}_request() takes 0 positional argument but" - f" {len(args)} were given" - ) - - requests = _instance._get_metadata_request() - method_metadata_request = getattr(requests, self.name) - - for prop, alias in kw.items(): - if alias is not UNCHANGED: - method_metadata_request.add_request(param=prop, alias=alias) - _instance._metadata_request = requests - - return _instance - - # Now we set the relevant attributes of the function so that it seems - # like a normal method to the end user, with known expected arguments. - func.__name__ = f"set_{self.name}_request" - params = [ - inspect.Parameter( - name="self", - kind=inspect.Parameter.POSITIONAL_OR_KEYWORD, - annotation=owner, - ) - ] - params.extend( - [ - inspect.Parameter( - k, - inspect.Parameter.KEYWORD_ONLY, - default=UNCHANGED, - annotation=Optional[Union[bool, None, str]], - ) - for k in self.keys - ] - ) - func.__signature__ = inspect.Signature( - params, - return_annotation=owner, - ) - doc = REQUESTER_DOC.format(method=self.name) - for metadata in self.keys: - doc += REQUESTER_DOC_PARAM.format(metadata=metadata, method=self.name) - doc += REQUESTER_DOC_RETURN - func.__doc__ = doc - return func - - class _MetadataRequester: - """Mixin class for adding metadata request functionality. - - ``BaseEstimator`` inherits from this Mixin. - - .. versionadded:: 1.3 - """ - - if TYPE_CHECKING: # pragma: no cover - # This code is never run in runtime, but it's here for type checking. - # Type checkers fail to understand that the `set_{method}_request` - # methods are dynamically generated, and they complain that they are - # not defined. We define them here to make type checkers happy. - # During type checking analyzers assume this to be True. - # The following list of defined methods mirrors the list of methods - # in SIMPLE_METHODS. - # fmt: off - def set_fit_request(self, **kwargs): pass - def set_partial_fit_request(self, **kwargs): pass - def set_predict_request(self, **kwargs): pass - def set_predict_proba_request(self, **kwargs): pass - def set_predict_log_proba_request(self, **kwargs): pass - def set_decision_function_request(self, **kwargs): pass - def set_score_request(self, **kwargs): pass - def set_split_request(self, **kwargs): pass - def set_transform_request(self, **kwargs): pass - def set_inverse_transform_request(self, **kwargs): pass - # fmt: on - - def __init_subclass__(cls, **kwargs): - """Set the ``set_{method}_request`` methods. - - This uses PEP-487 [1]_ to set the ``set_{method}_request`` methods. It - looks for the information available in the set default values which are - set using ``__metadata_request__*`` class attributes, or inferred - from method signatures. - - The ``__metadata_request__*`` class attributes are used when a method - does not explicitly accept a metadata through its arguments or if the - developer would like to specify a request value for those metadata - which are different from the default ``None``. - - References - ---------- - .. [1] https://www.python.org/dev/peps/pep-0487 - """ - try: - requests = cls._get_default_requests() - except Exception: - # if there are any issues in the default values, it will be raised - # when ``get_metadata_routing`` is called. Here we are going to - # ignore all the issues such as bad defaults etc. - super().__init_subclass__(**kwargs) - return - - for method in SIMPLE_METHODS: - mmr = getattr(requests, method) - # set ``set_{method}_request``` methods - if not len(mmr.requests): - continue - setattr( - cls, - f"set_{method}_request", - RequestMethod(method, sorted(mmr.requests.keys())), - ) - super().__init_subclass__(**kwargs) - - @classmethod - def _build_request_for_signature(cls, router, method): - """Build the `MethodMetadataRequest` for a method using its signature. - - This method takes all arguments from the method signature and uses - ``None`` as their default request value, except ``X``, ``y``, ``Y``, - ``Xt``, ``yt``, ``*args``, and ``**kwargs``. - - Parameters - ---------- - router : MetadataRequest - The parent object for the created `MethodMetadataRequest`. - method : str - The name of the method. - - Returns - ------- - method_request : MethodMetadataRequest - The prepared request using the method's signature. - """ - mmr = MethodMetadataRequest(owner=cls.__name__, method=method) - # Here we use `isfunction` instead of `ismethod` because calling `getattr` - # on a class instead of an instance returns an unbound function. - if not hasattr(cls, method) or not inspect.isfunction(getattr(cls, method)): - return mmr - # ignore the first parameter of the method, which is usually "self" - params = list(inspect.signature(getattr(cls, method)).parameters.items())[ - 1: - ] - for pname, param in params: - if pname in {"X", "y", "Y", "Xt", "yt"}: - continue - if param.kind in {param.VAR_POSITIONAL, param.VAR_KEYWORD}: - continue - mmr.add_request( - param=pname, - alias=None, - ) - return mmr - - @classmethod - def _get_default_requests(cls): - """Collect default request values. - - This method combines the information present in ``__metadata_request__*`` - class attributes, as well as determining request keys from method - signatures. - """ - requests = MetadataRequest(owner=cls.__name__) - - for method in SIMPLE_METHODS: - setattr( - requests, - method, - cls._build_request_for_signature(router=requests, method=method), - ) - - # Then overwrite those defaults with the ones provided in - # __metadata_request__* attributes. Defaults set in - # __metadata_request__* attributes take precedence over signature - # sniffing. - - # need to go through the MRO since this is a class attribute and - # ``vars`` doesn't report the parent class attributes. We go through - # the reverse of the MRO so that child classes have precedence over - # their parents. - defaults = dict() - for base_class in reversed(inspect.getmro(cls)): - base_defaults = { - attr: value - for attr, value in vars(base_class).items() - if "__metadata_request__" in attr - } - defaults.update(base_defaults) - defaults = dict(sorted(defaults.items())) - - for attr, value in defaults.items(): - # we don't check for attr.startswith() since python prefixes attrs - # starting with __ with the `_ClassName`. - substr = "__metadata_request__" - method = attr[attr.index(substr) + len(substr) :] - for prop, alias in value.items(): - getattr(requests, method).add_request(param=prop, alias=alias) - - return requests - - def _get_metadata_request(self): - """Get requested data properties. - - Please check :ref:`User Guide ` on how the routing - mechanism works. - - Returns - ------- - request : MetadataRequest - A :class:`~sklearn.utils.metadata_routing.MetadataRequest` instance. - """ - if hasattr(self, "_metadata_request"): - requests = get_routing_for_object(self._metadata_request) - else: - requests = self._get_default_requests() - - return requests - - def get_metadata_routing(self): - """Get metadata routing of this object. - - Please check :ref:`User Guide ` on how the routing - mechanism works. - - Returns - ------- - routing : MetadataRequest - A :class:`~sklearn.utils.metadata_routing.MetadataRequest` encapsulating - routing information. - """ - return self._get_metadata_request() - - # Process Routing in Routers - # ========================== - # This is almost always the only method used in routers to process and route - # given metadata. This is to minimize the boilerplate required in routers. - - # Here the first two arguments are positional only which makes everything - # passed as keyword argument a metadata. The first two args also have an `_` - # prefix to reduce the chances of name collisions with the passed metadata, and - # since they're positional only, users will never type those underscores. - def process_routing(_obj, _method, /, **kwargs): - """Validate and route input parameters. - - This function is used inside a router's method, e.g. :term:`fit`, - to validate the metadata and handle the routing. - - Assuming this signature: ``fit(self, X, y, sample_weight=None, **fit_params)``, - a call to this function would be: - ``process_routing(self, sample_weight=sample_weight, **fit_params)``. - - Note that if routing is not enabled and ``kwargs`` is empty, then it - returns an empty routing where ``process_routing(...).ANYTHING.ANY_METHOD`` - is always an empty dictionary. - - .. versionadded:: 1.3 - - Parameters - ---------- - _obj : object - An object implementing ``get_metadata_routing``. Typically a - meta-estimator. - - _method : str - The name of the router's method in which this function is called. - - **kwargs : dict - Metadata to be routed. - - Returns - ------- - routed_params : Bunch - A :class:`~sklearn.utils.Bunch` of the form ``{"object_name": - {"method_name": {prop: value}}}`` which can be used to pass the required - metadata to corresponding methods or corresponding child objects. The object - names are those defined in `obj.get_metadata_routing()`. - """ - if not kwargs: - # If routing is not enabled and kwargs are empty, then we don't have to - # try doing any routing, we can simply return a structure which returns - # an empty dict on routed_params.ANYTHING.ANY_METHOD. - class EmptyRequest: - def get(self, name, default=None): - return Bunch(**{method: dict() for method in METHODS}) - - def __getitem__(self, name): - return Bunch(**{method: dict() for method in METHODS}) - - def __getattr__(self, name): - return Bunch(**{method: dict() for method in METHODS}) - - return EmptyRequest() - - if not ( - hasattr(_obj, "get_metadata_routing") or isinstance(_obj, MetadataRouter) - ): - raise AttributeError( - f"The given object ({repr(_obj.__class__.__name__)}) needs to either" - " implement the routing method `get_metadata_routing` or be a" - " `MetadataRouter` instance." - ) - if _method not in METHODS: - raise TypeError( - f"Can only route and process input on these methods: {METHODS}, " - f"while the passed method is: {_method}." - ) - - request_routing = get_routing_for_object(_obj) - request_routing.validate_metadata(params=kwargs, method=_method) - routed_params = request_routing.route_params(params=kwargs, caller=_method) - - return routed_params - -else: - from sklearn.exceptions import UnsetMetadataPassedError - from sklearn.utils._metadata_requests import ( # type: ignore[no-redef] - COMPOSITE_METHODS, # noqa - METHODS, # noqa - SIMPLE_METHODS, # noqa - UNCHANGED, - UNUSED, - WARN, - MetadataRequest, - MetadataRouter, - MethodMapping, - _MetadataRequester, # noqa - _raise_for_params, # noqa - _raise_for_unsupported_routing, # noqa - _routing_enabled, - _RoutingNotSupportedMixin, # noqa - get_routing_for_object, - process_routing, # noqa - ) diff --git a/imblearn/utils/_param_validation.py b/imblearn/utils/_param_validation.py deleted file mode 100644 index 3ccabf2eb..000000000 --- a/imblearn/utils/_param_validation.py +++ /dev/null @@ -1,934 +0,0 @@ -"""This is a copy of sklearn/utils/_param_validation.py. It can be removed when -we support scikit-learn >= 1.2. -""" -# mypy: ignore-errors -import functools -import math -import operator -import re -from abc import ABC, abstractmethod -from collections.abc import Iterable -from inspect import signature -from numbers import Integral, Real - -import numpy as np -import sklearn -from scipy.sparse import csr_matrix, issparse -from sklearn.utils.fixes import parse_version - -from .._config import config_context, get_config -from ..utils.fixes import _is_arraylike_not_scalar - -sklearn_version = parse_version(sklearn.__version__) - -if sklearn_version < parse_version("1.4"): - - class InvalidParameterError(ValueError, TypeError): - """Custom exception to be raised when the parameter of a class/method/function - does not have a valid type or value. - """ - - # Inherits from ValueError and TypeError to keep backward compatibility. - - def validate_parameter_constraints(parameter_constraints, params, caller_name): - """Validate types and values of given parameters. - - Parameters - ---------- - parameter_constraints : dict or {"no_validation"} - If "no_validation", validation is skipped for this parameter. - - If a dict, it must be a dictionary `param_name: list of constraints`. - A parameter is valid if it satisfies one of the constraints from the list. - Constraints can be: - - an Interval object, representing a continuous or discrete range of numbers - - the string "array-like" - - the string "sparse matrix" - - the string "random_state" - - callable - - None, meaning that None is a valid value for the parameter - - any type, meaning that any instance of this type is valid - - an Options object, representing a set of elements of a given type - - a StrOptions object, representing a set of strings - - the string "boolean" - - the string "verbose" - - the string "cv_object" - - the string "nan" - - a MissingValues object representing markers for missing values - - a HasMethods object, representing method(s) an object must have - - a Hidden object, representing a constraint not meant to be exposed to the - user - - params : dict - A dictionary `param_name: param_value`. The parameters to validate against - the constraints. - - caller_name : str - The name of the estimator or function or method that called this function. - """ - for param_name, param_val in params.items(): - # We allow parameters to not have a constraint so that third party - # estimators can inherit from sklearn estimators without having to - # necessarily use the validation tools. - if param_name not in parameter_constraints: - continue - - constraints = parameter_constraints[param_name] - - if constraints == "no_validation": - continue - - constraints = [make_constraint(constraint) for constraint in constraints] - - for constraint in constraints: - if constraint.is_satisfied_by(param_val): - # this constraint is satisfied, no need to check further. - break - else: - # No constraint is satisfied, raise with an informative message. - - # Ignore constraints that we don't want to expose in the error - # message, i.e. options that are for internal purpose or not - # officially supported. - constraints = [ - constraint for constraint in constraints if not constraint.hidden - ] - - if len(constraints) == 1: - constraints_str = f"{constraints[0]}" - else: - constraints_str = ( - f"{', '.join([str(c) for c in constraints[:-1]])} or" - f" {constraints[-1]}" - ) - - raise InvalidParameterError( - f"The {param_name!r} parameter of {caller_name} must be" - f" {constraints_str}. Got {param_val!r} instead." - ) - - def make_constraint(constraint): - """Convert the constraint into the appropriate Constraint object. - - Parameters - ---------- - constraint : object - The constraint to convert. - - Returns - ------- - constraint : instance of _Constraint - The converted constraint. - """ - if isinstance(constraint, str) and constraint == "array-like": - return _ArrayLikes() - if isinstance(constraint, str) and constraint == "sparse matrix": - return _SparseMatrices() - if isinstance(constraint, str) and constraint == "random_state": - return _RandomStates() - if constraint is callable: - return _Callables() - if constraint is None: - return _NoneConstraint() - if isinstance(constraint, type): - return _InstancesOf(constraint) - if isinstance( - constraint, (Interval, StrOptions, Options, HasMethods, MissingValues) - ): - return constraint - if isinstance(constraint, str) and constraint == "boolean": - return _Booleans() - if isinstance(constraint, str) and constraint == "verbose": - return _VerboseHelper() - if isinstance(constraint, str) and constraint == "cv_object": - return _CVObjects() - if isinstance(constraint, Hidden): - constraint = make_constraint(constraint.constraint) - constraint.hidden = True - return constraint - if isinstance(constraint, str) and constraint == "nan": - return _NanConstraint() - raise ValueError(f"Unknown constraint type: {constraint}") - - def validate_params(parameter_constraints, *, prefer_skip_nested_validation): - """Decorator to validate types and values of functions and methods. - - Parameters - ---------- - parameter_constraints : dict - A dictionary `param_name: list of constraints`. See the docstring of - `validate_parameter_constraints` for a description of the accepted - constraints. - - Note that the *args and **kwargs parameters are not validated and must not - be present in the parameter_constraints dictionary. - - prefer_skip_nested_validation : bool - If True, the validation of parameters of inner estimators or functions - called by the decorated function will be skipped. - - This is useful to avoid validating many times the parameters passed by the - user from the public facing API. It's also useful to avoid validating - parameters that we pass internally to inner functions that are guaranteed to - be valid by the test suite. - - It should be set to True for most functions, except for those that receive - non-validated objects as parameters or that are just wrappers around classes - because they only perform a partial validation. - - Returns - ------- - decorated_function : function or method - The decorated function. - """ - - def decorator(func): - # The dict of parameter constraints is set as an attribute of the function - # to make it possible to dynamically introspect the constraints for - # automatic testing. - setattr(func, "_skl_parameter_constraints", parameter_constraints) - - @functools.wraps(func) - def wrapper(*args, **kwargs): - global_skip_validation = get_config()["skip_parameter_validation"] - if global_skip_validation: - return func(*args, **kwargs) - - func_sig = signature(func) - - # Map *args/**kwargs to the function signature - params = func_sig.bind(*args, **kwargs) - params.apply_defaults() - - # ignore self/cls and positional/keyword markers - to_ignore = [ - p.name - for p in func_sig.parameters.values() - if p.kind in (p.VAR_POSITIONAL, p.VAR_KEYWORD) - ] - to_ignore += ["self", "cls"] - params = { - k: v for k, v in params.arguments.items() if k not in to_ignore - } - - validate_parameter_constraints( - parameter_constraints, params, caller_name=func.__qualname__ - ) - - try: - with config_context( - skip_parameter_validation=( - prefer_skip_nested_validation or global_skip_validation - ) - ): - return func(*args, **kwargs) - except InvalidParameterError as e: - # When the function is just a wrapper around an estimator, we allow - # the function to delegate validation to the estimator, but we - # replace the name of the estimator by the name of the function in - # the error message to avoid confusion. - msg = re.sub( - r"parameter of \w+ must be", - f"parameter of {func.__qualname__} must be", - str(e), - ) - raise InvalidParameterError(msg) from e - - return wrapper - - return decorator - - class RealNotInt(Real): - """A type that represents reals that are not instances of int. - - Behaves like float, but also works with values extracted from numpy arrays. - isintance(1, RealNotInt) -> False - isinstance(1.0, RealNotInt) -> True - """ - - RealNotInt.register(float) - - def _type_name(t): - """Convert type into human readable string.""" - module = t.__module__ - qualname = t.__qualname__ - if module == "builtins": - return qualname - elif t == Real: - return "float" - elif t == Integral: - return "int" - return f"{module}.{qualname}" - - class _Constraint(ABC): - """Base class for the constraint objects.""" - - def __init__(self): - self.hidden = False - - @abstractmethod - def is_satisfied_by(self, val): - """Whether or not a value satisfies the constraint. - - Parameters - ---------- - val : object - The value to check. - - Returns - ------- - is_satisfied : bool - Whether or not the constraint is satisfied by this value. - """ - - @abstractmethod - def __str__(self): - """A human readable representational string of the constraint.""" - - class _InstancesOf(_Constraint): - """Constraint representing instances of a given type. - - Parameters - ---------- - type : type - The valid type. - """ - - def __init__(self, type): - super().__init__() - self.type = type - - def is_satisfied_by(self, val): - return isinstance(val, self.type) - - def __str__(self): - return f"an instance of {_type_name(self.type)!r}" - - class _NoneConstraint(_Constraint): - """Constraint representing the None singleton.""" - - def is_satisfied_by(self, val): - return val is None - - def __str__(self): - return "None" - - class _NanConstraint(_Constraint): - """Constraint representing the indicator `np.nan`.""" - - def is_satisfied_by(self, val): - return ( - not isinstance(val, Integral) - and isinstance(val, Real) - and math.isnan(val) - ) - - def __str__(self): - return "numpy.nan" - - class _PandasNAConstraint(_Constraint): - """Constraint representing the indicator `pd.NA`.""" - - def is_satisfied_by(self, val): - try: - import pandas as pd - - return isinstance(val, type(pd.NA)) and pd.isna(val) - except ImportError: - return False - - def __str__(self): - return "pandas.NA" - - class Options(_Constraint): - """Constraint representing a finite set of instances of a given type. - - Parameters - ---------- - type : type - - options : set - The set of valid scalars. - - deprecated : set or None, default=None - A subset of the `options` to mark as deprecated in the string - representation of the constraint. - """ - - def __init__(self, type, options, *, deprecated=None): - super().__init__() - self.type = type - self.options = options - self.deprecated = deprecated or set() - - if self.deprecated - self.options: - raise ValueError( - "The deprecated options must be a subset of the options." - ) - - def is_satisfied_by(self, val): - return isinstance(val, self.type) and val in self.options - - def _mark_if_deprecated(self, option): - """Add a deprecated mark to an option if needed.""" - option_str = f"{option!r}" - if option in self.deprecated: - option_str = f"{option_str} (deprecated)" - return option_str - - def __str__(self): - options_str = ( - f"{', '.join([self._mark_if_deprecated(o) for o in self.options])}" - ) - return f"a {_type_name(self.type)} among {{{options_str}}}" - - class StrOptions(Options): - """Constraint representing a finite set of strings. - - Parameters - ---------- - options : set of str - The set of valid strings. - - deprecated : set of str or None, default=None - A subset of the `options` to mark as deprecated in the string - representation of the constraint. - """ - - def __init__(self, options, *, deprecated=None): - super().__init__(type=str, options=options, deprecated=deprecated) - - class Interval(_Constraint): - """Constraint representing a typed interval. - - Parameters - ---------- - type : {numbers.Integral, numbers.Real, RealNotInt} - The set of numbers in which to set the interval. - - If RealNotInt, only reals that don't have the integer type - are allowed. For example 1.0 is allowed but 1 is not. - - left : float or int or None - The left bound of the interval. None means left bound is -∞. - - right : float, int or None - The right bound of the interval. None means right bound is +∞. - - closed : {"left", "right", "both", "neither"} - Whether the interval is open or closed. Possible choices are: - - - `"left"`: the interval is closed on the left and open on the right. - It is equivalent to the interval `[ left, right )`. - - `"right"`: the interval is closed on the right and open on the left. - It is equivalent to the interval `( left, right ]`. - - `"both"`: the interval is closed. - It is equivalent to the interval `[ left, right ]`. - - `"neither"`: the interval is open. - It is equivalent to the interval `( left, right )`. - - Notes - ----- - Setting a bound to `None` and setting the interval closed is valid. For - instance, strictly speaking, `Interval(Real, 0, None, closed="both")` - corresponds to `[0, +∞) U {+∞}`. - """ - - def __init__(self, type, left, right, *, closed): - super().__init__() - self.type = type - self.left = left - self.right = right - self.closed = closed - - self._check_params() - - def _check_params(self): - if self.type not in (Integral, Real, RealNotInt): - raise ValueError( - "type must be either numbers.Integral, numbers.Real or RealNotInt." - f" Got {self.type} instead." - ) - - if self.closed not in ("left", "right", "both", "neither"): - raise ValueError( - "closed must be either 'left', 'right', 'both' or 'neither'. " - f"Got {self.closed} instead." - ) - - if self.type is Integral: - suffix = "for an interval over the integers." - if self.left is not None and not isinstance(self.left, Integral): - raise TypeError(f"Expecting left to be an int {suffix}") - if self.right is not None and not isinstance(self.right, Integral): - raise TypeError(f"Expecting right to be an int {suffix}") - if self.left is None and self.closed in ("left", "both"): - raise ValueError( - f"left can't be None when closed == {self.closed} {suffix}" - ) - if self.right is None and self.closed in ("right", "both"): - raise ValueError( - f"right can't be None when closed == {self.closed} {suffix}" - ) - else: - if self.left is not None and not isinstance(self.left, Real): - raise TypeError("Expecting left to be a real number.") - if self.right is not None and not isinstance(self.right, Real): - raise TypeError("Expecting right to be a real number.") - - if ( - self.right is not None - and self.left is not None - and self.right <= self.left - ): - raise ValueError( - f"right can't be less than left. Got left={self.left} and " - f"right={self.right}" - ) - - def __contains__(self, val): - if not isinstance(val, Integral) and np.isnan(val): - return False - - left_cmp = operator.lt if self.closed in ("left", "both") else operator.le - right_cmp = operator.gt if self.closed in ("right", "both") else operator.ge - - left = -np.inf if self.left is None else self.left - right = np.inf if self.right is None else self.right - - if left_cmp(val, left): - return False - if right_cmp(val, right): - return False - return True - - def is_satisfied_by(self, val): - if not isinstance(val, self.type): - return False - - return val in self - - def __str__(self): - type_str = "an int" if self.type is Integral else "a float" - left_bracket = "[" if self.closed in ("left", "both") else "(" - left_bound = "-inf" if self.left is None else self.left - right_bound = "inf" if self.right is None else self.right - right_bracket = "]" if self.closed in ("right", "both") else ")" - - # better repr if the bounds were given as integers - if not self.type == Integral and isinstance(self.left, Real): - left_bound = float(left_bound) - if not self.type == Integral and isinstance(self.right, Real): - right_bound = float(right_bound) - - return ( - f"{type_str} in the range " - f"{left_bracket}{left_bound}, {right_bound}{right_bracket}" - ) - - class _ArrayLikes(_Constraint): - """Constraint representing array-likes""" - - def is_satisfied_by(self, val): - return _is_arraylike_not_scalar(val) - - def __str__(self): - return "an array-like" - - class _SparseMatrices(_Constraint): - """Constraint representing sparse matrices.""" - - def is_satisfied_by(self, val): - return issparse(val) - - def __str__(self): - return "a sparse matrix" - - class _Callables(_Constraint): - """Constraint representing callables.""" - - def is_satisfied_by(self, val): - return callable(val) - - def __str__(self): - return "a callable" - - class _RandomStates(_Constraint): - """Constraint representing random states. - - Convenience class for - [Interval(Integral, 0, 2**32 - 1, closed="both"), np.random.RandomState, None] - """ - - def __init__(self): - super().__init__() - self._constraints = [ - Interval(Integral, 0, 2**32 - 1, closed="both"), - _InstancesOf(np.random.RandomState), - _NoneConstraint(), - ] - - def is_satisfied_by(self, val): - return any(c.is_satisfied_by(val) for c in self._constraints) - - def __str__(self): - return ( - f"{', '.join([str(c) for c in self._constraints[:-1]])} or" - f" {self._constraints[-1]}" - ) - - class _Booleans(_Constraint): - """Constraint representing boolean likes. - - Convenience class for - [bool, np.bool_, Integral (deprecated)] - """ - - def __init__(self): - super().__init__() - self._constraints = [ - _InstancesOf(bool), - _InstancesOf(np.bool_), - ] - - def is_satisfied_by(self, val): - return any(c.is_satisfied_by(val) for c in self._constraints) - - def __str__(self): - return ( - f"{', '.join([str(c) for c in self._constraints[:-1]])} or" - f" {self._constraints[-1]}" - ) - - class _VerboseHelper(_Constraint): - """Helper constraint for the verbose parameter. - - Convenience class for - [Interval(Integral, 0, None, closed="left"), bool, numpy.bool_] - """ - - def __init__(self): - super().__init__() - self._constraints = [ - Interval(Integral, 0, None, closed="left"), - _InstancesOf(bool), - _InstancesOf(np.bool_), - ] - - def is_satisfied_by(self, val): - return any(c.is_satisfied_by(val) for c in self._constraints) - - def __str__(self): - return ( - f"{', '.join([str(c) for c in self._constraints[:-1]])} or" - f" {self._constraints[-1]}" - ) - - class MissingValues(_Constraint): - """Helper constraint for the `missing_values` parameters. - - Convenience for - [ - Integral, - Interval(Real, None, None, closed="both"), - str, # when numeric_only is False - None, # when numeric_only is False - _NanConstraint(), - _PandasNAConstraint(), - ] - - Parameters - ---------- - numeric_only : bool, default=False - Whether to consider only numeric missing value markers. - - """ - - def __init__(self, numeric_only=False): - super().__init__() - - self.numeric_only = numeric_only - - self._constraints = [ - _InstancesOf(Integral), - # we use an interval of Real to ignore np.nan that has its own - # constraint - Interval(Real, None, None, closed="both"), - _NanConstraint(), - _PandasNAConstraint(), - ] - if not self.numeric_only: - self._constraints.extend([_InstancesOf(str), _NoneConstraint()]) - - def is_satisfied_by(self, val): - return any(c.is_satisfied_by(val) for c in self._constraints) - - def __str__(self): - return ( - f"{', '.join([str(c) for c in self._constraints[:-1]])} or" - f" {self._constraints[-1]}" - ) - - class HasMethods(_Constraint): - """Constraint representing objects that expose specific methods. - - It is useful for parameters following a protocol and where we don't want to - impose an affiliation to a specific module or class. - - Parameters - ---------- - methods : str or list of str - The method(s) that the object is expected to expose. - """ - - @validate_params( - {"methods": [str, list]}, - prefer_skip_nested_validation=True, - ) - def __init__(self, methods): - super().__init__() - if isinstance(methods, str): - methods = [methods] - self.methods = methods - - def is_satisfied_by(self, val): - return all(callable(getattr(val, method, None)) for method in self.methods) - - def __str__(self): - if len(self.methods) == 1: - methods = f"{self.methods[0]!r}" - else: - methods = ( - f"{', '.join([repr(m) for m in self.methods[:-1]])} and" - f" {self.methods[-1]!r}" - ) - return f"an object implementing {methods}" - - class _IterablesNotString(_Constraint): - """Constraint representing iterables that are not strings.""" - - def is_satisfied_by(self, val): - return isinstance(val, Iterable) and not isinstance(val, str) - - def __str__(self): - return "an iterable" - - class _CVObjects(_Constraint): - """Constraint representing cv objects. - - Convenient class for - [ - Interval(Integral, 2, None, closed="left"), - HasMethods(["split", "get_n_splits"]), - _IterablesNotString(), - None, - ] - """ - - def __init__(self): - super().__init__() - self._constraints = [ - Interval(Integral, 2, None, closed="left"), - HasMethods(["split", "get_n_splits"]), - _IterablesNotString(), - _NoneConstraint(), - ] - - def is_satisfied_by(self, val): - return any(c.is_satisfied_by(val) for c in self._constraints) - - def __str__(self): - return ( - f"{', '.join([str(c) for c in self._constraints[:-1]])} or" - f" {self._constraints[-1]}" - ) - - class Hidden: - """Class encapsulating a constraint not meant to be exposed to the user. - - Parameters - ---------- - constraint : str or _Constraint instance - The constraint to be used internally. - """ - - def __init__(self, constraint): - self.constraint = constraint - - def generate_invalid_param_val(constraint): - """Return a value that does not satisfy the constraint. - - Raises a NotImplementedError if there exists no invalid value for this - constraint. - - This is only useful for testing purpose. - - Parameters - ---------- - constraint : _Constraint instance - The constraint to generate a value for. - - Returns - ------- - val : object - A value that does not satisfy the constraint. - """ - if isinstance(constraint, StrOptions): - return f"not {' or '.join(constraint.options)}" - - if isinstance(constraint, MissingValues): - return np.array([1, 2, 3]) - - if isinstance(constraint, _VerboseHelper): - return -1 - - if isinstance(constraint, HasMethods): - return type("HasNotMethods", (), {})() - - if isinstance(constraint, _IterablesNotString): - return "a string" - - if isinstance(constraint, _CVObjects): - return "not a cv object" - - if isinstance(constraint, Interval) and constraint.type is Integral: - if constraint.left is not None: - return constraint.left - 1 - if constraint.right is not None: - return constraint.right + 1 - - # There's no integer outside (-inf, +inf) - raise NotImplementedError - - if isinstance(constraint, Interval) and constraint.type in (Real, RealNotInt): - if constraint.left is not None: - return constraint.left - 1e-6 - if constraint.right is not None: - return constraint.right + 1e-6 - - # bounds are -inf, +inf - if constraint.closed in ("right", "neither"): - return -np.inf - if constraint.closed in ("left", "neither"): - return np.inf - - # interval is [-inf, +inf] - return np.nan - - raise NotImplementedError - - def generate_valid_param(constraint): - """Return a value that does satisfy a constraint. - - This is only useful for testing purpose. - - Parameters - ---------- - constraint : Constraint instance - The constraint to generate a value for. - - Returns - ------- - val : object - A value that does satisfy the constraint. - """ - if isinstance(constraint, _ArrayLikes): - return np.array([1, 2, 3]) - - if isinstance(constraint, _SparseMatrices): - return csr_matrix([[0, 1], [1, 0]]) - - if isinstance(constraint, _RandomStates): - return np.random.RandomState(42) - - if isinstance(constraint, _Callables): - return lambda x: x - - if isinstance(constraint, _NoneConstraint): - return None - - if isinstance(constraint, _InstancesOf): - if constraint.type is np.ndarray: - # special case for ndarray since it can't be instantiated without - # arguments - return np.array([1, 2, 3]) - - if constraint.type in (Integral, Real): - # special case for Integral and Real since they are abstract classes - return 1 - - return constraint.type() - - if isinstance(constraint, _Booleans): - return True - - if isinstance(constraint, _VerboseHelper): - return 1 - - if isinstance(constraint, MissingValues) and constraint.numeric_only: - return np.nan - - if isinstance(constraint, MissingValues) and not constraint.numeric_only: - return "missing" - - if isinstance(constraint, HasMethods): - return type( - "ValidHasMethods", - (), - {m: lambda self: None for m in constraint.methods}, - )() - - if isinstance(constraint, _IterablesNotString): - return [1, 2, 3] - - if isinstance(constraint, _CVObjects): - return 5 - - if isinstance(constraint, Options): # includes StrOptions - for option in constraint.options: - return option - - if isinstance(constraint, Interval): - interval = constraint - if interval.left is None and interval.right is None: - return 0 - elif interval.left is None: - return interval.right - 1 - elif interval.right is None: - return interval.left + 1 - else: - if interval.type is Real: - return (interval.left + interval.right) / 2 - else: - return interval.left + 1 - - raise ValueError(f"Unknown constraint type: {constraint}") - -else: - from sklearn.utils._param_validation import generate_invalid_param_val # noqa - from sklearn.utils._param_validation import generate_valid_param # noqa - from sklearn.utils._param_validation import validate_parameter_constraints # noqa - from sklearn.utils._param_validation import ( - HasMethods, - Hidden, - Interval, - InvalidParameterError, - MissingValues, - Options, - RealNotInt, - StrOptions, - _ArrayLikes, - _Booleans, - _Callables, - _CVObjects, - _InstancesOf, - _IterablesNotString, - _NanConstraint, - _NoneConstraint, - _PandasNAConstraint, - _RandomStates, - _SparseMatrices, - _VerboseHelper, - make_constraint, - validate_params, - ) diff --git a/imblearn/utils/_sklearn_compat.py b/imblearn/utils/_sklearn_compat.py new file mode 100644 index 000000000..4828a9a6a --- /dev/null +++ b/imblearn/utils/_sklearn_compat.py @@ -0,0 +1,830 @@ +"""Ease developer experience to support multiple versions of scikit-learn. + +This file is intended to be vendored in your project if you do not want to depend on +`sklearn-compat` as a package. Then, you can import directly from this file. + +Be aware that depending on `sklearn-compat` does not add any additional dependencies: +we are only depending on `scikit-learn`. + +Version: 0.1.1 +""" + +from __future__ import annotations + +import functools +import inspect +import platform +import sys +import types +from dataclasses import dataclass, field +from typing import Callable, Literal + +import sklearn +from sklearn.utils.fixes import parse_version + +sklearn_version = parse_version(parse_version(sklearn.__version__).base_version) + + +######################################################################################## +# The following code does not depend on the sklearn version +######################################################################################## + + +# tags infrastructure +def _dataclass_args(): + if sys.version_info < (3, 10): + return {} + return {"slots": True} + + +def get_tags(estimator): + """Get estimator tags in a consistent format across different sklearn versions. + + This function provides compatibility between sklearn versions before and after 1.6. + It returns either a Tags object (sklearn >= 1.6) or a converted Tags object from + the dictionary format (sklearn < 1.6) containing metadata about the estimator's + requirements and capabilities. + + Parameters + ---------- + estimator : estimator object + A scikit-learn estimator instance. + + Returns + ------- + tags : Tags + An object containing metadata about the estimator's requirements and + capabilities (e.g., input types, fitting requirements, classifier/regressor + specific tags). + """ + try: + from sklearn.utils._tags import get_tags + + return get_tags(estimator) + except ImportError: + from sklearn.utils._tags import _safe_tags + + return _to_new_tags(_safe_tags(estimator), estimator) + + +def _to_new_tags(old_tags, estimator=None): + """Utility function convert old tags (dictionary) to new tags (dataclass).""" + input_tags = InputTags( + one_d_array="1darray" in old_tags["X_types"], + two_d_array="2darray" in old_tags["X_types"], + three_d_array="3darray" in old_tags["X_types"], + sparse="sparse" in old_tags["X_types"], + categorical="categorical" in old_tags["X_types"], + string="string" in old_tags["X_types"], + dict="dict" in old_tags["X_types"], + positive_only=old_tags["requires_positive_X"], + allow_nan=old_tags["allow_nan"], + pairwise=old_tags["pairwise"], + dataframe="dataframe" in old_tags["X_types"], + ) + target_tags = TargetTags( + required=old_tags["requires_y"], + one_d_labels="1dlabels" in old_tags["X_types"], + two_d_labels="2dlabels" in old_tags["X_types"], + positive_only=old_tags["requires_positive_y"], + multi_output=old_tags["multioutput"] or old_tags["multioutput_only"], + single_output=not old_tags["multioutput_only"], + ) + if estimator is not None and ( + hasattr(estimator, "transform") or hasattr(estimator, "fit_transform") + ): + transformer_tags = TransformerTags( + preserves_dtype=old_tags["preserves_dtype"], + ) + else: + transformer_tags = None + estimator_type = getattr(estimator, "_estimator_type", None) + if estimator_type == "classifier": + classifier_tags = ClassifierTags( + poor_score=old_tags["poor_score"], + multi_class=not old_tags["binary_only"], + multi_label=old_tags["multilabel"], + ) + else: + classifier_tags = None + if estimator_type == "regressor": + regressor_tags = RegressorTags( + poor_score=old_tags["poor_score"], + multi_label=old_tags["multilabel"], + ) + else: + regressor_tags = None + + if estimator_type == "sampler": + sampler_tags = SamplerTags( + sample_indices=old_tags.get("sample_indices", False), + ) + else: + sampler_tags = None + + return Tags( + estimator_type=estimator_type, + target_tags=target_tags, + transformer_tags=transformer_tags, + classifier_tags=classifier_tags, + regressor_tags=regressor_tags, + sampler_tags=sampler_tags, + input_tags=input_tags, + # Array-API was introduced in 1.3, we need to default to False if not inside + # the old-tags. + array_api_support=old_tags.get("array_api_support", False), + no_validation=old_tags["no_validation"], + non_deterministic=old_tags["non_deterministic"], + requires_fit=old_tags["requires_fit"], + _skip_test=old_tags["_skip_test"], + ) + + +######################################################################################## +# Upgrading for scikit-learn 1.3 +######################################################################################## + +if sklearn_version < parse_version("1.3"): + # parameter validation + def _fit_context(*, prefer_skip_nested_validation): + """Decorator to run the fit methods of estimators within context managers.""" + + def decorator(fit_method): + @functools.wraps(fit_method) + def wrapper(estimator, *args, **kwargs): + estimator._validate_params() + return fit_method(estimator, *args, **kwargs) + + return wrapper + + return decorator + + def validate_params(parameter_constraints, *, prefer_skip_nested_validation): + """Validate the parameters of an estimator.""" + from sklearn.utils._param_validation import validate_params + + return validate_params(parameter_constraints) + +else: + # parameter validation + + from sklearn.base import _fit_context # noqa: F401 + from sklearn.utils._param_validation import validate_params # noqa: F401 + + +######################################################################################## +# Upgrading for scikit-learn 1.4 +######################################################################################## + + +if sklearn_version < parse_version("1.4"): + + def _is_fitted(estimator, attributes=None, all_or_any=all): + """Determine if an estimator is fitted + + Parameters + ---------- + estimator : estimator instance + Estimator instance for which the check is performed. + + attributes : str, list or tuple of str, default=None + Attribute name(s) given as string or a list/tuple of strings + Eg.: ``["coef_", "estimator_", ...], "coef_"`` + + If `None`, `estimator` is considered fitted if there exist an + attribute that ends with a underscore and does not start with double + underscore. + + all_or_any : callable, {all, any}, default=all + Specify whether all or any of the given attributes must exist. + + Returns + ------- + fitted : bool + Whether the estimator is fitted. + """ + if attributes is not None: + if not isinstance(attributes, (list, tuple)): + attributes = [attributes] + return all_or_any([hasattr(estimator, attr) for attr in attributes]) + + if hasattr(estimator, "__sklearn_is_fitted__"): + return estimator.__sklearn_is_fitted__() + + fitted_attrs = [ + v for v in vars(estimator) if v.endswith("_") and not v.startswith("__") + ] + return len(fitted_attrs) > 0 + + def process_routing(_obj, _method, /, **kwargs): + """Validate and route input parameters.""" + from sklearn.utils._metadata_requests import process_routing + + return process_routing(_obj, _method, other_params=None, **kwargs) + + def _raise_for_params(params, owner, method): + """Raise an error if metadata routing is not enabled and params are passed.""" + from sklearn.utils._metadata_requests import _routing_enabled + + caller = ( + f"{owner.__class__.__name__}.{method}" + if method + else owner.__class__.__name__ + ) + if not _routing_enabled() and params: + raise ValueError( + f"Passing extra keyword arguments to {caller} is only supported if" + " enable_metadata_routing=True, which you can set using" + " `sklearn.set_config`. See the User Guide" + " for more" + f" details. Extra parameters passed are: {set(params)}" + ) + + def _is_pandas_df(X): + """Return True if the X is a pandas dataframe.""" + try: + pd = sys.modules["pandas"] + except KeyError: + return False + return isinstance(X, pd.DataFrame) + +else: + from sklearn.utils.metadata_routing import ( + _raise_for_params, # noqa: F401 + process_routing, # noqa: F401 + ) + from sklearn.utils.validation import ( + _is_fitted, # noqa: F401 + _is_pandas_df, # noqa: F401 + ) + + +######################################################################################## +# Upgrading for scikit-learn 1.5 +######################################################################################## + + +if sklearn_version < parse_version("1.5"): + # chunking + # extmath + # fixes + from sklearn.utils import ( + _IS_32BIT, # noqa: F401 + _approximate_mode, # noqa: F401 + _in_unstable_openblas_configuration, # noqa: F401 + gen_batches, # noqa: F401 + gen_even_slices, # noqa: F401 + get_chunk_n_rows, # noqa: F401 + safe_sqr, # noqa: F401 + ) + from sklearn.utils import _chunk_generator as chunk_generator # noqa: F401 + + _IS_WASM = platform.machine() in ["wasm32", "wasm64"] + # indexing + # mask + # missing + # optional dependencies + # user interface + # validation + from sklearn.utils import ( + _determine_key_type, # noqa: F401 + _get_column_indices, # noqa: F401 + _print_elapsed_time, # noqa: F401 + _safe_assign, # noqa: F401 + _safe_indexing, # noqa: F401 + _to_object_array, # noqa: F401 + axis0_safe_slice, # noqa: F401 + check_matplotlib_support, # noqa: F401 + check_pandas_support, # noqa: F401 + indices_to_mask, # noqa: F401 + is_scalar_nan, # noqa: F401 + resample, # noqa: F401 + safe_mask, # noqa: F401 + shuffle, # noqa: F401 + ) + from sklearn.utils import _is_pandas_na as is_pandas_na # noqa: F401 +else: + # chunking + from sklearn.utils._chunking import ( + chunk_generator, # noqa: F401 + gen_batches, # noqa: F401 + gen_even_slices, # noqa: F401 + get_chunk_n_rows, # noqa: F401 + ) + + # indexing + from sklearn.utils._indexing import ( + _determine_key_type, # noqa: F401 + _get_column_indices, # noqa: F401 + _safe_assign, # noqa: F401 + _safe_indexing, # noqa: F401 + resample, # noqa: F401 + shuffle, # noqa: F401 + ) + + # mask + from sklearn.utils._mask import ( + axis0_safe_slice, # noqa: F401 + indices_to_mask, # noqa: F401 + safe_mask, # noqa: F401 + ) + + # missing + from sklearn.utils._missing import ( + is_pandas_na, # noqa: F401 + is_scalar_nan, # noqa: F401 + ) + + # optional dependencies + from sklearn.utils._optional_dependencies import ( # noqa: F401 + check_matplotlib_support, + check_pandas_support, # noqa: F401 + ) + + # user interface + from sklearn.utils._user_interface import _print_elapsed_time # noqa: F401 + + # extmath + from sklearn.utils.extmath import ( + _approximate_mode, # noqa: F401 + safe_sqr, # noqa: F401 + ) + + # fixes + from sklearn.utils.fixes import ( + _IS_32BIT, # noqa: F401 + _IS_WASM, # noqa: F401 + _in_unstable_openblas_configuration, # noqa: F401 + ) + + # validation + from sklearn.utils.validation import _to_object_array # noqa: F401 + +######################################################################################## +# Upgrading for scikit-learn 1.6 +######################################################################################## + + +if sklearn_version < parse_version("1.6"): + # test_common + from sklearn.utils.estimator_checks import _construct_instance + + def type_of_target(y, input_name="", *, raise_unknown=False): + # fix for raise_unknown which is introduced in scikit-learn 1.6 + from sklearn.utils.multiclass import type_of_target + + def _raise_or_return(target_type): + """Depending on the value of raise_unknown, either raise an error or + return 'unknown'. + """ + if raise_unknown and target_type == "unknown": + input = input_name if input_name else "data" + raise ValueError(f"Unknown label type for {input}: {y!r}") + else: + return target_type + + target_type = type_of_target(y, input_name=input_name) + return _raise_or_return(target_type) + + def _construct_instances(Estimator): + yield _construct_instance(Estimator) + + # validation + def validate_data( + _estimator, + /, + X="no_validation", + y="no_validation", + reset=True, + validate_separately=False, + skip_check_array=False, + **kwargs, + ): + """Validate input data and set or check feature names and counts of the input. + + See the original scikit-learn documentation: + https://scikit-learn.org/stable/modules/generated/sklearn.utils.validation.validate_data.html#sklearn.utils.validation.validate_data + """ + if skip_check_array: + _check_n_features(_estimator, X, reset=reset) + _check_feature_names(_estimator, X, reset=reset) + + no_val_X = isinstance(X, str) and X == "no_validation" + no_val_y = y is None or isinstance(y, str) and y == "no_validation" + if not no_val_X and no_val_y: + out = X + elif no_val_X and not no_val_y: + out = y + else: + out = X, y + return out + else: + if "ensure_all_finite" in kwargs: + force_all_finite = kwargs.pop("ensure_all_finite") + else: + force_all_finite = True + return _estimator._validate_data( + X=X, + y=y, + reset=reset, + validate_separately=validate_separately, + force_all_finite=force_all_finite, + **kwargs, + ) + + def _check_n_features(estimator, X, *, reset): + """Set the `n_features_in_` attribute, or check against it on an estimator.""" + return estimator._check_n_features(X, reset=reset) + + def _check_feature_names(estimator, X, *, reset): + """Check `input_features` and generate names if needed.""" + return estimator._check_feature_names(X, reset=reset) + + def check_array( + array, + accept_sparse=False, + *, + accept_large_sparse=True, + dtype="numeric", + order=None, + copy=False, + force_writeable=False, + ensure_all_finite=None, + ensure_non_negative=False, + ensure_2d=True, + allow_nd=False, + ensure_min_samples=1, + ensure_min_features=1, + estimator=None, + input_name="", + ): + """Input validation on an array, list, sparse matrix or similar. + + Check the original documentation for more details: + https://scikit-learn.org/stable/modules/generated/sklearn.utils.check_array.html + """ + from sklearn.utils.validation import check_array as _check_array + + if ensure_all_finite is not None: + force_all_finite = ensure_all_finite + else: + force_all_finite = True + + check_array_params = inspect.signature(_check_array).parameters + kwargs = {} + if "force_writeable" in check_array_params: + kwargs["force_writeable"] = force_writeable + if "ensure_non_negative" in check_array_params: + kwargs["ensure_non_negative"] = ensure_non_negative + + return _check_array( + array, + accept_sparse=accept_sparse, + accept_large_sparse=accept_large_sparse, + dtype=dtype, + order=order, + copy=copy, + force_all_finite=force_all_finite, + ensure_2d=ensure_2d, + allow_nd=allow_nd, + ensure_min_samples=ensure_min_samples, + ensure_min_features=ensure_min_features, + estimator=estimator, + input_name=input_name, + **kwargs, + ) + + # tags infrastructure + @dataclass(**_dataclass_args()) + class InputTags: + """Tags for the input data. + + Parameters + ---------- + one_d_array : bool, default=False + Whether the input can be a 1D array. + + two_d_array : bool, default=True + Whether the input can be a 2D array. Note that most common + tests currently run only if this flag is set to ``True``. + + three_d_array : bool, default=False + Whether the input can be a 3D array. + + sparse : bool, default=False + Whether the input can be a sparse matrix. + + categorical : bool, default=False + Whether the input can be categorical. + + string : bool, default=False + Whether the input can be an array-like of strings. + + dict : bool, default=False + Whether the input can be a dictionary. + + positive_only : bool, default=False + Whether the estimator requires positive X. + + allow_nan : bool, default=False + Whether the estimator supports data with missing values encoded as `np.nan`. + + pairwise : bool, default=False + This boolean attribute indicates whether the data (`X`), + :term:`fit` and similar methods consists of pairwise measures + over samples rather than a feature representation for each + sample. It is usually `True` where an estimator has a + `metric` or `affinity` or `kernel` parameter with value + 'precomputed'. Its primary purpose is to support a + :term:`meta-estimator` or a cross validation procedure that + extracts a sub-sample of data intended for a pairwise + estimator, where the data needs to be indexed on both axes. + Specifically, this tag is used by + `sklearn.utils.metaestimators._safe_split` to slice rows and + columns. + """ + + one_d_array: bool = False + two_d_array: bool = True + three_d_array: bool = False + sparse: bool = False + categorical: bool = False + string: bool = False + dict: bool = False + positive_only: bool = False + allow_nan: bool = False + pairwise: bool = False + dataframe: bool = False + + @dataclass(**_dataclass_args()) + class TargetTags: + """Tags for the target data. + + Parameters + ---------- + required : bool + Whether the estimator requires y to be passed to `fit`, + `fit_predict` or `fit_transform` methods. The tag is ``True`` + for estimators inheriting from `~sklearn.base.RegressorMixin` + and `~sklearn.base.ClassifierMixin`. + + one_d_labels : bool, default=False + Whether the input is a 1D labels (y). + + two_d_labels : bool, default=False + Whether the input is a 2D labels (y). + + positive_only : bool, default=False + Whether the estimator requires a positive y (only applicable + for regression). + + multi_output : bool, default=False + Whether a regressor supports multi-target outputs or a classifier supports + multi-class multi-output. + + single_output : bool, default=True + Whether the target can be single-output. This can be ``False`` if the + estimator supports only multi-output cases. + """ + + required: bool + one_d_labels: bool = False + two_d_labels: bool = False + positive_only: bool = False + multi_output: bool = False + single_output: bool = True + + @dataclass(**_dataclass_args()) + class TransformerTags: + """Tags for the transformer. + + Parameters + ---------- + preserves_dtype : list[str], default=["float64"] + Applies only on transformers. It corresponds to the data types + which will be preserved such that `X_trans.dtype` is the same + as `X.dtype` after calling `transformer.transform(X)`. If this + list is empty, then the transformer is not expected to + preserve the data type. The first value in the list is + considered as the default data type, corresponding to the data + type of the output when the input data type is not going to be + preserved. + """ + + preserves_dtype: list[str] = field(default_factory=lambda: ["float64"]) + + @dataclass(**_dataclass_args()) + class ClassifierTags: + """Tags for the classifier. + + Parameters + ---------- + poor_score : bool, default=False + Whether the estimator fails to provide a "reasonable" test-set + score, which currently for classification is an accuracy of + 0.83 on ``make_blobs(n_samples=300, random_state=0)``. The + datasets and values are based on current estimators in scikit-learn + and might be replaced by something more systematic. + + multi_class : bool, default=True + Whether the classifier can handle multi-class + classification. Note that all classifiers support binary + classification. Therefore this flag indicates whether the + classifier is a binary-classifier-only or not. + + multi_label : bool, default=False + Whether the classifier supports multi-label output. + """ + + poor_score: bool = False + multi_class: bool = True + multi_label: bool = False + + @dataclass(**_dataclass_args()) + class RegressorTags: + """Tags for the regressor. + + Parameters + ---------- + poor_score : bool, default=False + Whether the estimator fails to provide a "reasonable" test-set + score, which currently for regression is an R2 of 0.5 on + ``make_regression(n_samples=200, n_features=10, + n_informative=1, bias=5.0, noise=20, random_state=42)``. The + dataset and values are based on current estimators in scikit-learn + and might be replaced by something more systematic. + + multi_label : bool, default=False + Whether the regressor supports multilabel output. + """ + + poor_score: bool = False + multi_label: bool = False + + @dataclass(**_dataclass_args()) + class SamplerTags: + """Tags for the sampler. + + Parameters + ---------- + sample_indices : bool, default=False + Whether the sampler returns the indices of the samples that were + selected. + """ + + sample_indices: bool = False + + @dataclass(**_dataclass_args()) + class Tags: + """Tags for the estimator. + + See :ref:`estimator_tags` for more information. + + Parameters + ---------- + estimator_type : str or None + The type of the estimator. Can be one of: + - "classifier" + - "regressor" + - "transformer" + - "clusterer" + - "outlier_detector" + - "density_estimator" + + target_tags : :class:`TargetTags` + The target(y) tags. + + transformer_tags : :class:`TransformerTags` or None + The transformer tags. + + classifier_tags : :class:`ClassifierTags` or None + The classifier tags. + + regressor_tags : :class:`RegressorTags` or None + The regressor tags. + + array_api_support : bool, default=False + Whether the estimator supports Array API compatible inputs. + + no_validation : bool, default=False + Whether the estimator skips input-validation. This is only meant for + stateless and dummy transformers! + + non_deterministic : bool, default=False + Whether the estimator is not deterministic given a fixed ``random_state``. + + requires_fit : bool, default=True + Whether the estimator requires to be fitted before calling one of + `transform`, `predict`, `predict_proba`, or `decision_function`. + + _skip_test : bool, default=False + Whether to skip common tests entirely. Don't use this unless + you have a *very good* reason. + + input_tags : :class:`InputTags` + The input data(X) tags. + """ + + estimator_type: str | None + target_tags: TargetTags + transformer_tags: TransformerTags | None = None + classifier_tags: ClassifierTags | None = None + regressor_tags: RegressorTags | None = None + array_api_support: bool = False + no_validation: bool = False + non_deterministic: bool = False + requires_fit: bool = True + _skip_test: bool = False + input_tags: InputTags = field(default_factory=InputTags) + sampler_tags: SamplerTags | None = None + + def _patched_more_tags(estimator, expected_failed_checks): + original_class_more_tags = estimator.__class__._more_tags + + def patched_instance_more_tags(self): + """Instance-level _more_tags that combines class tags with _xfail_checks""" + # Get tags from class-level _more_tags + tags = original_class_more_tags(self) + # Update with the xfail checks + tags.update({"_xfail_checks": expected_failed_checks}) + return tags + + # Patch both class and instance level + estimator.__class__._more_tags = patched_instance_more_tags + estimator._more_tags = types.MethodType(patched_instance_more_tags, estimator) + return estimator + + def check_estimator( + estimator=None, + generate_only=False, + *, + legacy: bool = True, + expected_failed_checks: dict[str, str] | None = None, + on_skip: Literal["warn"] | None = "warn", + on_fail: Literal["raise", "warn"] | None = "raise", + callback: Callable | None = None, + ): + # legacy, on_skip, on_fail, and callback are not supported and ignored + from sklearn.utils.estimator_checks import check_estimator + + return check_estimator( + _patched_more_tags(estimator, expected_failed_checks), + generate_only=generate_only, + ) + + def parametrize_with_checks( + estimators, + *, + legacy: bool = True, + expected_failed_checks: Callable | None = None, + ): + # legacy is not supported and ignored + from sklearn.utils.estimator_checks import parametrize_with_checks + + estimators = [ + _patched_more_tags(estimator, expected_failed_checks(estimator)) + for estimator in estimators + ] + + return parametrize_with_checks(estimators) + +else: + # test_common + # tags infrastructure + from sklearn.utils import ( + ClassifierTags, + InputTags, + RegressorTags, + Tags, + TargetTags, + TransformerTags, + ) + + @dataclass(**_dataclass_args()) + class InputTags(InputTags): + dataframe: bool = True + + @dataclass(**_dataclass_args()) + class SamplerTags: + sample_indices: bool = False + + @dataclass(**_dataclass_args()) + class Tags(Tags): + sampler_tags: SamplerTags | None = None + + from sklearn.utils._test_common.instance_generator import ( + _construct_instances, # noqa: F401 + ) + from sklearn.utils.estimator_checks import ( + check_estimator, # noqa: F401 + parametrize_with_checks, # noqa: F401 + ) + from sklearn.utils.multiclass import type_of_target # noqa: F401 + + # validation + from sklearn.utils.validation import ( + _check_feature_names, # noqa: F401 + _check_n_features, # noqa: F401 + check_array, # noqa: F401 + validate_data, # noqa: F401 + ) diff --git a/imblearn/utils/_tags.py b/imblearn/utils/_tags.py new file mode 100644 index 000000000..a981f7b40 --- /dev/null +++ b/imblearn/utils/_tags.py @@ -0,0 +1 @@ +from ._sklearn_compat import InputTags, SamplerTags, Tags # noqa: F401 diff --git a/imblearn/utils/_test_common/__init__.py b/imblearn/utils/_test_common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/imblearn/utils/_test_common/instance_generator.py b/imblearn/utils/_test_common/instance_generator.py new file mode 100644 index 000000000..e18fc8018 --- /dev/null +++ b/imblearn/utils/_test_common/instance_generator.py @@ -0,0 +1,244 @@ +# Authors: Guillaume Lemaitre +# Christos Aridas +# License: MIT + +import re +import warnings +from contextlib import suppress +from functools import partial +from inspect import isfunction + +from sklearn import clone, config_context +from sklearn.exceptions import SkipTestWarning +from sklearn.linear_model import LogisticRegression +from sklearn.tree import DecisionTreeClassifier +from sklearn.utils._testing import SkipTest +from sklearn.utils.fixes import parse_version + +from imblearn.combine import SMOTEENN, SMOTETomek +from imblearn.ensemble import ( + BalancedBaggingClassifier, + BalancedRandomForestClassifier, + EasyEnsembleClassifier, + RUSBoostClassifier, +) +from imblearn.over_sampling import ( + ADASYN, + SMOTE, + SMOTEN, + SMOTENC, + SVMSMOTE, + BorderlineSMOTE, + KMeansSMOTE, + RandomOverSampler, +) +from imblearn.pipeline import Pipeline +from imblearn.under_sampling import ( + ClusterCentroids, + CondensedNearestNeighbour, + InstanceHardnessThreshold, + NearMiss, + OneSidedSelection, + RandomUnderSampler, +) +from imblearn.utils._sklearn_compat import sklearn_version +from imblearn.utils.testing import all_estimators + +# The following dictionary is to indicate constructor arguments suitable for the test +# suite, which uses very small datasets, and is intended to run rather quickly. +INIT_PARAMS = { + # estimator + BalancedBaggingClassifier: dict(random_state=42), + BalancedRandomForestClassifier: dict(random_state=42), + EasyEnsembleClassifier: [ + # AdaBoostClassifier does not allow nan values + dict(random_state=42), + # DecisionTreeClassifier allows nan values + dict(estimator=DecisionTreeClassifier(random_state=42), random_state=42), + ], + Pipeline: dict( + steps=[ + ("sampler", RandomUnderSampler(random_state=0)), + ("logistic", LogisticRegression()), + ] + ), + # over-sampling + ADASYN: dict(random_state=42), + BorderlineSMOTE: dict(random_state=42), + KMeansSMOTE: dict(random_state=0), + RandomOverSampler: dict(random_state=42), + SMOTE: dict(random_state=42), + SMOTEN: dict(random_state=42), + SMOTENC: dict(categorical_features=[0], random_state=42), + SVMSMOTE: dict(random_state=42), + # under-sampling + ClusterCentroids: dict(random_state=42), + CondensedNearestNeighbour: dict(random_state=42), + InstanceHardnessThreshold: dict(random_state=42), + NearMiss: [dict(version=1), dict(version=2), dict(version=3)], + OneSidedSelection: dict(random_state=42), + RandomUnderSampler: dict(random_state=42), + # combination + SMOTEENN: dict(random_state=42), + SMOTETomek: dict(random_state=42), +} + +# This dictionary stores parameters for specific checks. It also enables running the +# same check with multiple instances of the same estimator with different parameters. +# The special key "*" allows to apply the parameters to all checks. +# TODO(devtools): allow third-party developers to pass test specific params to checks +PER_ESTIMATOR_CHECK_PARAMS: dict = { + Pipeline: { + "check_classifiers_with_encoded_labels": dict( + sampler__sampling_strategy={"setosa": 20, "virginica": 20} + ) + } +} + +SKIPPED_ESTIMATORS = [SMOTENC] + + +def _tested_estimators(type_filter=None): + for _, Estimator in all_estimators(type_filter=type_filter): + with suppress(SkipTest): + for estimator in _construct_instances(Estimator): + yield estimator + + +def _construct_instances(Estimator): + """Construct Estimator instances if possible. + + If parameter sets in INIT_PARAMS are provided, use them. If there are a list + of parameter sets, return one instance for each set. + """ + if Estimator in SKIPPED_ESTIMATORS: + msg = f"Can't instantiate estimator {Estimator.__name__}" + # raise additional warning to be shown by pytest + warnings.warn(msg, SkipTestWarning) + raise SkipTest(msg) + + if Estimator in INIT_PARAMS: + param_sets = INIT_PARAMS[Estimator] + if not isinstance(param_sets, list): + param_sets = [param_sets] + for params in param_sets: + est = Estimator(**params) + yield est + else: + yield Estimator() + + +def _get_check_estimator_ids(obj): + """Create pytest ids for checks. + + When `obj` is an estimator, this returns the pprint version of the + estimator (with `print_changed_only=True`). When `obj` is a function, the + name of the function is returned with its keyword arguments. + + `_get_check_estimator_ids` is designed to be used as the `id` in + `pytest.mark.parametrize` where `check_estimator(..., generate_only=True)` + is yielding estimators and checks. + + Parameters + ---------- + obj : estimator or function + Items generated by `check_estimator`. + + Returns + ------- + id : str or None + + See Also + -------- + check_estimator + """ + if isfunction(obj): + return obj.__name__ + if isinstance(obj, partial): + if not obj.keywords: + return obj.func.__name__ + kwstring = ",".join(["{}={}".format(k, v) for k, v in obj.keywords.items()]) + return "{}({})".format(obj.func.__name__, kwstring) + if hasattr(obj, "get_params"): + with config_context(print_changed_only=True): + return re.sub(r"\s", "", str(obj)) + + +def _yield_instances_for_check(check, estimator_orig): + """Yield instances for a check. + + For most estimators, this is a no-op. + + For estimators which have an entry in PER_ESTIMATOR_CHECK_PARAMS, this will yield + an estimator for each parameter set in PER_ESTIMATOR_CHECK_PARAMS[estimator]. + """ + # TODO(devtools): enable this behavior for third party estimators as well + if type(estimator_orig) not in PER_ESTIMATOR_CHECK_PARAMS: + yield estimator_orig + return + + check_params = PER_ESTIMATOR_CHECK_PARAMS[type(estimator_orig)] + + try: + check_name = check.__name__ + except AttributeError: + # partial tests + check_name = check.func.__name__ + + if check_name not in check_params: + yield estimator_orig + return + + param_set = check_params[check_name] + if isinstance(param_set, dict): + param_set = [param_set] + + for params in param_set: + estimator = clone(estimator_orig) + estimator.set_params(**params) + yield estimator + + +PER_ESTIMATOR_XFAIL_CHECKS = { + BalancedRandomForestClassifier: { + "check_sample_weight_equivalence": "FIXME", + "check_sample_weight_equivalence_on_sparse_data": "FIXME", + "check_sample_weight_equivalence_on_dense_data": "FIXME", + }, + NearMiss: { + "check_samplers_fit_resample": "FIXME", + }, + Pipeline: { + "check_classifiers_train": "FIXME", + "check_supervised_y_2d": "FIXME", + "check_dont_overwrite_parameters": ( + "Pipeline changes the `steps` parameter, which it shouldn't. " + "Therefore this test is x-fail until we fix this." + ), + "check_estimators_overwrite_params": ( + "Pipeline changes the `steps` parameter, which it shouldn't. " + "Therefore this test is x-fail until we fix this." + ), + }, + RUSBoostClassifier: { + "check_sample_weight_equivalence": "FIXME", + "check_sample_weight_equivalence_on_sparse_data": "FIXME", + "check_sample_weight_equivalence_on_dense_data": "FIXME", + "check_estimator_sparse_data": "FIXME", + "check_estimator_sparse_matrix": "FIXME", + "check_estimator_sparse_array": "FIXME", + }, +} + +if sklearn_version < parse_version("1.4"): + for _, Estimator in all_estimators(): + if Estimator in PER_ESTIMATOR_XFAIL_CHECKS: + PER_ESTIMATOR_XFAIL_CHECKS[Estimator]["check_estimators_pickle"] = "FIXME" + else: + PER_ESTIMATOR_XFAIL_CHECKS[Estimator] = {"check_estimators_pickle": "FIXME"} + + +def _get_expected_failed_checks(estimator): + """Get the expected failed checks for all estimators in scikit-learn.""" + failed_checks = PER_ESTIMATOR_XFAIL_CHECKS.get(type(estimator), {}) + return failed_checks diff --git a/imblearn/utils/_validation.py b/imblearn/utils/_validation.py index b21c15788..e5c310b20 100644 --- a/imblearn/utils/_validation.py +++ b/imblearn/utils/_validation.py @@ -13,11 +13,11 @@ from scipy.sparse import issparse from sklearn.base import clone from sklearn.neighbors import NearestNeighbors -from sklearn.utils import check_array, column_or_1d +from sklearn.utils import column_or_1d from sklearn.utils.multiclass import type_of_target from sklearn.utils.validation import _num_samples -from .fixes import _is_pandas_df +from ..utils._sklearn_compat import _is_pandas_df, check_array SAMPLING_KIND = ( "over-sampling", @@ -318,24 +318,22 @@ def _sampling_strategy_dict(sampling_strategy, y, sampling_type): if len(set_diff_sampling_strategy_target) > 0: raise ValueError( f"The {set_diff_sampling_strategy_target} target class is/are not " - f"present in the data." + "present in the data." ) # check that there is no negative number if any(n_samples < 0 for n_samples in sampling_strategy.values()): raise ValueError( - f"The number of samples in a class cannot be negative." + "The number of samples in a class cannot be negative." f"'sampling_strategy' contains some negative value: {sampling_strategy}" ) sampling_strategy_ = {} if sampling_type == "over-sampling": - max(target_stats.values()) - max(target_stats, key=target_stats.get) for class_sample, n_samples in sampling_strategy.items(): if n_samples < target_stats[class_sample]: raise ValueError( - f"With over-sampling methods, the number" - f" of samples in a class should be greater" - f" or equal to the original number of samples." + "With over-sampling methods, the number" + " of samples in a class should be greater" + " or equal to the original number of samples." f" Originally, there is {target_stats[class_sample]} " f"samples and {n_samples} samples are asked." ) @@ -344,9 +342,9 @@ def _sampling_strategy_dict(sampling_strategy, y, sampling_type): for class_sample, n_samples in sampling_strategy.items(): if n_samples > target_stats[class_sample]: raise ValueError( - f"With under-sampling methods, the number of" - f" samples in a class should be less or equal" - f" to the original number of samples." + "With under-sampling methods, the number of" + " samples in a class should be less or equal" + " to the original number of samples." f" Originally, there is {target_stats[class_sample]} " f"samples and {n_samples} samples are asked." ) @@ -380,7 +378,7 @@ class of interest.""" if len(set_diff_sampling_strategy_target) > 0: raise ValueError( f"The {set_diff_sampling_strategy_target} target class is/are not " - f"present in the data." + "present in the data." ) return { @@ -535,7 +533,7 @@ def check_sampling_strategy(sampling_strategy, y, sampling_type, **kwargs): if np.unique(y).size <= 1: raise ValueError( - f"The target 'y' needs to have more than 1 class. " + "The target 'y' needs to have more than 1 class. " f"Got {np.unique(y).size} class instead" ) @@ -545,9 +543,9 @@ def check_sampling_strategy(sampling_strategy, y, sampling_type, **kwargs): if isinstance(sampling_strategy, str): if sampling_strategy not in SAMPLING_TARGET_KIND.keys(): raise ValueError( - f"When 'sampling_strategy' is a string, it needs" + "When 'sampling_strategy' is a string, it needs" f" to be one of {SAMPLING_TARGET_KIND}. Got '{sampling_strategy}' " - f"instead." + "instead." ) return OrderedDict( sorted(SAMPLING_TARGET_KIND[sampling_strategy](y, sampling_type).items()) @@ -563,7 +561,7 @@ def check_sampling_strategy(sampling_strategy, y, sampling_type, **kwargs): elif isinstance(sampling_strategy, Real): if sampling_strategy <= 0 or sampling_strategy > 1: raise ValueError( - f"When 'sampling_strategy' is a float, it should be " + "When 'sampling_strategy' is a float, it should be " f"in the range (0, 1]. Got {sampling_strategy} instead." ) return OrderedDict( @@ -621,9 +619,11 @@ def inner_f(*args, **kwargs): for name, arg in zip(kwonly_args[:extra_args], args[-extra_args:]) ] warnings.warn( - f"Pass {', '.join(args_msg)} as keyword args. From version 0.9 " - f"passing these as positional arguments will " - f"result in an error", + ( + f"Pass {', '.join(args_msg)} as keyword args. From version 0.9 " + "passing these as positional arguments will " + "result in an error" + ), FutureWarning, ) kwargs.update({k: arg for k, arg in zip(sig.parameters, args)}) @@ -637,11 +637,10 @@ def _check_X(X): n_samples = _num_samples(X) if n_samples < 1: raise ValueError( - f"Found array with {n_samples} sample(s) while a minimum of 1 is " - "required." + f"Found array with {n_samples} sample(s) while a minimum of 1 is required." ) if _is_pandas_df(X): return X return check_array( - X, dtype=None, accept_sparse=["csr", "csc"], force_all_finite=False + X, dtype=None, accept_sparse=["csr", "csc"], ensure_all_finite=False ) diff --git a/imblearn/utils/deprecation.py b/imblearn/utils/deprecation.py index 6d459b8d2..69e4ab629 100644 --- a/imblearn/utils/deprecation.py +++ b/imblearn/utils/deprecation.py @@ -30,17 +30,21 @@ def deprecate_parameter(sampler, version_deprecation, param_deprecated, new_para if new_param is None: if getattr(sampler, param_deprecated) is not None: warnings.warn( - f"'{param_deprecated}' is deprecated from {version_deprecation} and " - f" will be removed in {version_removed} for the estimator " - f"{sampler.__class__}.", + ( + f"'{param_deprecated}' is deprecated from {version_deprecation} and" + f" will be removed in {version_removed} for the estimator" + f" {sampler.__class__}." + ), category=FutureWarning, ) else: if getattr(sampler, param_deprecated) is not None: warnings.warn( - f"'{param_deprecated}' is deprecated from {version_deprecation} and " - f"will be removed in {version_removed} for the estimator " - f"{sampler.__class__}. Use '{new_param}' instead.", + ( + f"'{param_deprecated}' is deprecated from {version_deprecation} and" + f" will be removed in {version_removed} for the estimator" + f" {sampler.__class__}. Use '{new_param}' instead." + ), category=FutureWarning, ) setattr(sampler, new_param, getattr(sampler, param_deprecated)) diff --git a/imblearn/utils/estimator_checks.py b/imblearn/utils/estimator_checks.py index 570427759..d5f9cd80d 100644 --- a/imblearn/utils/estimator_checks.py +++ b/imblearn/utils/estimator_checks.py @@ -9,11 +9,9 @@ import traceback import warnings from collections import Counter -from functools import partial +from functools import partial, wraps import numpy as np -import pytest -import sklearn from scipy import sparse from sklearn.base import clone, is_classifier, is_regressor from sklearn.cluster import KMeans @@ -25,38 +23,28 @@ ) from sklearn.exceptions import SkipTestWarning from sklearn.preprocessing import StandardScaler, label_binarize -from sklearn.utils._tags import _safe_tags +from sklearn.utils._param_validation import generate_invalid_param_val, make_constraint from sklearn.utils._testing import ( SkipTest, assert_allclose, assert_array_equal, - assert_raises_regex, raises, set_random_state, ) from sklearn.utils.estimator_checks import ( + _enforce_estimator_tags_X, _enforce_estimator_tags_y, - _get_check_estimator_ids, - _maybe_mark_xfail, ) - -try: - from sklearn.utils.estimator_checks import _enforce_estimator_tags_x -except ImportError: - # scikit-learn >= 1.2 - from sklearn.utils.estimator_checks import ( - _enforce_estimator_tags_X as _enforce_estimator_tags_x, - ) - -from sklearn.utils.fixes import parse_version from sklearn.utils.multiclass import type_of_target from imblearn.datasets import make_imbalance from imblearn.over_sampling.base import BaseOverSampler from imblearn.under_sampling.base import BaseCleaningSampler, BaseUnderSampler -from imblearn.utils._param_validation import generate_invalid_param_val, make_constraint - -sklearn_version = parse_version(sklearn.__version__) +from imblearn.utils._sklearn_compat import get_tags +from imblearn.utils._test_common.instance_generator import ( + _get_check_estimator_ids, + _yield_instances_for_check, +) def sample_dataset_generator(): @@ -70,48 +58,41 @@ def sample_dataset_generator(): return X, y -@pytest.fixture(name="sample_dataset_generator") -def sample_dataset_generator_fixture(): - return sample_dataset_generator() - - def _set_checking_parameters(estimator): params = estimator.get_params() name = estimator.__class__.__name__ if "n_estimators" in params: estimator.set_params(n_estimators=min(5, estimator.n_estimators)) if name == "ClusterCentroids": - if sklearn_version < parse_version("1.1"): - algorithm = "full" - else: - algorithm = "lloyd" + algorithm = "lloyd" estimator.set_params( voting="soft", estimator=KMeans(random_state=0, algorithm=algorithm, n_init=1), ) if name == "KMeansSMOTE": estimator.set_params(kmeans_estimator=12) - if name == "BalancedRandomForestClassifier": - # TODO: remove in 0.13 - # future default in 0.13 - estimator.set_params(replacement=True, sampling_strategy="all", bootstrap=False) def _yield_sampler_checks(sampler): - tags = sampler._get_tags() + tags = get_tags(sampler) + accept_sparse = tags.input_tags.sparse + accept_dataframe = tags.input_tags.dataframe + accept_string = tags.input_tags.string + allow_nan = tags.input_tags.allow_nan + yield check_target_type yield check_samplers_one_label yield check_samplers_fit yield check_samplers_fit_resample yield check_samplers_sampling_strategy_fit_resample - if "sparse" in tags["X_types"]: + if accept_sparse: yield check_samplers_sparse - if "dataframe" in tags["X_types"]: + if accept_dataframe: yield check_samplers_pandas yield check_samplers_pandas_sparse - if "string" in tags["X_types"]: + if accept_string: yield check_samplers_string - if tags["allow_nan"]: + if allow_nan: yield check_samplers_nan yield check_samplers_list yield check_samplers_multiclass_ova @@ -130,10 +111,12 @@ def _yield_classifier_checks(classifier): yield check_classifiers_with_encoded_labels -def _yield_all_checks(estimator): +def _yield_all_checks(estimator, legacy=True): name = estimator.__class__.__name__ - tags = estimator._get_tags() - if tags["_skip_test"]: + tags = get_tags(estimator) + + skip_test = tags._skip_test + if skip_test: warnings.warn( f"Explicit SKIP via _skip_test tag for estimator {name}.", SkipTestWarning, @@ -148,9 +131,139 @@ def _yield_all_checks(estimator): yield check -def parametrize_with_checks(estimators): +def _check_name(check): + if hasattr(check, "__wrapped__"): + return _check_name(check.__wrapped__) + return check.func.__name__ if isinstance(check, partial) else check.__name__ + + +def _maybe_mark(estimator, check, expected_failed_checks=None, mark=None, pytest=None): + """Mark the test as xfail or skip if needed. + + Parameters + ---------- + estimator : estimator object + Estimator instance for which to generate checks. + check : partial or callable + Check to be marked. + expected_failed_checks : dict[str, str], default=None + Dictionary of the form {check_name: reason} for checks that are expected to + fail. + mark : "xfail" or "skip" or None + Whether to mark the check as xfail or skip. + pytest : pytest module, default=None + Pytest module to use to mark the check. This is only needed if ``mark`` is + `"xfail"`. Note that one can run `check_estimator` without having `pytest` + installed. This is used in combination with `parametrize_with_checks` only. + """ + should_be_marked, reason = _should_be_skipped_or_marked( + estimator, check, expected_failed_checks + ) + if not should_be_marked or mark is None: + return estimator, check + + estimator_name = estimator.__class__.__name__ + if mark == "xfail": + return pytest.param(estimator, check, marks=pytest.mark.xfail(reason=reason)) + else: + + @wraps(check) + def wrapped(*args, **kwargs): + raise SkipTest( + f"Skipping {_check_name(check)} for {estimator_name}: {reason}" + ) + + return estimator, wrapped + + +def _should_be_skipped_or_marked( + estimator, check, expected_failed_checks: dict[str, str] | None = None +) -> tuple[bool, str]: + """Check whether a check should be skipped or marked as xfail. + + Parameters + ---------- + estimator : estimator object + Estimator instance for which to generate checks. + check : partial or callable + Check to be marked. + expected_failed_checks : dict[str, str], default=None + Dictionary of the form {check_name: reason} for checks that are expected to + fail. + + Returns + ------- + should_be_marked : bool + Whether the check should be marked as xfail or skipped. + reason : str + Reason for skipping the check. + """ + + expected_failed_checks = expected_failed_checks or {} + + check_name = _check_name(check) + if check_name in expected_failed_checks: + return True, expected_failed_checks[check_name] + + return False, "Check is not expected to fail" + + +def estimator_checks_generator( + estimator, *, legacy=True, expected_failed_checks=None, mark=None +): + """Iteratively yield all check callables for an estimator. + + .. versionadded:: 1.6 + + Parameters + ---------- + estimator : estimator object + Estimator instance for which to generate checks. + legacy : bool, default=True + Whether to include legacy checks. Over time we remove checks from this category + and move them into their specific category. + expected_failed_checks : dict[str, str], default=None + Dictionary of the form {check_name: reason} for checks that are expected to + fail. + mark : {"xfail", "skip"} or None, default=None + Whether to mark the checks that are expected to fail as + xfail(`pytest.mark.xfail`) or skip. Marking a test as "skip" is done via + wrapping the check in a function that raises a + :class:`~sklearn.exceptions.SkipTest` exception. + + Returns + ------- + estimator_checks_generator : generator + Generator that yields (estimator, check) tuples. + """ + if mark == "xfail": + import pytest + else: + pytest = None # type: ignore + + name = type(estimator).__name__ + for check in _yield_all_checks(estimator, legacy=legacy): + check_with_name = partial(check, name) + for check_instance in _yield_instances_for_check(check, estimator): + yield _maybe_mark( + check_instance, + check_with_name, + expected_failed_checks=expected_failed_checks, + mark=mark, + pytest=pytest, + ) + + +def parametrize_with_checks(estimators, *, legacy=True, expected_failed_checks=None): """Pytest specific decorator for parametrizing estimator checks. + Checks are categorised into the following groups: + + - API checks: a set of checks to ensure API compatibility with scikit-learn. + Refer to https://scikit-learn.org/dev/developers/develop.html a requirement of + scikit-learn estimators. + - legacy: a set of checks which gradually will be grouped into other categories. + The `id` of each check is set to be a pprint version of the estimator and the name of the check with its keyword arguments. This allows to use `pytest -k` to specify which tests to run:: @@ -162,10 +275,41 @@ def parametrize_with_checks(estimators): estimators : list of estimators instances Estimators to generated checks for. + .. versionchanged:: 0.24 + Passing a class was deprecated in version 0.23, and support for + classes was removed in 0.24. Pass an instance instead. + + .. versionadded:: 0.24 + + + legacy : bool, default=True + Whether to include legacy checks. Over time we remove checks from this category + and move them into their specific category. + + .. versionadded:: 1.6 + + expected_failed_checks : callable, default=None + A callable that takes an estimator as input and returns a dictionary of the + form:: + + { + "check_name": "my reason", + } + + Where `"check_name"` is the name of the check, and `"my reason"` is why + the check fails. These tests will be marked as xfail if the check fails. + + + .. versionadded:: 1.6 + Returns ------- decorator : `pytest.mark.parametrize` + See Also + -------- + check_estimator : Check if estimator adheres to scikit-learn conventions. + Examples -------- >>> from sklearn.utils.estimator_checks import parametrize_with_checks @@ -176,17 +320,29 @@ def parametrize_with_checks(estimators): ... DecisionTreeRegressor()]) ... def test_sklearn_compatible_estimator(estimator, check): ... check(estimator) + """ + import pytest + + if any(isinstance(est, type) for est in estimators): + msg = ( + "Passing a class was deprecated in version 0.23 " + "and isn't supported anymore from 0.24." + "Please pass an instance instead." + ) + raise TypeError(msg) - def checks_generator(): + def _checks_generator(estimators, legacy, expected_failed_checks): for estimator in estimators: - name = type(estimator).__name__ - for check in _yield_all_checks(estimator): - check = partial(check, name) - yield _maybe_mark_xfail(estimator, check, pytest) + args = {"estimator": estimator, "legacy": legacy, "mark": "xfail"} + if callable(expected_failed_checks): + args["expected_failed_checks"] = expected_failed_checks(estimator) + yield from estimator_checks_generator(**args) return pytest.mark.parametrize( - "estimator, check", checks_generator(), ids=_get_check_estimator_ids + "estimator, check", + _checks_generator(estimators, legacy, expected_failed_checks), + ids=_get_check_estimator_ids, ) @@ -196,24 +352,14 @@ def check_target_type(name, estimator_orig): X = np.random.random((20, 2)) y = np.linspace(0, 1, 20) msg = "Unknown label type:" - assert_raises_regex( - ValueError, - msg, - estimator.fit_resample, - X, - y, - ) + with raises(ValueError, err_msg=msg): + estimator.fit_resample(X, y) # if the target is multilabel then we should raise an error rng = np.random.RandomState(42) y = rng.randint(2, size=(20, 3)) msg = "Multilabel and multioutput targets are not supported." - assert_raises_regex( - ValueError, - msg, - estimator.fit_resample, - X, - y, - ) + with raises(ValueError, err_msg=msg): + estimator.fit_resample(X, y) def check_samplers_one_label(name, sampler_orig): @@ -309,12 +455,17 @@ def check_samplers_sparse(name, sampler_orig): sampler = clone(sampler) X_res, y_res = sampler.fit_resample(X, y) assert sparse.issparse(X_res_sparse) - assert_allclose(X_res_sparse.A, X_res, rtol=1e-5) + assert_allclose(X_res_sparse.toarray(), X_res, rtol=1e-5) assert_allclose(y_res_sparse, y_res) def check_samplers_pandas_sparse(name, sampler_orig): - pd = pytest.importorskip("pandas") + try: + import pandas as pd + except ImportError: + raise SkipTest( + "pandas is not installed: not checking column name consistency for pandas" + ) sampler = clone(sampler_orig) # Check that the samplers handle pandas dataframe and pandas series X, y = sample_dataset_generator() @@ -336,13 +487,17 @@ def check_samplers_pandas_sparse(name, sampler_orig): assert X_df.columns.tolist() == X_res_df.columns.tolist() assert y_s.name == y_res_s.name - # FIXME: we should use to_numpy with pandas >= 0.25 - assert_allclose(X_res_df.values, X_res) - assert_allclose(y_res_s.values, y_res) + assert_allclose(X_res_df.to_numpy(), X_res) + assert_allclose(y_res_s.to_numpy(), y_res) def check_samplers_pandas(name, sampler_orig): - pd = pytest.importorskip("pandas") + try: + import pandas as pd + except ImportError: + raise SkipTest( + "pandas is not installed: not checking column name consistency for pandas" + ) sampler = clone(sampler_orig) # Check that the samplers handle pandas dataframe and pandas series X, y = sample_dataset_generator() @@ -363,10 +518,9 @@ def check_samplers_pandas(name, sampler_orig): assert y_df.columns.tolist() == y_res_df.columns.tolist() assert y_s.name == y_res_s.name - # FIXME: we should use to_numpy with pandas >= 0.25 - assert_allclose(X_res_df.values, X_res) - assert_allclose(y_res_df.values.ravel(), y_res) - assert_allclose(y_res_s.values, y_res) + assert_allclose(X_res_df.to_numpy(), X_res) + assert_allclose(y_res_df.to_numpy().ravel(), y_res) + assert_allclose(y_res_s.to_numpy(), y_res) def check_samplers_list(name, sampler_orig): @@ -421,9 +575,9 @@ def check_samplers_sample_indices(name, sampler_orig): sampler = clone(sampler_orig) X, y = sample_dataset_generator() sampler.fit_resample(X, y) - sample_indices = sampler._get_tags().get("sample_indices", None) - if sample_indices: - assert hasattr(sampler, "sample_indices_") is sample_indices + tags = get_tags(sampler) + if tags.sampler_tags.sample_indices: + assert hasattr(sampler, "sample_indices_") is tags.sampler_tags.sample_indices else: assert not hasattr(sampler, "sample_indices_") @@ -462,14 +616,19 @@ def check_classifier_on_multilabel_or_multioutput_targets(name, estimator_orig): estimator = clone(estimator_orig) X, y = make_multilabel_classification(n_samples=30) msg = "Multilabel and multioutput targets are not supported." - with pytest.raises(ValueError, match=msg): + with raises(ValueError, match=msg): estimator.fit(X, y) def check_classifiers_with_encoded_labels(name, classifier_orig): # Non-regression test for #709 # https://github.com/scikit-learn-contrib/imbalanced-learn/issues/709 - pd = pytest.importorskip("pandas") + try: + import pandas as pd + except ImportError: + raise SkipTest( + "pandas is not installed: not checking column name consistency for pandas" + ) classifier = clone(classifier_orig) iris = load_iris(as_frame=True) df, y = iris.data, iris.target @@ -483,7 +642,6 @@ def check_classifiers_with_encoded_labels(name, classifier_orig): "virginica": 50, }, ) - classifier.set_params(sampling_strategy={"setosa": 20, "virginica": 20}) classifier.fit(df, y) assert set(classifier.classes_) == set(y.cat.categories.tolist()) y_pred = classifier.predict(df) @@ -541,14 +699,7 @@ def check_param_validation(name, estimator_orig): continue with raises(ValueError, match=match, err_msg=err_msg): - if any( - isinstance(X_type, str) and X_type.endswith("labels") - for X_type in _safe_tags(estimator, key="X_types") - ): - # The estimator is a label transformer and take only `y` - getattr(estimator, method)(y) # pragma: no cover - else: - getattr(estimator, method)(X, y) + getattr(estimator, method)(X, y) # Then, for constraints that are more than a type constraint, check that the # error is raised if param does match a valid type but does not match any valid @@ -569,14 +720,7 @@ def check_param_validation(name, estimator_orig): continue with raises(ValueError, match=match, err_msg=err_msg): - if any( - X_type.endswith("labels") - for X_type in _safe_tags(estimator, key="X_types") - ): - # The estimator is a label transformer and take only `y` - getattr(estimator, method)(y) # pragma: no cover - else: - getattr(estimator, method)(X, y) + getattr(estimator, method)(X, y) def check_dataframe_column_names_consistency(name, estimator_orig): @@ -587,12 +731,11 @@ def check_dataframe_column_names_consistency(name, estimator_orig): "pandas is not installed: not checking column name consistency for pandas" ) - tags = _safe_tags(estimator_orig) - is_supported_X_types = ( - "2darray" in tags["X_types"] or "categorical" in tags["X_types"] - ) + tags = get_tags(estimator_orig) + is_supported_X_types = tags.input_tags.two_d_array or tags.input_tags.categorical + no_validation = tags.no_validation - if not is_supported_X_types or tags["no_validation"]: + if not is_supported_X_types or no_validation: return rng = np.random.RandomState(0) @@ -602,7 +745,7 @@ def check_dataframe_column_names_consistency(name, estimator_orig): X_orig = rng.normal(size=(150, 8)) - X_orig = _enforce_estimator_tags_x(estimator, X_orig) + X_orig = _enforce_estimator_tags_X(estimator, X_orig) n_samples, n_features = X_orig.shape names = np.array([f"col_{i}" for i in range(n_features)]) @@ -676,8 +819,10 @@ def check_dataframe_column_names_consistency(name, estimator_orig): (names[::-1], "Feature names must be in the same order as they were in fit."), ( [f"another_prefix_{i}" for i in range(n_features)], - "Feature names unseen at fit time:\n- another_prefix_0\n-" - " another_prefix_1\n", + ( + "Feature names unseen at fit time:\n- another_prefix_0\n-" + " another_prefix_1\n" + ), ), ( names[:3], @@ -695,33 +840,14 @@ def check_dataframe_column_names_consistency(name, estimator_orig): X_bad = pd.DataFrame(X, columns=invalid_name) for name, method in check_methods: - if sklearn_version >= parse_version("1.2"): - expected_msg = re.escape( - "The feature names should match those that were passed during fit." - f"\n{additional_message}" - ) - with raises( - ValueError, match=expected_msg, err_msg=f"{name} did not raise" - ): - method(X_bad) - else: - expected_msg = re.escape( - "The feature names should match those that were passed " - "during fit. Starting version 1.2, an error will be raised.\n" - f"{additional_message}" - ) - with warnings.catch_warnings(): - warnings.filterwarnings( - "error", - category=FutureWarning, - module="sklearn", - ) - with raises( - FutureWarning, - match=expected_msg, - err_msg=f"{name} did not raise", - ): - method(X_bad) + expected_msg = re.escape( + "The feature names should match those that were passed during fit." + f"\n{additional_message}" + ) + with raises( + ValueError, match=expected_msg, err_msg=f"{name} did not raise" + ): + method(X_bad) # partial_fit checks on second call # Do not call partial fit if early_stopping is on @@ -740,8 +866,12 @@ def check_dataframe_column_names_consistency(name, estimator_orig): def check_sampler_get_feature_names_out(name, sampler_orig): - tags = sampler_orig._get_tags() - if "2darray" not in tags["X_types"] or tags["no_validation"]: + tags = get_tags(sampler_orig) + + two_d_array = tags.input_tags.two_d_array + no_validation = tags.no_validation + + if not two_d_array or no_validation: return X, y = make_blobs( @@ -754,7 +884,7 @@ def check_sampler_get_feature_names_out(name, sampler_orig): X = StandardScaler().fit_transform(X) sampler = clone(sampler_orig) - X = _enforce_estimator_tags_x(sampler, X) + X = _enforce_estimator_tags_X(sampler, X) n_features = X.shape[1] set_random_state(sampler) @@ -788,8 +918,11 @@ def check_sampler_get_feature_names_out_pandas(name, sampler_orig): "pandas is not installed: not checking column name consistency for pandas" ) - tags = sampler_orig._get_tags() - if "2darray" not in tags["X_types"] or tags["no_validation"]: + tags = get_tags(sampler_orig) + two_d_array = tags.input_tags.two_d_array + no_validation = tags.no_validation + + if not two_d_array or no_validation: return X, y = make_blobs( @@ -802,7 +935,7 @@ def check_sampler_get_feature_names_out_pandas(name, sampler_orig): X = StandardScaler().fit_transform(X) sampler = clone(sampler_orig) - X = _enforce_estimator_tags_x(sampler, X) + X = _enforce_estimator_tags_X(sampler, X) n_features = X.shape[1] set_random_state(sampler) diff --git a/imblearn/utils/fixes.py b/imblearn/utils/fixes.py deleted file mode 100644 index 023d8a152..000000000 --- a/imblearn/utils/fixes.py +++ /dev/null @@ -1,150 +0,0 @@ -"""Compatibility fixes for older version of python, numpy, scipy, and -scikit-learn. - -If you add content to this file, please give the version of the package at -which the fix is no longer needed. -""" -import functools -import sys - -import numpy as np -import scipy -import scipy.stats -import sklearn -from sklearn.utils.fixes import parse_version - -from .._config import config_context, get_config - -sp_version = parse_version(scipy.__version__) -sklearn_version = parse_version(sklearn.__version__) - - -# TODO: Remove when SciPy 1.9 is the minimum supported version -def _mode(a, axis=0): - if sp_version >= parse_version("1.9.0"): - return scipy.stats.mode(a, axis=axis, keepdims=True) - return scipy.stats.mode(a, axis=axis) - - -# TODO: Remove when scikit-learn 1.1 is the minimum supported version -if sklearn_version >= parse_version("1.1"): - from sklearn.utils.validation import _is_arraylike_not_scalar -else: - from sklearn.utils.validation import _is_arraylike - - def _is_arraylike_not_scalar(array): - """Return True if array is array-like and not a scalar""" - return _is_arraylike(array) and not np.isscalar(array) - - -# TODO: remove when scikit-learn minimum version is 1.3 -if sklearn_version < parse_version("1.3"): - - def _fit_context(*, prefer_skip_nested_validation): - """Decorator to run the fit methods of estimators within context managers. - - Parameters - ---------- - prefer_skip_nested_validation : bool - If True, the validation of parameters of inner estimators or functions - called during fit will be skipped. - - This is useful to avoid validating many times the parameters passed by the - user from the public facing API. It's also useful to avoid validating - parameters that we pass internally to inner functions that are guaranteed to - be valid by the test suite. - - It should be set to True for most estimators, except for those that receive - non-validated objects as parameters, such as meta-estimators that are given - estimator objects. - - Returns - ------- - decorated_fit : method - The decorated fit method. - """ - - def decorator(fit_method): - @functools.wraps(fit_method) - def wrapper(estimator, *args, **kwargs): - global_skip_validation = get_config()["skip_parameter_validation"] - - # we don't want to validate again for each call to partial_fit - partial_fit_and_fitted = ( - fit_method.__name__ == "partial_fit" and _is_fitted(estimator) - ) - - if not global_skip_validation and not partial_fit_and_fitted: - estimator._validate_params() - - with config_context( - skip_parameter_validation=( - prefer_skip_nested_validation or global_skip_validation - ) - ): - return fit_method(estimator, *args, **kwargs) - - return wrapper - - return decorator - -else: - from sklearn.base import _fit_context # type: ignore[no-redef] # noqa - -# TODO: remove when scikit-learn minimum version is 1.3 -if sklearn_version < parse_version("1.3"): - - def _is_fitted(estimator, attributes=None, all_or_any=all): - """Determine if an estimator is fitted - - Parameters - ---------- - estimator : estimator instance - Estimator instance for which the check is performed. - - attributes : str, list or tuple of str, default=None - Attribute name(s) given as string or a list/tuple of strings - Eg.: ``["coef_", "estimator_", ...], "coef_"`` - - If `None`, `estimator` is considered fitted if there exist an - attribute that ends with a underscore and does not start with double - underscore. - - all_or_any : callable, {all, any}, default=all - Specify whether all or any of the given attributes must exist. - - Returns - ------- - fitted : bool - Whether the estimator is fitted. - """ - if attributes is not None: - if not isinstance(attributes, (list, tuple)): - attributes = [attributes] - return all_or_any([hasattr(estimator, attr) for attr in attributes]) - - if hasattr(estimator, "__sklearn_is_fitted__"): - return estimator.__sklearn_is_fitted__() - - fitted_attrs = [ - v for v in vars(estimator) if v.endswith("_") and not v.startswith("__") - ] - return len(fitted_attrs) > 0 - -else: - from sklearn.utils.validation import _is_fitted # type: ignore[no-redef] - -try: - from sklearn.utils.validation import _is_pandas_df -except ImportError: - - def _is_pandas_df(X): - """Return True if the X is a pandas dataframe.""" - if hasattr(X, "columns") and hasattr(X, "iloc"): - # Likely a pandas DataFrame, we explicitly check the type to confirm. - try: - pd = sys.modules["pandas"] - except KeyError: - return False - return isinstance(X, pd.DataFrame) - return False diff --git a/imblearn/utils/testing.py b/imblearn/utils/testing.py index 8c19d6101..9111033e3 100644 --- a/imblearn/utils/testing.py +++ b/imblearn/utils/testing.py @@ -101,9 +101,8 @@ def is_abstract(c): estimators = filtered_estimators if type_filter: raise ValueError( - "Parameter type_filter must be 'sampler' or " - "None, got" - " %s." % repr(type_filter) + "Parameter type_filter must be 'sampler' or None, got %s." + % repr(type_filter) ) # drop duplicates, sort for reproducibility diff --git a/imblearn/utils/tests/test_estimator_checks.py b/imblearn/utils/tests/test_estimator_checks.py index ca704f222..0044c6db5 100644 --- a/imblearn/utils/tests/test_estimator_checks.py +++ b/imblearn/utils/tests/test_estimator_checks.py @@ -6,6 +6,7 @@ from imblearn.base import BaseSampler from imblearn.over_sampling.base import BaseOverSampler from imblearn.utils import check_target_type as target_check +from imblearn.utils._sklearn_compat import validate_data from imblearn.utils.estimator_checks import ( check_samplers_fit, check_samplers_nan, @@ -47,7 +48,7 @@ class NotFittedSampler(BaseBadSampler): """Sampler without target checking.""" def fit(self, X, y): - X, y = self._validate_data(X, y) + X, y = validate_data(self, X=X, y=y) return self @@ -55,7 +56,7 @@ class NoAcceptingSparseSampler(BaseBadSampler): """Sampler which does not accept sparse matrix.""" def fit(self, X, y): - X, y = self._validate_data(X, y) + X, y = validate_data(self, X=X, y=y) self.sampling_strategy_ = "sampling_strategy_" return self @@ -72,12 +73,13 @@ def _fit_resample(self, X, y): class IndicesSampler(BaseOverSampler): def _check_X_y(self, X, y): y, binarize_y = target_check(y, indicate_one_vs_all=True) - X, y = self._validate_data( - X, - y, + X, y = validate_data( + self, + X=X, + y=y, reset=True, dtype=None, - force_all_finite=False, + ensure_all_finite=False, ) return X, y, binarize_y @@ -98,7 +100,7 @@ def test_check_samplers_nan(): mapping_estimator_error = { - "BaseBadSampler": (AssertionError, "ValueError not raised by fit"), + "BaseBadSampler": (AssertionError, None), "SamplerSingleClass": (AssertionError, "Sampler can't balance when only"), "NotFittedSampler": (AssertionError, "No fitted attribute"), "NoAcceptingSparseSampler": (TypeError, "dense data is required"), diff --git a/imblearn/utils/tests/test_min_dependencies.py b/imblearn/utils/tests/test_min_dependencies.py index cd537030c..86e093f59 100644 --- a/imblearn/utils/tests/test_min_dependencies.py +++ b/imblearn/utils/tests/test_min_dependencies.py @@ -1,23 +1,56 @@ """Tests for the minimum dependencies in the README.rst file.""" + import os import platform import re from pathlib import Path import pytest -from sklearn.utils.fixes import parse_version +from packaging.requirements import Requirement +from packaging.version import parse import imblearn -from imblearn._min_dependencies import dependent_packages @pytest.mark.skipif( - platform.system() == "Windows", reason="This test is enough on unix system" + platform.system() == "Windows" or parse(platform.python_version()) < parse("3.11"), + reason="This test is enough on unix system and requires Python >= 3.11", ) def test_min_dependencies_readme(): + # local import to not import the file with Python < 3.11 + import tomllib + # Test that the minimum dependencies in the README.rst file are # consistent with the minimum dependencies defined at the file: - # imblearn/_min_dependencies.py + # pyproject.toml + + pyproject_path = Path(imblearn.__path__[0]).parents[0] / "pyproject.toml" + with open(pyproject_path, "rb") as f: + pyproject_data = tomllib.load(f) + + def process_requirements(requirements): + result = {} + for req in requirements: + req = Requirement(req) + for specifier in req.specifier: + if specifier.operator == ">=": + result[req.name] = parse(specifier.version) + return result + + min_dependencies = process_requirements( + [f"python{pyproject_data['project']['requires-python']}"] + ) + min_dependencies.update( + process_requirements(pyproject_data["project"]["dependencies"]) + ) + + markers = ["docs", "optional", "tensorflow", "keras", "tests"] + for marker_name in markers: + min_dependencies.update( + process_requirements( + pyproject_data["project"]["optional-dependencies"][marker_name] + ) + ) pattern = re.compile( r"(\.\. \|)" @@ -43,9 +76,11 @@ def test_min_dependencies_readme(): package, version = matched.group(2), matched.group(5) package = package.lower() + if package == "scikitlearn": + package = "scikit-learn" - if package in dependent_packages: - version = parse_version(version) - min_version = parse_version(dependent_packages[package][0]) + if package in min_dependencies: + version = parse(version) + min_version = min_dependencies[package] assert version == min_version, f"{package} has a mismatched version" diff --git a/imblearn/utils/tests/test_param_validation.py b/imblearn/utils/tests/test_param_validation.py deleted file mode 100644 index 38af6642d..000000000 --- a/imblearn/utils/tests/test_param_validation.py +++ /dev/null @@ -1,785 +0,0 @@ -"""This is a copy of sklearn/utils/tests/test_param_validation.py. It can be -removed when we support scikit-learn >= 1.2. -""" -from numbers import Integral, Real - -import numpy as np -import pytest -from scipy.sparse import csr_matrix -from sklearn.base import BaseEstimator -from sklearn.model_selection import LeaveOneOut -from sklearn.utils import deprecated - -from imblearn._config import config_context, get_config -from imblearn.base import _ParamsValidationMixin -from imblearn.utils._param_validation import ( - HasMethods, - Hidden, - Interval, - InvalidParameterError, - MissingValues, - Options, - RealNotInt, - StrOptions, - _ArrayLikes, - _Booleans, - _Callables, - _CVObjects, - _InstancesOf, - _IterablesNotString, - _NanConstraint, - _NoneConstraint, - _PandasNAConstraint, - _RandomStates, - _SparseMatrices, - _VerboseHelper, - generate_invalid_param_val, - generate_valid_param, - make_constraint, - validate_params, -) -from imblearn.utils.fixes import _fit_context - - -# Some helpers for the tests -@validate_params( - {"a": [Real], "b": [Real], "c": [Real], "d": [Real]}, - prefer_skip_nested_validation=True, -) -def _func(a, b=0, *args, c, d=0, **kwargs): - """A function to test the validation of functions.""" - - -class _Class: - """A class to test the _InstancesOf constraint and the validation of methods.""" - - @validate_params({"a": [Real]}, prefer_skip_nested_validation=True) - def _method(self, a): - """A validated method""" - - @deprecated() - @validate_params({"a": [Real]}, prefer_skip_nested_validation=True) - def _deprecated_method(self, a): - """A deprecated validated method""" - - -class _Estimator(_ParamsValidationMixin, BaseEstimator): - """An estimator to test the validation of estimator parameters.""" - - _parameter_constraints: dict = {"a": [Real]} - - def __init__(self, a): - self.a = a - - @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X=None, y=None): - pass - - -@pytest.mark.parametrize("interval_type", [Integral, Real]) -def test_interval_range(interval_type): - """Check the range of values depending on closed.""" - interval = Interval(interval_type, -2, 2, closed="left") - assert -2 in interval - assert 2 not in interval - - interval = Interval(interval_type, -2, 2, closed="right") - assert -2 not in interval - assert 2 in interval - - interval = Interval(interval_type, -2, 2, closed="both") - assert -2 in interval - assert 2 in interval - - interval = Interval(interval_type, -2, 2, closed="neither") - assert -2 not in interval - assert 2 not in interval - - -@pytest.mark.parametrize("interval_type", [Integral, Real]) -def test_interval_large_integers(interval_type): - """Check that Interval constraint work with large integers. - - non-regression test for #26648. - """ - interval = Interval(interval_type, 0, 2, closed="neither") - assert 2**65 not in interval - assert 2**128 not in interval - assert float(2**65) not in interval - assert float(2**128) not in interval - - interval = Interval(interval_type, 0, 2**128, closed="neither") - assert 2**65 in interval - assert 2**128 not in interval - assert float(2**65) in interval - assert float(2**128) not in interval - - assert 2**1024 not in interval - - -def test_interval_inf_in_bounds(): - """Check that inf is included iff a bound is closed and set to None. - - Only valid for real intervals. - """ - interval = Interval(Real, 0, None, closed="right") - assert np.inf in interval - - interval = Interval(Real, None, 0, closed="left") - assert -np.inf in interval - - interval = Interval(Real, None, None, closed="neither") - assert np.inf not in interval - assert -np.inf not in interval - - -@pytest.mark.parametrize( - "interval", - [Interval(Real, 0, 1, closed="left"), Interval(Real, None, None, closed="both")], -) -def test_nan_not_in_interval(interval): - """Check that np.nan is not in any interval.""" - assert np.nan not in interval - - -@pytest.mark.parametrize( - "params, error, match", - [ - ( - {"type": Integral, "left": 1.0, "right": 2, "closed": "both"}, - TypeError, - r"Expecting left to be an int for an interval over the integers", - ), - ( - {"type": Integral, "left": 1, "right": 2.0, "closed": "neither"}, - TypeError, - "Expecting right to be an int for an interval over the integers", - ), - ( - {"type": Integral, "left": None, "right": 0, "closed": "left"}, - ValueError, - r"left can't be None when closed == left", - ), - ( - {"type": Integral, "left": 0, "right": None, "closed": "right"}, - ValueError, - r"right can't be None when closed == right", - ), - ( - {"type": Integral, "left": 1, "right": -1, "closed": "both"}, - ValueError, - r"right can't be less than left", - ), - ], -) -def test_interval_errors(params, error, match): - """Check that informative errors are raised for invalid combination of parameters""" - with pytest.raises(error, match=match): - Interval(**params) - - -def test_stroptions(): - """Sanity check for the StrOptions constraint""" - options = StrOptions({"a", "b", "c"}, deprecated={"c"}) - assert options.is_satisfied_by("a") - assert options.is_satisfied_by("c") - assert not options.is_satisfied_by("d") - - assert "'c' (deprecated)" in str(options) - - -def test_options(): - """Sanity check for the Options constraint""" - options = Options(Real, {-0.5, 0.5, np.inf}, deprecated={-0.5}) - assert options.is_satisfied_by(-0.5) - assert options.is_satisfied_by(np.inf) - assert not options.is_satisfied_by(1.23) - - assert "-0.5 (deprecated)" in str(options) - - -@pytest.mark.parametrize( - "type, expected_type_name", - [ - (int, "int"), - (Integral, "int"), - (Real, "float"), - (np.ndarray, "numpy.ndarray"), - ], -) -def test_instances_of_type_human_readable(type, expected_type_name): - """Check the string representation of the _InstancesOf constraint.""" - constraint = _InstancesOf(type) - assert str(constraint) == f"an instance of '{expected_type_name}'" - - -def test_hasmethods(): - """Check the HasMethods constraint.""" - constraint = HasMethods(["a", "b"]) - - class _Good: - def a(self): - pass # pragma: no cover - - def b(self): - pass # pragma: no cover - - class _Bad: - def a(self): - pass # pragma: no cover - - assert constraint.is_satisfied_by(_Good()) - assert not constraint.is_satisfied_by(_Bad()) - assert str(constraint) == "an object implementing 'a' and 'b'" - - -@pytest.mark.parametrize( - "constraint", - [ - Interval(Real, None, 0, closed="left"), - Interval(Real, 0, None, closed="left"), - Interval(Real, None, None, closed="neither"), - StrOptions({"a", "b", "c"}), - MissingValues(), - MissingValues(numeric_only=True), - _VerboseHelper(), - HasMethods("fit"), - _IterablesNotString(), - _CVObjects(), - ], -) -def test_generate_invalid_param_val(constraint): - """Check that the value generated does not satisfy the constraint""" - bad_value = generate_invalid_param_val(constraint) - assert not constraint.is_satisfied_by(bad_value) - - -@pytest.mark.parametrize( - "integer_interval, real_interval", - [ - ( - Interval(Integral, None, 3, closed="right"), - Interval(RealNotInt, -5, 5, closed="both"), - ), - ( - Interval(Integral, None, 3, closed="right"), - Interval(RealNotInt, -5, 5, closed="neither"), - ), - ( - Interval(Integral, None, 3, closed="right"), - Interval(RealNotInt, 4, 5, closed="both"), - ), - ( - Interval(Integral, None, 3, closed="right"), - Interval(RealNotInt, 5, None, closed="left"), - ), - ( - Interval(Integral, None, 3, closed="right"), - Interval(RealNotInt, 4, None, closed="neither"), - ), - ( - Interval(Integral, 3, None, closed="left"), - Interval(RealNotInt, -5, 5, closed="both"), - ), - ( - Interval(Integral, 3, None, closed="left"), - Interval(RealNotInt, -5, 5, closed="neither"), - ), - ( - Interval(Integral, 3, None, closed="left"), - Interval(RealNotInt, 1, 2, closed="both"), - ), - ( - Interval(Integral, 3, None, closed="left"), - Interval(RealNotInt, None, -5, closed="left"), - ), - ( - Interval(Integral, 3, None, closed="left"), - Interval(RealNotInt, None, -4, closed="neither"), - ), - ( - Interval(Integral, -5, 5, closed="both"), - Interval(RealNotInt, None, 1, closed="right"), - ), - ( - Interval(Integral, -5, 5, closed="both"), - Interval(RealNotInt, 1, None, closed="left"), - ), - ( - Interval(Integral, -5, 5, closed="both"), - Interval(RealNotInt, -10, -4, closed="neither"), - ), - ( - Interval(Integral, -5, 5, closed="both"), - Interval(RealNotInt, -10, -4, closed="right"), - ), - ( - Interval(Integral, -5, 5, closed="neither"), - Interval(RealNotInt, 6, 10, closed="neither"), - ), - ( - Interval(Integral, -5, 5, closed="neither"), - Interval(RealNotInt, 6, 10, closed="left"), - ), - ( - Interval(Integral, 2, None, closed="left"), - Interval(RealNotInt, 0, 1, closed="both"), - ), - ( - Interval(Integral, 1, None, closed="left"), - Interval(RealNotInt, 0, 1, closed="both"), - ), - ], -) -def test_generate_invalid_param_val_2_intervals(integer_interval, real_interval): - """Check that the value generated for an interval constraint does not satisfy any of - the interval constraints. - """ - bad_value = generate_invalid_param_val(constraint=real_interval) - assert not real_interval.is_satisfied_by(bad_value) - assert not integer_interval.is_satisfied_by(bad_value) - - bad_value = generate_invalid_param_val(constraint=integer_interval) - assert not real_interval.is_satisfied_by(bad_value) - assert not integer_interval.is_satisfied_by(bad_value) - - -@pytest.mark.parametrize( - "constraint", - [ - _ArrayLikes(), - _InstancesOf(list), - _Callables(), - _NoneConstraint(), - _RandomStates(), - _SparseMatrices(), - _Booleans(), - Interval(Integral, None, None, closed="neither"), - ], -) -def test_generate_invalid_param_val_all_valid(constraint): - """Check that the function raises NotImplementedError when there's no invalid value - for the constraint. - """ - with pytest.raises(NotImplementedError): - generate_invalid_param_val(constraint) - - -@pytest.mark.parametrize( - "constraint", - [ - _ArrayLikes(), - _Callables(), - _InstancesOf(list), - _NoneConstraint(), - _RandomStates(), - _SparseMatrices(), - _Booleans(), - _VerboseHelper(), - MissingValues(), - MissingValues(numeric_only=True), - StrOptions({"a", "b", "c"}), - Options(Integral, {1, 2, 3}), - Interval(Integral, None, None, closed="neither"), - Interval(Integral, 0, 10, closed="neither"), - Interval(Integral, 0, None, closed="neither"), - Interval(Integral, None, 0, closed="neither"), - Interval(Real, 0, 1, closed="neither"), - Interval(Real, 0, None, closed="both"), - Interval(Real, None, 0, closed="right"), - HasMethods("fit"), - _IterablesNotString(), - _CVObjects(), - ], -) -def test_generate_valid_param(constraint): - """Check that the value generated does satisfy the constraint.""" - value = generate_valid_param(constraint) - assert constraint.is_satisfied_by(value) - - -@pytest.mark.parametrize( - "constraint_declaration, value", - [ - (Interval(Real, 0, 1, closed="both"), 0.42), - (Interval(Integral, 0, None, closed="neither"), 42), - (StrOptions({"a", "b", "c"}), "b"), - (Options(type, {np.float32, np.float64}), np.float64), - (callable, lambda x: x + 1), - (None, None), - ("array-like", [[1, 2], [3, 4]]), - ("array-like", np.array([[1, 2], [3, 4]])), - ("sparse matrix", csr_matrix([[1, 2], [3, 4]])), - ("random_state", 0), - ("random_state", np.random.RandomState(0)), - ("random_state", None), - (_Class, _Class()), - (int, 1), - (Real, 0.5), - ("boolean", False), - ("verbose", 1), - ("nan", np.nan), - (MissingValues(), -1), - (MissingValues(), -1.0), - (MissingValues(), 2**1028), - (MissingValues(), None), - (MissingValues(), float("nan")), - (MissingValues(), np.nan), - (MissingValues(), "missing"), - (HasMethods("fit"), _Estimator(a=0)), - ("cv_object", 5), - ], -) -def test_is_satisfied_by(constraint_declaration, value): - """Sanity check for the is_satisfied_by method""" - constraint = make_constraint(constraint_declaration) - assert constraint.is_satisfied_by(value) - - -@pytest.mark.parametrize( - "constraint_declaration, expected_constraint_class", - [ - (Interval(Real, 0, 1, closed="both"), Interval), - (StrOptions({"option1", "option2"}), StrOptions), - (Options(Real, {0.42, 1.23}), Options), - ("array-like", _ArrayLikes), - ("sparse matrix", _SparseMatrices), - ("random_state", _RandomStates), - (None, _NoneConstraint), - (callable, _Callables), - (int, _InstancesOf), - ("boolean", _Booleans), - ("verbose", _VerboseHelper), - (MissingValues(numeric_only=True), MissingValues), - (HasMethods("fit"), HasMethods), - ("cv_object", _CVObjects), - ("nan", _NanConstraint), - ], -) -def test_make_constraint(constraint_declaration, expected_constraint_class): - """Check that make_constraint dispatches to the appropriate constraint class""" - constraint = make_constraint(constraint_declaration) - assert constraint.__class__ is expected_constraint_class - - -def test_make_constraint_unknown(): - """Check that an informative error is raised when an unknown constraint is passed""" - with pytest.raises(ValueError, match="Unknown constraint"): - make_constraint("not a valid constraint") - - -def test_validate_params(): - """Check that validate_params works no matter how the arguments are passed""" - with pytest.raises( - InvalidParameterError, match="The 'a' parameter of _func must be" - ): - _func("wrong", c=1) - - with pytest.raises( - InvalidParameterError, match="The 'b' parameter of _func must be" - ): - _func(*[1, "wrong"], c=1) - - with pytest.raises( - InvalidParameterError, match="The 'c' parameter of _func must be" - ): - _func(1, **{"c": "wrong"}) - - with pytest.raises( - InvalidParameterError, match="The 'd' parameter of _func must be" - ): - _func(1, c=1, d="wrong") - - # check in the presence of extra positional and keyword args - with pytest.raises( - InvalidParameterError, match="The 'b' parameter of _func must be" - ): - _func(0, *["wrong", 2, 3], c=4, **{"e": 5}) - - with pytest.raises( - InvalidParameterError, match="The 'c' parameter of _func must be" - ): - _func(0, *[1, 2, 3], c="four", **{"e": 5}) - - -def test_validate_params_missing_params(): - """Check that no error is raised when there are parameters without - constraints - """ - - @validate_params({"a": [int]}, prefer_skip_nested_validation=True) - def func(a, b): - pass - - func(1, 2) - - -def test_decorate_validated_function(): - """Check that validate_params functions can be decorated""" - decorated_function = deprecated()(_func) - - with pytest.warns(FutureWarning, match="Function _func is deprecated"): - decorated_function(1, 2, c=3) - - # outer decorator does not interfere with validation - with pytest.warns(FutureWarning, match="Function _func is deprecated"): - with pytest.raises( - InvalidParameterError, match=r"The 'c' parameter of _func must be" - ): - decorated_function(1, 2, c="wrong") - - -def test_validate_params_method(): - """Check that validate_params works with methods""" - with pytest.raises( - InvalidParameterError, match="The 'a' parameter of _Class._method must be" - ): - _Class()._method("wrong") - - # validated method can be decorated - with pytest.warns(FutureWarning, match="Function _deprecated_method is deprecated"): - with pytest.raises( - InvalidParameterError, - match="The 'a' parameter of _Class._deprecated_method must be", - ): - _Class()._deprecated_method("wrong") - - -def test_validate_params_estimator(): - """Check that validate_params works with Estimator instances""" - # no validation in init - est = _Estimator("wrong") - - with pytest.raises( - InvalidParameterError, match="The 'a' parameter of _Estimator must be" - ): - est.fit() - - -def test_stroptions_deprecated_subset(): - """Check that the deprecated parameter must be a subset of options.""" - with pytest.raises(ValueError, match="deprecated options must be a subset"): - StrOptions({"a", "b", "c"}, deprecated={"a", "d"}) - - -def test_hidden_constraint(): - """Check that internal constraints are not exposed in the error message.""" - - @validate_params( - {"param": [Hidden(list), dict]}, prefer_skip_nested_validation=True - ) - def f(param): - pass - - # list and dict are valid params - f({"a": 1, "b": 2, "c": 3}) - f([1, 2, 3]) - - with pytest.raises( - InvalidParameterError, match="The 'param' parameter" - ) as exc_info: - f(param="bad") - - # the list option is not exposed in the error message - err_msg = str(exc_info.value) - assert "an instance of 'dict'" in err_msg - assert "an instance of 'list'" not in err_msg - - -def test_hidden_stroptions(): - """Check that we can have 2 StrOptions constraints, one being hidden.""" - - @validate_params( - {"param": [StrOptions({"auto"}), Hidden(StrOptions({"warn"}))]}, - prefer_skip_nested_validation=True, - ) - def f(param): - pass - - # "auto" and "warn" are valid params - f("auto") - f("warn") - - with pytest.raises( - InvalidParameterError, match="The 'param' parameter" - ) as exc_info: - f(param="bad") - - # the "warn" option is not exposed in the error message - err_msg = str(exc_info.value) - assert "auto" in err_msg - assert "warn" not in err_msg - - -def test_validate_params_set_param_constraints_attribute(): - """Check that the validate_params decorator properly sets the parameter constraints - as attribute of the decorated function/method. - """ - assert hasattr(_func, "_skl_parameter_constraints") - assert hasattr(_Class()._method, "_skl_parameter_constraints") - - -def test_boolean_constraint_deprecated_int(): - """Check that validate_params raise a deprecation message but still passes - validation when using an int for a parameter accepting a boolean. - """ - - @validate_params({"param": ["boolean"]}, prefer_skip_nested_validation=True) - def f(param): - pass - - # True/False and np.bool_(True/False) are valid params - f(True) - f(np.bool_(False)) - - -def test_no_validation(): - """Check that validation can be skipped for a parameter.""" - - @validate_params( - {"param1": [int, None], "param2": "no_validation"}, - prefer_skip_nested_validation=True, - ) - def f(param1=None, param2=None): - pass - - # param1 is validated - with pytest.raises(InvalidParameterError, match="The 'param1' parameter"): - f(param1="wrong") - - # param2 is not validated: any type is valid. - class SomeType: - pass - - f(param2=SomeType) - f(param2=SomeType()) - - -def test_pandas_na_constraint_with_pd_na(): - """Add a specific test for checking support for `pandas.NA`.""" - pd = pytest.importorskip("pandas") - - na_constraint = _PandasNAConstraint() - assert na_constraint.is_satisfied_by(pd.NA) - assert not na_constraint.is_satisfied_by(np.array([1, 2, 3])) - - -def test_iterable_not_string(): - """Check that a string does not satisfy the _IterableNotString constraint.""" - constraint = _IterablesNotString() - assert constraint.is_satisfied_by([1, 2, 3]) - assert constraint.is_satisfied_by(range(10)) - assert not constraint.is_satisfied_by("some string") - - -def test_cv_objects(): - """Check that the _CVObjects constraint accepts all current ways - to pass cv objects.""" - constraint = _CVObjects() - assert constraint.is_satisfied_by(5) - assert constraint.is_satisfied_by(LeaveOneOut()) - assert constraint.is_satisfied_by([([1, 2], [3, 4]), ([3, 4], [1, 2])]) - assert constraint.is_satisfied_by(None) - assert not constraint.is_satisfied_by("not a CV object") - - -def test_third_party_estimator(): - """Check that the validation from a scikit-learn estimator inherited by a third - party estimator does not impose a match between the dict of constraints and the - parameters of the estimator. - """ - - class ThirdPartyEstimator(_Estimator): - def __init__(self, b): - self.b = b - super().__init__(a=0) - - def fit(self, X=None, y=None): - super().fit(X, y) - - # does not raise, even though "b" is not in the constraints dict and "a" is not - # a parameter of the estimator. - ThirdPartyEstimator(b=0).fit() - - -def test_interval_real_not_int(): - """Check for the type RealNotInt in the Interval constraint.""" - constraint = Interval(RealNotInt, 0, 1, closed="both") - assert constraint.is_satisfied_by(1.0) - assert not constraint.is_satisfied_by(1) - - -def test_real_not_int(): - """Check for the RealNotInt type.""" - assert isinstance(1.0, RealNotInt) - assert not isinstance(1, RealNotInt) - assert isinstance(np.float64(1), RealNotInt) - assert not isinstance(np.int64(1), RealNotInt) - - -def test_skip_param_validation(): - """Check that param validation can be skipped using config_context.""" - - @validate_params({"a": [int]}, prefer_skip_nested_validation=True) - def f(a): - pass - - with pytest.raises(InvalidParameterError, match="The 'a' parameter"): - f(a="1") - - # does not raise - with config_context(skip_parameter_validation=True): - f(a="1") - - -@pytest.mark.parametrize("prefer_skip_nested_validation", [True, False]) -def test_skip_nested_validation(prefer_skip_nested_validation): - """Check that nested validation can be skipped.""" - - @validate_params({"a": [int]}, prefer_skip_nested_validation=True) - def f(a): - pass - - @validate_params( - {"b": [int]}, - prefer_skip_nested_validation=prefer_skip_nested_validation, - ) - def g(b): - # calls f with a bad parameter type - return f(a="invalid_param_value") - - # Validation for g is never skipped. - with pytest.raises(InvalidParameterError, match="The 'b' parameter"): - g(b="invalid_param_value") - - if prefer_skip_nested_validation: - g(b=1) # does not raise because inner f is not validated - else: - with pytest.raises(InvalidParameterError, match="The 'a' parameter"): - g(b=1) - - -@pytest.mark.parametrize( - "skip_parameter_validation, prefer_skip_nested_validation, expected_skipped", - [ - (True, True, True), - (True, False, True), - (False, True, True), - (False, False, False), - ], -) -def test_skip_nested_validation_and_config_context( - skip_parameter_validation, prefer_skip_nested_validation, expected_skipped -): - """Check interaction between global skip and local skip.""" - - @validate_params( - {"a": [int]}, prefer_skip_nested_validation=prefer_skip_nested_validation - ) - def g(a): - return get_config()["skip_parameter_validation"] - - with config_context(skip_parameter_validation=skip_parameter_validation): - actual_skipped = g(1) - - assert actual_skipped == expected_skipped diff --git a/imblearn/utils/tests/test_validation.py b/imblearn/utils/tests/test_validation.py index 4394f04fc..c2f5e04b2 100644 --- a/imblearn/utils/tests/test_validation.py +++ b/imblearn/utils/tests/test_validation.py @@ -133,7 +133,7 @@ def test_check_sampling_strategy_error_wrong_string( ): with pytest.raises( ValueError, - match=("'{}' cannot be used with {}".format(sampling_strategy, err_msg)), + match="'{}' cannot be used with {}".format(sampling_strategy, err_msg), ): check_sampling_strategy(sampling_strategy, np.array([1, 2, 3]), sampling_type) diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 000000000..c922d9fe6 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,18875 @@ +version: 6 +environments: + ci-py310-min-dependencies: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py310h3406613_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.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/scikit-learn-1.4.2-py310h981052a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py310hb13e2d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py310h929a2ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-1.25.2-py310h7451ae0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.18-h93e8a92_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.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/scikit-learn-1.4.2-py310h9d65eca_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.4-py310h3f1db6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py310h5f69134_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-1.25.2-py310haa1e00c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.18-h6cefb37_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.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/scikit-learn-1.4.2-py310h64e73be_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.4-py310h2b794db_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py310hdb0e946_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.25.2-py310hd02465a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.18-h8c5b53a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py310hf2a6c47_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.4-py310hf667824_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py310-min-keras: + 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/absl-py-2.3.1-pyhd8ed1ab_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/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py310h3406613_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py310hea1e86d_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.1-py310h5eaa309_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310hb13e2d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py310h03d9f68_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py310h228f341_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_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/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py310h929a2ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py310hfb1d5ec_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.5.1-py310h96a9d13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310h4bfa8fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py310h50c4e7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.18-h93e8a92_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py310hed48b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py310hef62574_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_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/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py310h5f69134_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py310h758c3a9_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.1-py310h5936506_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310hd45542a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py310hc9b05e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.18-h6cefb37_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py310hce580d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py310h32ab4ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ + ci-py310-min-optional-dependencies: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py310h3406613_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.3-py310h7cbd5c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.4.2-py310h981052a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py310hb13e2d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py310h929a2ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-1.25.2-py310h7451ae0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.0.3-py310h5e4fcda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.18-h93e8a92_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.4.2-py310h9d65eca_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.4-py310h3f1db6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py310h5f69134_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-1.25.2-py310haa1e00c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.0.3-py310h1cdf563_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.18-h6cefb37_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.4.2-py310h64e73be_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.4-py310h2b794db_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py310hdb0e946_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.25.2-py310hd02465a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.0.3-py310h1c4a608_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.18-h8c5b53a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py310hf2a6c47_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.4-py310hf667824_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py310-min-tensorflow: + 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/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py310h3406613_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.3.25-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.62.2-py310h1b8f574_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py310hea1e86d_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.3.2-py310hcc13569_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310hb13e2d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py310h03d9f68_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-4.25.3-py310h0e2eeba_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py310h228f341_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.16.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py310h6c63255_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.16.1-cpu_py310h49b650b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.16.1-cpu_py310h224022f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.16.1-cpu_py310hc6dcfef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py310h7c4b9e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h6954a95_3.conda + - 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-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py310h929a2ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.3.25-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.62.2-py310h271164d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py310hfb1d5ec_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240116.2-cxx17_hf036a51_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.62.2-h384b2fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-4.25.3-hd4aba4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2023.09.01-h81f5012_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py310h8e2f543_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.3.2-py310h276d7da_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310h4bfa8fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py310h50c4e7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-4.25.3-py310h533c97b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.18-h93e8a92_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2023.09.01-hb168e87_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py310hed48b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py310hef62574_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.16.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py310h38cfc11_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.16.1-cpu_py310hf35338a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.16.1-cpu_py310h3690a3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.16.1-cpu_py310h0134bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py310h1b7cace_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310hbb8c376_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310h853098b_3.conda + - 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-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py310h5f69134_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.3.25-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.62.2-py310hf7687f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py310h758c3a9_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240116.2-cxx17_h00cdb27_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.62.2-h9c18a4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.25.3-hc39d83c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2023.09.01-h7b2c953_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-hf8de324_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.3.2-py310h401b61c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-1.26.4-py310hd45542a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py310hc9b05e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-4.25.3-py310ha1b16c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.18-h6cefb37_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2023.09.01-h4cba328_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py310hce580d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py310h32ab4ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.16.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py310hddb97a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.16.1-cpu_py310h5a6a72a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.16.1-cpu_py310hf600a1e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.16.1-cpu_py310h85e80fb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py310h7bdd564_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h078409c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ + ci-py311-latest-keras: + 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/absl-py-2.3.1-pyhd8ed1ab_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/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py311h7f87ba5_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.10.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.1-py311h7db5c69_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py311hdf67eae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py311hc3e1efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_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/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py311hd4bf892_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.10.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.5.1-py311hcf53e2f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py311hd4d69bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py311he6af739_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py311h8688b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_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/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py311h8470beb_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.10.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.1-py311hca32420_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py311h57a9ea7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py311hb5ee8ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311hffedffa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ + ci-py311-latest-tensorflow: + 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/_x86_64-microarch-level-1-2_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.12.23-h8f4948b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py311h9789449_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py311h7f87ba5_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.18.0-cpu_h739b781_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.18.0-cpu_h417b707_1.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/libxcrypt-4.4.36-hd590300_1.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/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py311h7db5c69_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py311hdf67eae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py311hfdbb021_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py311hc3e1efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py311hafd3f86_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py311h6ac8430_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py311h726d943_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py311h6310aac_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hc356e98_3.conda + - 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-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.12.23-hd70532e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py311ha489736_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py311hd4bf892_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_cc-2.18.0-cpu_hce6ddfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_framework-2.18.0-cpu_h38b2b02_1.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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311ha3cf9ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py311haeb46be_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py311hd4d69bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py311hc356e98_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py311he6af739_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py311h8688b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py311h968b48f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py311h69da8e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py311h8bba074_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py311hc2375f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py311h13e5629_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py311h4d7f069_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311h155a34a_3.conda + - 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-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.12.23-h28594ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py311ha413f7a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py311h8470beb_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_cc-2.18.0-cpu_hf321e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.18.0-cpu_h2398287_1.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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py311h9cb3ce9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py311h57a9ea7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py311h155a34a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py311hb5ee8ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311hffedffa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py311h544b224_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py311h9d3d1e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py311h5147c6a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py311h61c9c21_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py311h3696347_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h917b07b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ + ci-py311-sklearn-1-4: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.4.2-py311he08f58d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.4.2-py311h3c3ac6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py311h0c91ca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.4.2-py311hbfb48bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py311h0675101_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py311h3f79411_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311hdcb8d17_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py311h99d06ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py311-sklearn-1-5: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.5.2-py311h57cc02b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.5.2-py311ha1d5734_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py311h0c91ca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.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/scikit-learn-1.5.2-py311h9e23f0f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py311h0675101_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py311h3f79411_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.5.2-py311hdcb8d17_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py311h99d06ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py312-sklearn-1-6: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.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/scikit-learn-1.6.1-py312h7a48858_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py312h3d55d04_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py312hda18a35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_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/scikit-learn-1.6.1-py312he1a5313_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py312hd04560d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py312h6daa0e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py312h2f38b44_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.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/scikit-learn-1.6.1-py312h39203ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py312h99a188d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py312ha72d056_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py312h816cc57_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py312h451d5c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py313-latest-dependencies: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_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/scikit-learn-1.7.1-py313h06d4379_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py313h3a520b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py313h4db2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py313hdb1a8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.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/scikit-learn-1.7.1-py313hbe0a5c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py313hada7951_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py313ha0c97b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py313h674b998_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_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/scikit-learn-1.7.1-py313h595da1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h74efe86_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.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.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py313he28f1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h22ae3c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + ci-py313-latest-optional-dependencies: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py313h08cd8bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py313h06d4379_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py313h3a520b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py313h4db2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py313hdb1a8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py313h366a99e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py313hbe0a5c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py313hada7951_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py313ha0c97b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py313h674b998_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py313hd1f53c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py313h595da1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h74efe86_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_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/coverage-7.10.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.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.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.1-py313hc90dcd4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py313he28f1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h22ae3c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + default: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_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/scikit-learn-1.7.1-py313h06d4379_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py313h3a520b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py313hdb1a8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.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/scikit-learn-1.7.1-py313hbe0a5c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py313hada7951_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py313h674b998_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_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/scikit-learn-1.7.1-py313h595da1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h74efe86_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.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.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py313he28f1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h22ae3c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + dev: + 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/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_x86_64-microarch-level-1-2_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py311h38be061_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.13-py311hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py311h8488d03_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.12.23-h8f4948b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py311h9789449_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py311h7f87ba5_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.4.1-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_hddf928d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.8-default_ha444ac7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.3-hf39c6af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.8-hecd9e04_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.18.0-cpu_h739b781_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.18.0-cpu_h417b707_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.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/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.11.0-he8b52b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h04c0eec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h7a3aeb2_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/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.5-py311h38be061_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py311h0f3be63_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py311h7db5c69_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.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/namex-0.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.0-py39hd511f7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py311hdf67eae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py311hed34c8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_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/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py311hfdbb021_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py311h38be061_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.1-py311h846acb3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py311hc251a9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.1-h6ac528c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py311h902ca64_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.8-py311hae69bc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py311hc3e1efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.5-py311hb0beb2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py311hafd3f86_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py311h6ac8430_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py311h726d943_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py311h6310aac_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.1.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-25.1.0-py311h13e5629_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hc356e98_3.conda + - 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-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cmarkgfm-2024.11.20-py311h4d7f069_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py311hd4d69bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.13-py311hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.12.23-hd70532e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.59.0-py311hfbe4617_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py311ha489736_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py311hd4bf892_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh92f572d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py311ha94bed4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.24-hcc1b750_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libfreetype-2.13.3-h694c41f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.13.3-h40dfd5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_cc-2.18.0-cpu_hce6ddfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_framework-2.18.0-cpu_h38b2b02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h59ddb5d_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311ha3cf9ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.5-py311h6eed73b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.5-py311h249d4ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py311haeb46be_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.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/namex-0.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.3.0-py39ha61a9bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h036ada5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py311hd4d69bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py311hf4bc098_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_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/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.3.0-py311h25da234_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py311hc356e98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py311h4d7f069_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py311h6eed73b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py311h2f44256_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hfbc4093_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py311ha3cf9ac_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-27.0.1-py311h2ea2559_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.0-py311hd3d88a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.8-py311h9a97b26_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py311he6af739_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py311h8688b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/statsmodels-0.14.5-py311ha2d3830_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py311h968b48f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py311h69da8e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py311h8bba074_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py311hc2375f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.1.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311hf2f7c97_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-16.0.0-py311h4d7f069_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py311h13e5629_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py311h4d7f069_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py311h3696347_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311h155a34a_3.conda + - 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-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py311h57a9ea7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.13-py311hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.12.23-h28594ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.59.0-py311h2fe624c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.13.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py311ha413f7a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py311h8470beb_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh92f572d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py311h63e5c0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libfreetype-2.13.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.13.3-h1d14073_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_cc-2.18.0-cpu_hf321e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.18.0-cpu_h2398287_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h025e3ab_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.5-py311ha1ab1f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py311h66dac5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py311h9cb3ce9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.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/namex-0.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.0-py39h24c5d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py311h57a9ea7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py311hff7e5bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_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/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py311hb9ba9e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py311h155a34a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py311h267d04e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py311hf0763de_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hab620ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.0.1-py311h2637eca_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.0-py311h1c3fc1a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.8-py311hd374d79_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py311hb5ee8ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311hffedffa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.5-py311h9dc9093_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py311h544b224_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py311h9d3d1e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py311h5147c6a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py311h61c9c21_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.1.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-16.0.0-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py311h3696347_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h917b07b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: ./ + docs: + 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/_x86_64-microarch-level-1-2_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.12.23-h8f4948b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py312hacea422_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py312h3faca00_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.4.1-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_hddf928d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.8-default_ha444ac7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.3-hf39c6af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.8-hecd9e04_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.18.0-cpu_h739b781_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.18.0-cpu_h417b707_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.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/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.11.0-he8b52b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h04c0eec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h7a3aeb2_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/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.5-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py312hf9745cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py312hf79963d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.1-py312hdb827e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.1-h6ac528c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py312h4f0b9e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.5-py312h8b63200_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312hda17c39_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py312h69ecde4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py312h11d59fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py312h651dbe2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312haafddd8_3.conda + - 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-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hedd4973_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.12.23-hd70532e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.59.0-py312h3d55d04_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py312h145213c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py312h4eb4aaa_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py312hef387a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h6e16a3a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.24-hcc1b750_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libfreetype-2.13.3-h694c41f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.13.3-h40dfd5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_cc-2.18.0-cpu_hce6ddfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_framework-2.18.0-cpu_h38b2b02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h59ddb5d_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312h3520af0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.5-py312hb401068_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.5-py312hb83d5b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py312h98e817e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312hda18a35_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h036ada5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py312hedd4973_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py312hbf2c5ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.3.0-py312hd9f36e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py312haafddd8_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/osx-64/pthread-stubs-0.4-h00291cd_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312h3520af0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py312hf34d0c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py312h594e5de_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/statsmodels-0.14.5-py312h34a05c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py312h83535b2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py312hf9ba072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py312h7973d44_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py312hd6a94b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-16.0.0-py312h01d7ebd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py312h2f459f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h01d7ebd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hd8f9ff3_3.conda + - 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-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312ha0dd364_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.12.23-h28594ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.59.0-py312h6daa0e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.13.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py312he4e58e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py312h35183de_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py312hdc12c9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-h5505292_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libfreetype-2.13.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.13.3-h1d14073_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_cc-2.18.0-cpu_hf321e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.18.0-cpu_h2398287_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h025e3ab_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.5-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py312h05635fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py312hcd31e36_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312h2f38b44_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py312ha0dd364_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py312h98f7732_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py312h54d6233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py312h286a95b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.5-py312hcde60ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h5fad481_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py312hb6b62e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py312h81ab8d0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py312h5e86b3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-16.0.0-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py312h163523d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ + linters: + 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/black-23.3.0-py311h38be061_1.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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.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/libxcrypt-4.4.36-hd590300_1.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/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/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.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.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.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.4.8-py311hae69bc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py311hc3e1efb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.2-py311h09fcace_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.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.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py311ha3cf9ac_2.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.4.8-py311h9a97b26_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py311he6af739_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py311h8688b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311hf2f7c97_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py311h0856f98_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.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.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.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.4.8-py311hd374d79_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py311hb5ee8ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311hffedffa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - pypi: ./ + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py311h1ea47a8_1.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.8.3-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311he736701_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-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/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.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/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.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.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.8-py311ha637bb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py311h8a15ebc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py311ha4356f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_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/ukkonen-1.0.1-py311h3257749_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - pypi: ./ + optional: + 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.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.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/libxcrypt-4.4.36-hd590300_1.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/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py312hf79963d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py312h4f0b9e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_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/llvm-openmp-20.1.8-hf4e0ed4_1.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/numpy-2.3.2-py312hda18a35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py312hbf2c5ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py312hf34d0c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py312h594e5de_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_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/llvm-openmp-20.1.8-hbb9b287_1.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/numpy-2.3.2-py313h674b998_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py313hd1f53c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.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/scikit-learn-1.7.1-py313h595da1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h74efe86_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - 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.8.3-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_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/libhwloc-2.12.1-default_h88281d1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.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.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.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/llvm-openmp-20.1.8-hfa2b4ca_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.1-py313hc90dcd4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py313he28f1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h22ae3c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.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-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - pypi: ./ + tests: + 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/_x86_64-microarch-level-1-2_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.12.23-h8f4948b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py312hacea422_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py312h3faca00_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.18.0-cpu_h739b781_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.18.0-cpu_h417b707_1.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/libxcrypt-4.4.36-hd590300_1.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/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py312hf9745cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py312h4f0b9e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312hda17c39_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py312h69ecde4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py312h11d59fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py312h651dbe2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312haafddd8_3.conda + - 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-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py312h3d55d04_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.12.23-hd70532e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py312h145213c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py312h4eb4aaa_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_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/libgfortran-15.1.0-h5f6db21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_cc-2.18.0-cpu_hce6ddfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_framework-2.18.0-cpu_h38b2b02_1.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/llvm-openmp-20.1.8-hf4e0ed4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312h3520af0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py312h98e817e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312hda18a35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py312hedd4973_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py312haafddd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py312hf34d0c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py312h594e5de_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py312h83535b2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py312hf9ba072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py312h7973d44_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py312hd6a94b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py312h2f459f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h01d7ebd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + - pypi: ./ + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hd8f9ff3_3.conda + - 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-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py312h6daa0e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.12.23-h28594ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py312he4e58e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py312h35183de_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_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/libgfortran-15.1.0-hfdf1602_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_cc-2.18.0-cpu_hf321e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.18.0-cpu_h2398287_1.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/llvm-openmp-20.1.8-hbb9b287_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py312hcd31e36_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_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/numpy-2.3.2-py312h2f38b44_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py312ha0dd364_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py312h54d6233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py312h286a95b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h5fad481_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py312hb6b62e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py312h81ab8d0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py312h5e86b3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py312h163523d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312hea69d52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: ./ +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + md5: aaa2a381ccc56eac91d63b6c1240312f + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + purls: [] + size: 8191 + timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/_x86_64-microarch-level-1-2_x86_64.conda + build_number: 2 + sha256: 7623b2b804165b458f520371c40f5a607847336a882a55d3cfbdfb6407082794 + md5: 989cfef32fc3e5fb397e87479bec3809 + depends: + - __archspec 1 x86_64 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7773 + timestamp: 1717599240447 +- conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda + sha256: ec7a804be25350c310be7e0fffdbf4006fd22a650bf316513bdd71cb922944bf + md5: 7d4f1ddc43d323c916b2c744835eb093 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/absl-py?source=hash-mapping + size: 109408 + timestamp: 1751547635237 +- conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + sha256: 1307719f0d8ee694fc923579a39c0621c23fdaa14ccdf9278a5aac5665ac58e9 + md5: 74ac5069774cdbc53910ec4d631a3999 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/accessible-pygments?source=hash-mapping + size: 1326096 + timestamp: 1734956217254 +- conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + sha256: 6c4456a138919dae9edd3ac1a74b6fbe5fd66c05675f54df2f8ab8c8d0cc6cea + md5: 1fd9696649f65fd6611fcdb4ffec738a + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/alabaster?source=hash-mapping + size: 18684 + timestamp: 1733750512696 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + sha256: b9214bc17e89bf2b691fad50d952b7f029f6148f4ac4fe7c60c08f093efdf745 + md5: 76df83c2a9035c54df5d04ff81bcc02d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 566531 + timestamp: 1744668655747 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.10.0-pyhe01879c_0.conda + sha256: d1b50686672ebe7041e44811eda563e45b94a8354db67eca659040392ac74d63 + md5: cc2613bfa71dec0eb2113ee21ac9ccbf + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.5 + - python + constrains: + - trio >=0.26.1 + - uvloop >=0.21 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio?source=hash-mapping + size: 134857 + timestamp: 1754315087747 +- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf + md5: 54898d0f524c9dee622d44bbb081a8ab + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/appnope?source=hash-mapping + size: 10076 + timestamp: 1733332433806 +- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad + md5: 8ac12aff0860280ee0cff7fa2cf63f3b + depends: + - argon2-cffi-bindings + - python >=3.9 + - typing-extensions + constrains: + - argon2_cffi ==999 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi?source=hash-mapping + size: 18715 + timestamp: 1749017288144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py311h49ec1c0_0.conda + sha256: d6d2f38ece253492a3e00800b5d4a5c2cc4b2de73b2c0fcc580c218f1cf58de6 + md5: 112c5e2b7fe99e3678bbd64316d38f0c + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.1 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 35657 + timestamp: 1753994819264 +- conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-25.1.0-py311h13e5629_0.conda + sha256: cab14d6bdcaf64f0911dcd994b51ddb753650d041a74c87a2107041763605e66 + md5: 8051f5bb22c95da482362f7a8c35fd68 + depends: + - __osx >=10.13 + - cffi >=1.0.1 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 33400 + timestamp: 1753995045262 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py311h3696347_0.conda + sha256: f5b4102716a568877e212a9d4c677027b887f215d4735acfe4532efb2da59de1 + md5: 3b4ba20f581ec2268df5a76c64232ae5 + depends: + - __osx >=11.0 + - cffi >=1.0.1 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 34325 + timestamp: 1753995031680 +- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_1.conda + sha256: c4b0bdb3d5dee50b60db92f99da3e4c524d5240aafc0a5fcc15e45ae2d1a3cd1 + md5: 46b53236fdd990271b03c3978d4218a9 + depends: + - python >=3.9 + - python-dateutil >=2.7.0 + - types-python-dateutil >=2.8.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/arrow?source=hash-mapping + size: 99951 + timestamp: 1733584345583 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 + md5: 8f587de4bcf981e26228f268df374a9b + depends: + - python >=3.9 + constrains: + - astroid >=2,<4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28206 + timestamp: 1733250564754 +- conda: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda + sha256: 7304f265f146235c34e24db310a94648aa306ca0b2a4a12042bf96da1881f99c + md5: d3f195dfdbbf736e4ec178bbec2a975c + depends: + - python >=3.9 + - six >=1.6.1,<2.0 + license: BSD-3-Clause AND PSF-2.0 + purls: + - pkg:pypi/astunparse?source=hash-mapping + size: 18143 + timestamp: 1736248194225 +- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda + sha256: 3b7233041e462d9eeb93ea1dfe7b18aca9c358832517072054bb8761df0c324b + md5: d9d0f99095a9bb7e3641bca8c6ad2ac7 + depends: + - python >=3.9 + - typing_extensions >=4.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/async-lru?source=hash-mapping + size: 17335 + timestamp: 1742153708859 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: a10d11958cadc13fdb43df75f8b1903f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=hash-mapping + size: 57181 + timestamp: 1741918625732 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + depends: + - python >=3.9 + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + size: 6938256 + timestamp: 1738490268466 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + md5: 767d508c1a67e02ae8f50e44cacfadb2 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7069 + timestamp: 1733218168786 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + sha256: a0f41db6d7580cec3c850e5d1b82cb03197dd49a3179b1cee59c62cd2c761b36 + md5: df837d654933488220b454c6a3b0fad6 + depends: + - backports + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/backports-tarfile?source=hash-mapping + size: 32786 + timestamp: 1733325872620 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + sha256: ddb0df12fd30b2d36272f5daf6b6251c7625d6a99414d7ea930005bbaecad06d + md5: 9f07c4fc992adb2d6c30da7fab3959a7 + depends: + - python >=3.9 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4?source=hash-mapping + size: 146613 + timestamp: 1744783307123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py311h38be061_1.conda + sha256: c729ebbdca2ca7286305ad51cc3beea6b85e68cd02794fb9895f3d5e16540b86 + md5: b0d621848bfba5aacbdfc43dfdeabfec + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 354716 + timestamp: 1682492111062 +- conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.conda + sha256: 78b007b394be2e0ddd42224970be1b212639a8941fee0e7d724986155e517e24 + md5: 2783c68e84c0573fece0880488c7c001 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 355441 + timestamp: 1682492328351 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.conda + sha256: 6968e8bcc232a32cd34934d14ada2a9a2549db7f8276ba9709eb16595e5545fd + md5: 6df8788f081abb97d20ffa83de27d029 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 355456 + timestamp: 1682492376012 +- conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py311h1ea47a8_1.conda + sha256: 12f319748c11697ee3ea154413c7c4895db2dfcc18b44b0bdb2019da1144abdb + md5: cff72d53d4ea05005adc2f478447a0a1 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 369420 + timestamp: 1682492626505 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd + md5: f0b4c8e370446ef89797608d60a564b3 + depends: + - python >=3.9 + - webencodings + - python + constrains: + - tinycss >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/bleach?source=hash-mapping + size: 141405 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + sha256: 0aba699344275b3972bd751f9403316edea2ceb942db12f9f493b63c74774a46 + md5: a30e9406c873940383555af4c873220d + depends: + - bleach ==6.2.0 pyh29332c3_4 + - tinycss2 + license: Apache-2.0 AND MIT + purls: [] + size: 4213 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda + sha256: c969baaa5d7a21afb5ed4b8dd830f82b78e425caaa13d717766ed07a61630bec + md5: 5d08a0ac29e6a5a984817584775d4131 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.1.0 hb9d3cd8_3 + - libbrotlidec 1.1.0 hb9d3cd8_3 + - libbrotlienc 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19810 + timestamp: 1749230148642 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h6e16a3a_3.conda + sha256: cd44fe22eeb1dec1ec52402f149faebb5f304f39bf59d97eb56f4c0f41e051d8 + md5: 44903b29bc866576c42d5c0a25e76569 + depends: + - __osx >=10.13 + - brotli-bin 1.1.0 h6e16a3a_3 + - libbrotlidec 1.1.0 h6e16a3a_3 + - libbrotlienc 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: [] + size: 19997 + timestamp: 1749230354697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-h5505292_3.conda + sha256: 97e2a90342869cc122921fdff0e6be2f5c38268555c08ba5d14e1615e4637e35 + md5: 03c7865dd4dbf87b7b7d363e24c632f1 + depends: + - __osx >=11.0 + - brotli-bin 1.1.0 h5505292_3 + - libbrotlidec 1.1.0 h5505292_3 + - libbrotlienc 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: [] + size: 20094 + timestamp: 1749230390021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda + sha256: ab74fa8c3d1ca0a055226be89e99d6798c65053e2d2d3c6cb380c574972cd4a7 + md5: 58178ef8ba927229fba6d84abf62c108 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.1.0 hb9d3cd8_3 + - libbrotlienc 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19390 + timestamp: 1749230137037 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h6e16a3a_3.conda + sha256: 52c29e70723387e9b4265b45ee1ae5ecb2db7bcffa58cdaa22fe24b56b0505bf + md5: a240d09be7c84cb1d33535ebd36fe422 + depends: + - __osx >=10.13 + - libbrotlidec 1.1.0 h6e16a3a_3 + - libbrotlienc 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: [] + size: 17239 + timestamp: 1749230337410 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-h5505292_3.conda + sha256: 5c6a808326c3bbb6f015a57c9eb463d65f259f67154f4f06783d8829ce9239b4 + md5: cc435eb5160035fd8503e9a58036c5b5 + depends: + - __osx >=11.0 + - libbrotlidec 1.1.0 h5505292_3 + - libbrotlienc 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: [] + size: 17185 + timestamp: 1749230373519 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda + sha256: 313cd446b1a42b55885741534800a1d69bd3816eeef662f41fc3ac26e16d537e + md5: 63d24a5dd21c738d706f91569dbd1892 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 351561 + timestamp: 1749230186849 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda + sha256: 4fab04fcc599853efb2904ea3f935942108613c7515f7dd57e7f034650738c52 + md5: 8565f7297b28af62e5de2d968ca32e31 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 350166 + timestamp: 1749230304421 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + sha256: dc27c58dc717b456eee2d57d8bc71df3f562ee49368a2351103bc8f1b67da251 + md5: a32e0c069f6c3dcac635f7b0b0dac67e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 351721 + timestamp: 1749230265727 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h6954a95_3.conda + sha256: 37d279d1dc96e8d7724d6b01e243a21b3ba47b047d6f61328ca67847b2df53fe + md5: edbc5225cf9117cf971f2685b3867b88 + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libbrotlicommon 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 366352 + timestamp: 1749230660474 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hc356e98_3.conda + sha256: 63f3771e23a1f3f9866ece0252586b5b57eefba8d83a2871a72c82716944cc7b + md5: 7259b2f4870cab602f1512562e5cbb30 + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 367210 + timestamp: 1749230581348 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312haafddd8_3.conda + sha256: d1a8635422d99b4b7cc1b35d62d1a5c392ae0a4d74e0a44bf190916a21180ba3 + md5: 11489c0fc22f550acf63da5e7ec7304d + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 367262 + timestamp: 1749230495846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310h853098b_3.conda + sha256: 0a14aeeafecf813e5406efd68725405ef89f0cf2cabb52822acd08741c066d3e + md5: de22f7dbf06b30e27a1f91031d2f5d94 + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - libbrotlicommon 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 338668 + timestamp: 1749230528849 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311h155a34a_3.conda + sha256: 7414997b02a5f07d0b089fb24f1e755347fd827fa5fd158681766fce9583dd9b + md5: ba41239b4753557a20cf2ac2cd4250c5 + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 338502 + timestamp: 1749230799184 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hd8f9ff3_3.conda + sha256: 35df7079768b4c51764149c42b14ccc25c4415e4365ecc06c38f74562d9e4d16 + md5: c7c728df70dc05a443f1e337c28de22d + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339365 + timestamp: 1749230606596 +- pypi: https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl + name: build + version: 1.3.0 + sha256: 7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 + requires_dist: + - packaging>=19.1 + - pyproject-hooks + - colorama ; os_name == 'nt' + - importlib-metadata>=4.6 ; python_full_version < '3.10.2' + - tomli>=1.1.0 ; python_full_version < '3.11' + - uv>=0.1.18 ; extra == 'uv' + - virtualenv>=20.11 ; python_full_version < '3.10' and extra == 'virtualenv' + - virtualenv>=20.17 ; python_full_version >= '3.10' and python_full_version < '3.14' and extra == 'virtualenv' + - virtualenv>=20.31 ; python_full_version >= '3.14' and extra == 'virtualenv' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 134188 + timestamp: 1720974491916 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 54927 + timestamp: 1720974860185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 206884 + timestamp: 1744127994291 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + sha256: b37f5dacfe1c59e0a207c1d65489b760dff9ddb97b8df7126ceda01692ba6e97 + md5: eafe5d9f1a8c514afe41e6e833f66dfd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 184824 + timestamp: 1744128064511 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b + md5: f8cd1beb98240c7edb1a95883360ccfa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 179696 + timestamp: 1744128058734 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + purls: [] + size: 154489 + timestamp: 1754210967212 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + purls: [] + size: 154402 + timestamp: 1754210968730 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + noarch: python + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + md5: 9b347a7ec10940d3f7941ff6c460b551 + depends: + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4134 + timestamp: 1615209571450 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + md5: 576d629e47797577ab0f1b351297ef4a + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cached-property?source=hash-mapping + size: 11065 + timestamp: 1615209567874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 + md5: 09262e66b19567aff4f592fb53b28760 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 978114 + timestamp: 1741554591855 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 11f59985f49df4620890f3e746ed7102 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 158692 + timestamp: 1754231530168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + sha256: 1b389293670268ab80c3b8735bc61bc71366862953e000efbb82204d00e41b6c + md5: 1fc24a3196ad5ede2a68148be61894f4 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 243532 + timestamp: 1725560630552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + sha256: bc47aa39c8254e9e487b8bcd74cfa3b4a3de3648869eb1a0b89905986b668e35 + md5: 55553ecd5328336368db611f350b7039 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 302115 + timestamp: 1725560701719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + sha256: a9a98a09031c4b5304ca04d29f9b35329e40a915e8e9c6431daee97c1b606d36 + md5: eefa80a0b01ffccf57c7c865bc6acfc4 + depends: + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 229844 + timestamp: 1725560765436 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py311h137bacd_0.conda + sha256: 012ee7b1ed4f9b0490d6e90c72decf148d7575173c7eaf851cd87fd434d2cacc + md5: a4b0f531064fa3dd5e3afbb782ea2cd5 + depends: + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 288762 + timestamp: 1725560945833 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + sha256: 94fe49aed25d84997e2630d6e776a75ee2a85bd64f258702c57faa4fe2986902 + md5: 5bbc69b8194fedc2792e451026cac34f + depends: + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 282425 + timestamp: 1725560725144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + sha256: 2cd81f5f8bb45f7625c232905e5f50f4f50a0cef651ec7143c6cf7d8d87bebcb + md5: 61ed55c277b0bdb5e6e67771f9e5b63e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 229224 + timestamp: 1725560797724 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h3a79f62_0.conda + sha256: 253605b305cc4548b8f97eb7c2e146697e0c7672b099c4862ec5ca7e8e995307 + md5: a42272c5dbb6ffbc1a5af70f24c7b448 + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 288211 + timestamp: 1725560745212 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311he736701_0.conda + sha256: 9689fbd8a31fdf273f826601e90146006f6631619767a67955048c7ad7798a1d + md5: e1c69be23bd05471a6c623e91680ad59 + depends: + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 297627 + timestamp: 1725561079708 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + sha256: d5696636733b3c301054b948cdd793f118efacce361d9bd4afb57d5980a9064f + md5: 57df494053e17dce2ac3a0b33e1b2a2e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 12973 + timestamp: 1734267180483 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + sha256: 838d5a011f0e7422be6427becba3de743c78f3874ad2743c341accbba9bb2624 + md5: 7e7d5ef1b9ed630e4a1c358d6bc62284 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 51033 + timestamp: 1754767444665 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + sha256: 8aee789c82d8fdd997840c952a586db63c6890b00e88c4fb6e80a38edd5f51c0 + md5: 94b550b8d3a614dbd326af798c7dfb40 + depends: + - __unix + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 87749 + timestamp: 1747811451319 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh7428d3b_0.conda + sha256: 20c2d8ea3d800485245b586a28985cba281dd6761113a49d7576f6db92a0a891 + md5: 3a59475037bc09da916e4062c5cad771 + depends: + - __win + - colorama + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 88117 + timestamp: 1747811467132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py311h9ecbd09_0.conda + sha256: 77b0f83acee81f90d6caf961334f0a560379eb0fc23dd8157ee22cb18ba0b3f4 + md5: e677422fa3118f3027040def9168ca99 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm?source=hash-mapping + size: 141391 + timestamp: 1732193340749 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cmarkgfm-2024.11.20-py311h4d7f069_0.conda + sha256: c99bfed6172a8e27fa3ace95814b2a0c44e4ebcf05003e5218f30d6dc3ff63b5 + md5: 000075831f8018d2cc8ca17c5412fb11 + depends: + - __osx >=10.13 + - cffi >=1.0.0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm?source=hash-mapping + size: 121119 + timestamp: 1732193433686 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-2024.11.20-py311h917b07b_0.conda + sha256: f65538524728218b082ffd0581bdcce883dc4b6ee8f94ad063d035eb404e432a + md5: b2ff5faf0d272264670630b62343a5e5 + depends: + - __osx >=11.0 + - cffi >=1.0.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm?source=hash-mapping + size: 113619 + timestamp: 1732193502710 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 + md5: 2da13f2b299d8e1995bafbbe9689a2f7 + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/comm?source=hash-mapping + size: 14690 + timestamp: 1753453984907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda + sha256: 883234cd86911ffc3d5e7ce8959930e11c56adf304e6ba26637364b049c917e8 + md5: 390f9e645ff2f4b9cf48d53b3cf6c942 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.25 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 292898 + timestamp: 1754063884923 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda + sha256: d9cb7f97a184a383bf0c72e1fa83b983a1caa68d7564f4449a4de7c97df9cb3f + md5: e25ed6c2e3b1effedfe9cd10a15ca8d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.25 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=compressed-mapping + size: 291827 + timestamp: 1754063770363 +- conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py311hd4d69bb_1.conda + sha256: fafce802dcf6a0a0dc11e6aed917972a69b5f6492d587f8f23757046aadf2970 + md5: 429a2ec9f5b2b122f91291bfeb8e64d5 + depends: + - __osx >=10.13 + - libcxx >=19 + - numpy >=1.25 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 267589 + timestamp: 1754063929948 +- conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hedd4973_1.conda + sha256: e9bef101ef00dc48aef43d2470b2adede37e30f5f8594d90f28272d508b777c4 + md5: a5cfae27fe77321e49fc4268f78b4a38 + depends: + - __osx >=10.13 + - libcxx >=19 + - numpy >=1.25 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 268369 + timestamp: 1754063947309 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py311h57a9ea7_1.conda + sha256: 414e879db0cca9b73b56b8480aa992abf5c1652dccac900c33228773b4fdab47 + md5: 506ebc9a0c6c904a2a84d4f2ebf98704 + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.25 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 257471 + timestamp: 1754064298990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312ha0dd364_1.conda + sha256: a51a6f7f7e236cadc45790880dc0b7c91cf6a950277ffe839b689f072783a8d0 + md5: e0b0bffaccf76ef33679dd2e5309442e + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.25 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 257410 + timestamp: 1754063952152 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py310h3406613_0.conda + sha256: 6163d00602de9937a5af06eefbf2a2c83e865d24c2efc8e55abf8f2f6ff8691e + md5: 075e8dd909720be418b6d94ed1b3d517 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 307426 + timestamp: 1754910431556 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py311h3778330_0.conda + sha256: 1da38824b3e4337f8bd3407936222677d6accc882a3badf39244600fc73f140e + md5: ad2711c0c4366177466c4bb7d3dd6809 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 390358 + timestamp: 1754910355203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py312h8a5da7c_0.conda + sha256: 9e170e3cebebedd2e685aac8cab09f3ad7489c7f9de2d014c1d46e4b4270ab28 + md5: 47633b6600c6ff2b4930b5b0b4704a53 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 381000 + timestamp: 1754910270194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.3-py313h3dea7bd_0.conda + sha256: f8fd0cb192e4d1a7c98c382d159fb1398f3c1bffee2ba82252f0fc74f5e6e6ef + md5: 8a6c0256d67a5688ba3605a9a0e318b3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 387953 + timestamp: 1754910179600 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py310h929a2ac_0.conda + sha256: 1609a3bb096e676d60ef8838277aa574e3702ae11e3dce8be5185958774546a5 + md5: 07c5f939ff35965320701e71c332db4a + depends: + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 306435 + timestamp: 1754910225469 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py311hfbe4617_0.conda + sha256: ecb904e0c9f92189b812829bbeebe0e5ccb51209b530fc79039c1bef905e7b82 + md5: 88349f87dd260b283a355e8b9f9d1dd3 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 387439 + timestamp: 1754910253101 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py312h3d55d04_0.conda + sha256: 0b910a46323eea648af45aef5bfaa14f53c70757b1d355cd025869d968039c8b + md5: 334cf736d7f601048d93266487913bb9 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 379783 + timestamp: 1754910128649 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.10.3-py313h4db2fa4_0.conda + sha256: 43f27bb1cbf4465bf475795a54be656158ba8b5ca47a51343ee3277c3672b3c1 + md5: fbc1267ff21ce6f83d3f203528ae427d + depends: + - __osx >=10.13 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 387361 + timestamp: 1754910297129 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py310h5f69134_0.conda + sha256: b1368934069e9afcfbbc4cbb7b75bb3da7ac093eaaadfa18f00aa169ac2c6e0e + md5: 28152e7dca3e12c29777d3ab6434b463 + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 306865 + timestamp: 1754910240302 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py311h2fe624c_0.conda + sha256: f7620644eb6c0ff98346945e0bf90de260ba88a5ec1434a57beb4a959f1df919 + md5: 5b942e2811cdfa67cb6f52d288c4989e + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 390480 + timestamp: 1754910277394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py312h6daa0e5_0.conda + sha256: 5395c4d622d56fbab9489136b7daf254d325fe2101bdb95f91c78dc88e0da2ad + md5: 724b721d0f9a50826207779456d2c172 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 380056 + timestamp: 1754910268875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.3-py313ha0c97b7_0.conda + sha256: fa5e64ec8ae433df8540906548247ba61c0f4d3b59182f40f7bd82954f0e64a6 + md5: 1c865f8cb4a588d394a8979be337d2fd + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 388940 + timestamp: 1754910481803 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.3-py310hdb0e946_0.conda + sha256: 255952213dce744c952042f87865947d431b69cbadae08de8d3a7c97ceac2729 + md5: ae729ad9cc463282ad54c8380576d799 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 332528 + timestamp: 1754910203529 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.3-py311h3f79411_0.conda + sha256: e046c26ed49e18fbaa258a5705691acec6aab8f2017e45ecea104a0d5e50c1be + md5: 19738e4a2b8c0f882769c4ecf2663b09 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 417255 + timestamp: 1754910324406 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.3-py312h05f76fc_0.conda + sha256: 9aece073f835373d95572db67a9a412bdca9c7aac83283517be3b3788b50be3a + md5: e539a0d708db866075cb03f692e7e10c + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 405974 + timestamp: 1754910371926 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.3-py313hd650c13_0.conda + sha256: ab2cafef225674e7d098661edc389ec434d9ae4ba40f7843ebc27caedaec78a0 + md5: 4b133690bf70e697f8a11fbbef7d1ad5 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 413476 + timestamp: 1754910297815 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.13-py311hd8ed1ab_0.conda + noarch: generic + sha256: ab70477f5cfb60961ba27d84a4c933a24705ac4b1736d8f3da14858e95bbfa7a + md5: 4666fd336f6d48d866a58490684704cd + depends: + - python >=3.11,<3.12.0a0 + - python_abi * *_cp311 + license: Python-2.0 + purls: [] + size: 47495 + timestamp: 1749048148121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-45.0.6-py311h8488d03_0.conda + sha256: e8afbd1c66514f6163168f00f981554126055a7cb64ae9464ed0c29fb09b8241 + md5: 0ffbf52c0881015b16fcd45a5e42f1f6 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.12 + - libgcc >=14 + - openssl >=3.5.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1659446 + timestamp: 1754473226324 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c + md5: 44600c4667a319d67dbe0681fc0bc833 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + size: 13399 + timestamp: 1733332563512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f + md5: cae723309a49399d2949362f4ab5c9e4 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libntlm >=1.8,<2.0a0 + - libstdcxx >=13 + - libxcrypt >=4.4.36 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + purls: [] + size: 209774 + timestamp: 1750239039316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 437860 + timestamp: 1747855126005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py311hc665b79_0.conda + sha256: 6756a97f58d71258537463851b8d65470eb5a654a7f2cfe2454f552a043d0f3a + md5: c6e461ca971ca858743101f4d73d7de4 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=compressed-mapping + size: 2729938 + timestamp: 1754523410012 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.16-py311hc651eee_0.conda + sha256: 54dcc946353860ab7a1850526cfee79b3f37a1740a3453fbdee4679c58356f77 + md5: 9d51e4f528d222d1bacde9793756ae1b + depends: + - python + - libcxx >=19 + - __osx >=10.13 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2665549 + timestamp: 1754523427493 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.16-py311ha59bd64_0.conda + sha256: 7fc4629c85a77ee9451250bb8927a021d1824591e7d71087e9d939120652b769 + md5: 5c8f35ae8f942259a3cdbc18d59f8cee + depends: + - python + - __osx >=11.0 + - python 3.11.* *_cpython + - libcxx >=19 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=compressed-mapping + size: 2666628 + timestamp: 1754523486167 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 + md5: 9ce473d1d1be1cc3810856a48b3fab32 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/decorator?source=hash-mapping + size: 14129 + timestamp: 1740385067843 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 + depends: + - python >=3.6 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/defusedxml?source=hash-mapping + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + sha256: 6d977f0b2fc24fee21a9554389ab83070db341af6d6f09285360b2e09ef8b26e + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=compressed-mapping + size: 275642 + timestamp: 1752823081585 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + sha256: fa5966bb1718bbf6967a85075e30e4547901410cc7cb7b16daf68942e9a94823 + md5: 24c1ca34138ee57de72a943237cde4cc + depends: + - python >=3.9 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + size: 402700 + timestamp: 1733217860944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda + sha256: 1bcc132fbcc13f9ad69da7aa87f60ea41de7ed4d09f3a00ff6e0e70e1c690bc2 + md5: bfd56492d8346d669010eccafe0ba058 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 69544 + timestamp: 1739569648873 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21284 + timestamp: 1746947398083 +- conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + sha256: 9abc6c128cd40733e9b24284d0462e084d4aff6afe614f0754aa8533ebe505e4 + md5: a71efeae2c160f6789900ba2631a2c90 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/execnet?source=hash-mapping + size: 38835 + timestamp: 1733231086305 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + sha256: 7510dd93b9848c6257c43fdf9ad22adf62e7aa6da5f12a6a757aed83bcfedf05 + md5: 81d30c08f9a3e556e8ca9e124b044d14 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/executing?source=hash-mapping + size: 29652 + timestamp: 1745502200340 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + sha256: de7b6d4c4f865609ae88db6fa03c8b7544c2452a1aa5451eb7700aad16824570 + md5: 4547b39256e296bb758166893e909a7c + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17887 + timestamp: 1741969612334 +- conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.12.23-h8f4948b_0.conda + sha256: 51f382565538abc750f7e9fb71a8774bc7d00dc351b70dab039534af1eaefcac + md5: db383f9fb349481841ed26f18d790058 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1534954 + timestamp: 1736587226820 +- conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-24.3.25-h59595ed_0.conda + sha256: 0f3b8d6a958d40d5b2ac105ba0ec09f61dd4ce78cafdf99ab2d0fc298dc54d75 + md5: 2941a8c4e4871cdfa738c8c1a7611533 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1459911 + timestamp: 1711467009850 +- conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.12.23-hd70532e_0.conda + sha256: 3d3d9d242c5ad60303637cbc858aa78c9a67ce94f82b740a56c2952f9084773e + md5: d4b89a999846df9400075aeffb83ed17 + depends: + - __osx >=10.13 + - libcxx >=18 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1341374 + timestamp: 1736587317636 +- conda: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-24.3.25-h73e2aa4_0.conda + sha256: 3648f1822b69a4212b368b0cfa266a77accaeb60794af2b90e4178c263b2abda + md5: 728a9638664ac180b3d970b3d04cf218 + depends: + - libcxx >=16 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1330937 + timestamp: 1711467455228 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.12.23-h28594ff_0.conda + sha256: 3eb3d471cda99c6b1de152078f784cac2f498620af1eeb2cc0f3407987810c55 + md5: b7b7a7a8a69ec7f3a7fccfbdab2352c0 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1281858 + timestamp: 1736587423115 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-24.3.25-hebf3989_0.conda + sha256: c95467f1ef83f358518cea13de8e00e3998427fc7f0dad5885f47c18aeb95ad4 + md5: f23852b1b71bc82768a6a33f6122efff + depends: + - libcxx >=16 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1280038 + timestamp: 1711467768202 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 265599 + timestamp: 1730283881107 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4102 + timestamp: 1566932280397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda + sha256: d82af0b7a12c6fdb30de81f83da5aba89ac8628744630dc67cd9cfc5eedadb3d + md5: 2eaecc2e416852815abb85dc47d425b3 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2929905 + timestamp: 1752723044834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda + sha256: ead830a4d12f26066f09b6ea54fb5c9e26a548c901063381412636db92cf7f61 + md5: 008d44a468c24a59d2e67c014fba8f12 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2854951 + timestamp: 1752723143 +- conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.59.0-py311hfbe4617_0.conda + sha256: 43a7a5105236ae7518f0af6042a30241644e60911da15437b5e286572c2a5813 + md5: 2308ace766561912a4ac2a0e3ae90a1c + depends: + - __osx >=10.13 + - brotli + - munkres + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2864633 + timestamp: 1752722967709 +- conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.59.0-py312h3d55d04_0.conda + sha256: 307eddc464d1ed3d019aa98532f57ec9f294f7406779bebbec40b5dc0e19130c + md5: 1ba85cdb649fba59ba7b65254d14bc28 + depends: + - __osx >=10.13 + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2796834 + timestamp: 1752722992690 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.59.0-py311h2fe624c_0.conda + sha256: a5c300985943f6aac4f74211b5d682908b855028def1712098bcacf1f183d3b3 + md5: 7cf0dbc391fd8ef40685e9ee0d099c4f + depends: + - __osx >=11.0 + - brotli + - munkres + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2843816 + timestamp: 1752723178898 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.59.0-py312h6daa0e5_0.conda + sha256: fb5dabc7db09891e611723622c762f625f287fc54d1f914497baf95b713513c3 + md5: 0fed8437f0bd51c23d4caa1a61fe7b3b + depends: + - __osx >=11.0 + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2794146 + timestamp: 1752723166136 +- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 + md5: d3549fd50d450b6d9e7dddff25dd2110 + depends: + - cached-property >=1.3.0 + - python >=3.9,<4 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/fqdn?source=hash-mapping + size: 16705 + timestamp: 1733327494780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda + sha256: 7ef7d477c43c12a5b4cddcf048a83277414512d1116aba62ebadfa7056a7d84f + md5: 9ccd736d31e0c6e41f54e704e5312811 + depends: + - libfreetype 2.13.3 ha770c72_1 + - libfreetype6 2.13.3 h48d6fc4_1 + license: GPL-2.0-only OR FTL + purls: [] + size: 172450 + timestamp: 1745369996765 +- conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda + sha256: e2870e983889eec73fdc0d4ab27d3f6501de4750ffe32d7d0a3a287f00bc2f15 + md5: 126dba1baf5030cb6f34533718924577 + depends: + - libfreetype 2.13.3 h694c41f_1 + - libfreetype6 2.13.3 h40dfd5c_1 + license: GPL-2.0-only OR FTL + purls: [] + size: 172649 + timestamp: 1745370231293 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.13.3-hce30654_1.conda + sha256: 6b63c72ea51a41d41964841404564c0729fdddd3e952e2715839fd759b7cfdfc + md5: e684de4644067f1956a580097502bf03 + depends: + - libfreetype 2.13.3 hce30654_1 + - libfreetype6 2.13.3 h1d14073_1 + license: GPL-2.0-only OR FTL + purls: [] + size: 172220 + timestamp: 1745370149658 +- conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.6.0-pyhd8ed1ab_0.conda + sha256: bab273e55303409508a67f8e8e34664a1219d322364ba4fbed67b5516c882986 + md5: 3fb76e88cbe6f96dfdaff277268bded9 + depends: + - python >=3.9 + constrains: + - pythran >=0.12.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/gast?source=hash-mapping + size: 24866 + timestamp: 1733299775623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff + md5: 3bf7b9fd5a7136126e0234db4b87c8b6 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 77248 + timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + sha256: 2c825df829097536314a195ae5cacaa8695209da6b4400135a65d8e23c008ff8 + md5: 03e8c9b4d3da5f3d6eabdd020c2d63ac + license: MIT + license_family: MIT + purls: [] + size: 74516 + timestamp: 1712692686914 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c + md5: 95fa1486c77505330c20f7202492b913 + license: MIT + license_family: MIT + purls: [] + size: 71613 + timestamp: 1712692611426 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda + sha256: 9f668fe562a9cf71a5d1f348645ac041af3f2e4bc634b18d6374e838e1c55dd8 + md5: 005b9749218cb8c9e94ac2a77ca3c8c0 + depends: + - python >=3.9 + - six + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/google-pasta?source=hash-mapping + size: 49210 + timestamp: 1733852592869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c + md5: 2cd94587f3a401ae05e03a6caf09539d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 99596 + timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.62.2-py310h1b8f574_0.conda + sha256: e09a98015bc215b02507f5af0499602ea9eaaf104d5cf0135305857eb13cb928 + md5: 21caec4bb6765fe65adc364b71a57aa6 + depends: + - libgcc-ng >=12 + - libgrpc 1.62.2 h15f2491_0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 1003053 + timestamp: 1713390837539 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py311h9789449_2.conda + sha256: d892a03ceaf4a850155cfde4518621942be3024fc6fe447a678e1a790a5bcdc3 + md5: 2e14634b5655043dc5260b6501301f65 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgrpc 1.67.1 h25350d4_2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 905963 + timestamp: 1740800182750 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.67.1-py312hacea422_2.conda + sha256: a69612b8619ff98bef8ed313204751b0d056d3f9e7bba21c6affdf1089bb7916 + md5: f15344009e4ae0f5e325e7027f8b5f00 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgrpc 1.67.1 h25350d4_2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 905816 + timestamp: 1740800114017 +- conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.62.2-py310h271164d_0.conda + sha256: b2300b5295667f374c345d2a86fd98cc074f63fc1866f75ba1c9905c23c63846 + md5: 85ee004347022bdcdfcd074f6f8047c9 + depends: + - __osx >=10.13 + - libcxx >=16 + - libgrpc 1.62.2 h384b2fc_0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 947303 + timestamp: 1713393021339 +- conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py311ha489736_2.conda + sha256: 9a57648471ff1c2bb77bfdef180097d5d35e10d0e1927357a5933a8217bafb40 + md5: f153d95f01531504b1cd18d65c67ef55 + depends: + - __osx >=10.13 + - libcxx >=18 + - libgrpc 1.67.1 h4896ac0_2 + - libzlib >=1.3.1,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 832226 + timestamp: 1740799704424 +- conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.67.1-py312h145213c_2.conda + sha256: 0a038d553c366f6177b4864603be7bce067c9202b32f9bd4fab5388730a69509 + md5: 5cde66c6535f44e6d0279d0731906d06 + depends: + - __osx >=10.13 + - libcxx >=18 + - libgrpc 1.67.1 h4896ac0_2 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 827142 + timestamp: 1740799253917 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.62.2-py310hf7687f1_0.conda + sha256: c02dfeffddf5e45ca8ec24c6130a9664dff583929b60b573fb429827fa57fbdc + md5: 620f17aeaa77ae3c8b3c6fce60a4f360 + depends: + - libcxx >=16 + - libgrpc 1.62.2 h9c18a4f_0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 933115 + timestamp: 1713393249932 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py311ha413f7a_2.conda + sha256: 5f2a2bb36c0919661e5c6af022bb2af2d60e511bcda1fffb9acfbf47fcd5fa6b + md5: 8175bf681a9fbc4f7ebfc1a23a02db3a + depends: + - __osx >=11.0 + - libcxx >=18 + - libgrpc 1.67.1 h0a426d6_2 + - libzlib >=1.3.1,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 824223 + timestamp: 1740786731918 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.67.1-py312he4e58e5_2.conda + sha256: f7ffc67cae79114a63f3da9ae1ff97e0719b82b8334d984f1bbc485d3673f960 + md5: 905296f2713c79017fc9ea11bd57ecfe + depends: + - __osx >=11.0 + - libcxx >=18 + - libgrpc 1.67.1 h0a426d6_2 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 814879 + timestamp: 1740786902083 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda + sha256: f64b68148c478c3bfc8f8d519541de7d2616bf59d44485a5271041d40c061887 + md5: 4b69232755285701bc86a5afe4d9933a + depends: + - python >=3.9 + - typing_extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/h11?source=hash-mapping + size: 37697 + timestamp: 1745526482242 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py310hea1e86d_100.conda + sha256: 8c7d6fea5345596f1fbef21b99fbc04cef6e7cfa5023619232da52fab80b554f + md5: f6879e3fc12006cffde701eb08ce1f09 + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=13 + - numpy >=1.21,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1234571 + timestamp: 1749298569022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py311h7f87ba5_100.conda + sha256: cd2bd076c9d9bd8d8021698159e694a8600d8349e3208719c422af2c86b9c184 + md5: ecfcdeb88c8727f3cf67e1177528a498 + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=13 + - numpy >=1.21,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1349405 + timestamp: 1749298469533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.14.0-nompi_py312h3faca00_100.conda + sha256: 9d23b72ee1138e14d379bb4c415cfdfc6944824e1844ff16ebf44e0defd1eddc + md5: 2e1c2a9e706c74c4dd6f990a680f3f90 + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=13 + - numpy >=1.21,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1319482 + timestamp: 1749298493941 +- conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py310hfb1d5ec_100.conda + sha256: 4dd34b0a74bb3a31b3e80d764ba53d8013e2af109349bce1d827634850b24c32 + md5: cb45120f270d43349fe2922808a061b0 + depends: + - __osx >=10.13 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1068052 + timestamp: 1749298545527 +- conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py311hd4bf892_100.conda + sha256: 2222dd7464ea109fca7a82cb1495f3925c97e09144c47b0fefd544629e6d4847 + md5: 8aa902bc6ca57bfb55655e2b74bdea9f + depends: + - __osx >=10.13 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1165328 + timestamp: 1749298530148 +- conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.14.0-nompi_py312h4eb4aaa_100.conda + sha256: 3a725e19634c3b195c3a7815f4ff8636fdc4d43137c56ea579a3e27de8d59571 + md5: 88f581d43b4d9013fe3206d594dddf4b + depends: + - __osx >=10.13 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1155724 + timestamp: 1749298548872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py310h758c3a9_100.conda + sha256: 420996f9a2bd30f3646016ee7a261cd4488a2a108e59e94fdf012d228c991980 + md5: af831443bce24dff086729d416cd3186 + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1068314 + timestamp: 1749299564617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py311h8470beb_100.conda + sha256: ffb3cbe885a88ffd033cf9a40c05b6c115a7faa3ce87813645ffd064b3f04106 + md5: 6908dca831a0b62651a62c1408f4e564 + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1166678 + timestamp: 1749299603570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.14.0-nompi_py312h35183de_100.conda + sha256: efe9fa2971ea2bac9e261679b3269fa42ee5fe8cd50828efe3f6103645cec7fd + md5: 07503f79f7a89027f95a4ba1cede60f6 + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.21,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1162426 + timestamp: 1749299644895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.4.1-h15599e2_0.conda + sha256: b43e4f3c70eca82d733eb26bb8f031552f30fa4fb24c9455555a8a1baba6e1cc + md5: 7da3b5c281ded5bb6a634e1fe7d3272f + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=14 + - libglib >=2.84.3,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + purls: [] + size: 2435782 + timestamp: 1755172296497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda + sha256: 4f173af9e2299de7eee1af3d79e851bca28ee71e7426b377e841648b51d48614 + md5: c74d83614aec66227ae5199d98852aaf + depends: + - __glibc >=2.17,<3.0.a0 + - libaec >=1.1.4,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3710057 + timestamp: 1753357500665 +- conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc8237f9_103.conda + sha256: e41d22f672b1fbe713d22cf69630abffaee68bdb38a500a708fc70e6f639357f + md5: 3f1df98f96e0c369d94232712c9b87d0 + depends: + - __osx >=10.13 + - libaec >=1.1.4,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3522832 + timestamp: 1753358062940 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_he65715a_103.conda + sha256: 8948a63fc4a56536ce7b2716b781616c3909507300d26e9f265a3c13d59708a0 + md5: fcc9aca330f13d071bfc4de3d0942d78 + depends: + - __osx >=11.0 + - libaec >=1.1.4,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3308443 + timestamp: 1753356976982 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b + md5: 4f14640d58e2cc0aa0819d9d8ba125bb + depends: + - python >=3.9 + - h11 >=0.16 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=4.0,<5.0 + - certifi + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpcore?source=hash-mapping + size: 49483 + timestamp: 1745602916758 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpx?source=hash-mapping + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + md5: cc47e1facc155f91abd89b11e48e72ff + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12089150 + timestamp: 1692900650789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + sha256: f66362dc36178ac9b7c7a9b012948a9d2d050b3debec24bbd94aadbc44854185 + md5: 5cc301d759ec03f28328428e28f65591 + license: MIT + license_family: MIT + purls: [] + size: 11787527 + timestamp: 1692901622519 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + sha256: 2e64307532f482a0929412976c8450c719d558ba20c0962832132fd0d07ba7a7 + md5: d68d48a3060eb5abdc1cdc8e2a3a5966 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 11761697 + timestamp: 1720853679409 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1 + md5: 8521bd47c0e11c5902535bb1a17c565f + license: MIT + license_family: MIT + purls: [] + size: 11997841 + timestamp: 1692902104771 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + md5: d37314c8f553e3b4b44d113a0ee10196 + depends: + - python >=3.9 + - requests + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/id?source=hash-mapping + size: 24444 + timestamp: 1737528654512 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda + sha256: 7183512c24050c541d332016c1dd0f2337288faf30afc42d60981a49966059f7 + md5: 52083ce9103ec11c8130ce18517d3e83 + depends: + - python >=3.9 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 79080 + timestamp: 1754777609249 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 + md5: 7de5386c8fea29e76b303f37dde4c352 + depends: + - python >=3.4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/imagesize?source=hash-mapping + size: 10164 + timestamp: 1656939625410 +- pypi: ./ + name: imbalanced-learn + version: 0.14.dev0 + sha256: 1a206f84610c885a1716c569e4ca590a6f79ab90c468ace458a9254a273999ed + requires_dist: + - numpy>=1.25.2,<3 + - scipy>=1.11.4,<2 + - scikit-learn>=1.4.2,<2 + - joblib>=1.2.0,<2 + - threadpoolctl>=2.0.0,<4 + - ipykernel ; extra == 'dev' + - ipython ; extra == 'dev' + - jupyterlab ; extra == 'dev' + - pandas>=2.0.3,<3 ; extra == 'docs' + - tensorflow>=2.16.1,<3 ; extra == 'docs' + - matplotlib>=3.7.3,<4 ; extra == 'docs' + - seaborn>=0.12.2,<1 ; extra == 'docs' + - memory-profiler>=0.61.0,<1 ; extra == 'docs' + - numpydoc>=1.5.0,<2 ; extra == 'docs' + - sphinx>=8.0.2,<9 ; extra == 'docs' + - sphinx-gallery>=0.13.0,<1 ; extra == 'docs' + - sphinxcontrib-bibtex>=2.6.3,<3 ; extra == 'docs' + - sphinx-copybutton>=0.5.2,<1 ; extra == 'docs' + - pydata-sphinx-theme>=0.15.4,<1 ; extra == 'docs' + - sphinx-design>=0.6.1,<1 ; extra == 'docs' + - black==23.3.0 ; extra == 'linters' + - ruff==0.4.8 ; extra == 'linters' + - pre-commit ; extra == 'linters' + - pandas>=2.0.3,<3 ; extra == 'optional' + - tensorflow>=2.16.1,<3 ; extra == 'tensorflow' + - keras>=3.3.3,<4 ; extra == 'keras' + - packaging>=23.2,<25 ; extra == 'tests' + - pytest>=7.2.2,<9 ; extra == 'tests' + - pytest-cov>=4.1.0,<6 ; extra == 'tests' + - pytest-xdist>=3.5.0,<4 ; extra == 'tests' + requires_python: '>=3.10' + editable: true +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + depends: + - python >=3.9 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 34641 + timestamp: 1747934053147 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh82676e8_0.conda + sha256: cfc2c4e31dfedbb3d124d0055f55fda4694538fb790d52cd1b37af5312833e36 + md5: b0cc25825ce9212b8bee37829abad4d6 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.9 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 121367 + timestamp: 1754352984703 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.30.1-pyh92f572d_0.conda + sha256: ec80ed5f68c96dd46ff1b533b28d2094b6f07e2ec8115c8c60803920fdd6eb13 + md5: f208c1a85786e617a91329fa5201168c + depends: + - __osx + - appnope + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.9 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 121397 + timestamp: 1754353050327 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.4.0-pyhfa0c392_0.conda + sha256: ff5138bf6071ca01d84e1329f6baa96f0723df6fe183cfa1ab3ebc96240e6d8f + md5: cb7706b10f35e7507917cefa0978a66d + depends: + - __unix + - pexpect >4.3 + - decorator + - exceptiongroup + - ipython_pygments_lexers + - jedi >=0.16 + - matplotlib-inline + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 + - python >=3.11 + - stack_data + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 628259 + timestamp: 1751465044469 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 + md5: bd80ba060603cc228d9d81c257093119 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython-pygments-lexers?source=hash-mapping + size: 13993 + timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed + md5: 0b0154421989637d424ccf0f104be51a + depends: + - arrow >=0.15.0 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/isoduration?source=hash-mapping + size: 19832 + timestamp: 1733493720346 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + sha256: 3d16a0fa55a29fe723c918a979b2ee927eb0bf9616381cdfd26fa9ea2b649546 + md5: ade6b25a6136661dadd1a43e4350b10b + depends: + - more-itertools + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-classes?source=hash-mapping + size: 12109 + timestamp: 1733326001034 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + sha256: bfaba92cd33a0ae2488ab64a1d4e062bcf52b26a71f88292c62386ccac4789d7 + md5: bcc023a32ea1c44a790bbf1eae473486 + depends: + - backports.tarfile + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-context?source=hash-mapping + size: 12483 + timestamp: 1733382698758 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.2.1-pyhd8ed1ab_0.conda + sha256: f132ac71f89e3133fe159034ec85cec946c75f2c60e2039a8bbd1012721a785e + md5: c2c206c4054db7a655761c9e5bbb11f7 + depends: + - more-itertools + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-functools?source=hash-mapping + size: 16187 + timestamp: 1751918863003 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 + md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 + depends: + - parso >=0.8.3,<0.9.0 + - python >=3.9 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/jedi?source=hash-mapping + size: 843646 + timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + sha256: 00d37d85ca856431c67c8f6e890251e7cc9e5ef3724a0302b8d4a101f22aa27f + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jeepney?source=hash-mapping + size: 40015 + timestamp: 1740828380668 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + sha256: f1ac18b11637ddadc05642e8185a851c7fab5998c6f5470d716812fae943b2af + md5: 446bd6c8cb26050d528881df495ce646 + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112714 + timestamp: 1741263433881 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2 + sha256: 0c21351871df2c0a53168575597dd9c881e2a9fa4c42fe89a9bcd7fab37f462c + md5: 7583652522d71ad78ba536bba06940eb + depends: + - python >=3.6 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/joblib?source=hash-mapping + size: 210022 + timestamp: 1663332186018 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.1-pyhd8ed1ab_0.conda + sha256: e5a4eca9a5d8adfaa3d51e24eefd1a6d560cb3b33a7e1eee13e410bec457b7ed + md5: fb1c14694de51a476ce8636d92b6f42c + depends: + - python >=3.9 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/joblib?source=hash-mapping + size: 224437 + timestamp: 1748019237972 +- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.12.1-pyhd8ed1ab_0.conda + sha256: 4e08ccf9fa1103b617a4167a270768de736a36be795c6cd34c2761100d332f74 + md5: 0fc93f473c31a2f85c0bde213e7c63ca + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/json5?source=hash-mapping + size: 34191 + timestamp: 1755034963991 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py311h38be061_1.conda + sha256: 2f082f7b12a7c6824e051321c1029452562ad6d496ad2e8c8b7b3dea1c8feb92 + md5: 5ca76f61b00a15a9be0612d4d883badc + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 17645 + timestamp: 1725303065473 +- conda: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-3.0.0-py311h6eed73b_1.conda + sha256: 2499e5ebb3efa4186d6922122224d16bac791a5c0adad5b48b2bcd1e1e2afc8d + md5: b6c1710105dad14d47001a339cd14da6 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 17727 + timestamp: 1725302991176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py311h267d04e_1.conda + sha256: 736304347653ed421b13c56ba6f4f87c1d78d24cd3fa74db0db6fb70c814fa65 + md5: 5bce88ac1bef7d47c62cb574b25891ae + depends: + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 18253 + timestamp: 1725303181400 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.0-pyhe01879c_0.conda + sha256: 87ba7cf3a65c8e8d1005368b9aee3f49e295115381b7a0b180e56f7b68b5975f + md5: c6e3fd94e058dba67d917f38a11b50ab + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.9 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=compressed-mapping + size: 81493 + timestamp: 1752925388185 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda + sha256: 66fbad7480f163509deec8bd028cd3ea68e58022982c838683586829f63f3efa + md5: 41ff526b1083fde51fbdc93f29282e0e + depends: + - python >=3.9 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications?source=hash-mapping + size: 19168 + timestamp: 1745424244298 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.25.0-he01879c_0.conda + sha256: 72604d07afaddf2156e61d128256d686aee4a7bdc06e235d7be352955de7527a + md5: f4c7afaf838ab5bb1c4e73eb3095fb26 + depends: + - jsonschema >=4.25.0,<4.25.1.0a0 + - fqdn + - idna + - isoduration + - jsonpointer >1.13 + - rfc3339-validator + - rfc3986-validator >0.1.0 + - rfc3987-syntax >=1.1.0 + - uri-template + - webcolors >=24.6.0 + license: MIT + license_family: MIT + purls: [] + size: 4744 + timestamp: 1752925388185 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.6-pyhe01879c_0.conda + sha256: 6f2d6c5983e013af68e7e1d7082cc46b11f55e28147bd0a72a44488972ed90a3 + md5: 7129ed52335cc7164baf4d6508a3f233 + depends: + - importlib-metadata >=4.8.3 + - jupyter_server >=1.1.2 + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-lsp?source=compressed-mapping + size: 58416 + timestamp: 1752935193718 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + sha256: 56a7a7e907f15cca8c4f9b0c99488276d4cb10821d2d15df9245662184872e81 + md5: b7d89d860ebcda28a5303526cdee68ab + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 59562 + timestamp: 1748333186063 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + sha256: 37e6ac3ccf7afcc730c3b93cb91a13b9ae827fd306f35dd28f958a74a14878b5 + md5: f56000b36f09ab7533877e695e4e8cb0 + depends: + - jsonschema-with-format-nongpl >=4.18.0 + - packaging + - python >=3.9 + - python-json-logger >=2.0.4 + - pyyaml >=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator >=0.1.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-events?source=hash-mapping + size: 23647 + timestamp: 1738765986736 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.16.0-pyhe01879c_0.conda + sha256: 0082fb6f0afaf872affee4cde3b210f7f7497a5fb47f2944ab638fef0f0e2e77 + md5: f062e04d7cd585c937acbf194dceec36 + depends: + - anyio >=3.1.0 + - argon2-cffi >=21.1 + - jinja2 >=3.0.3 + - jupyter_client >=7.4.4 + - jupyter_core >=4.12,!=5.0.* + - jupyter_events >=0.11.0 + - jupyter_server_terminals >=0.4.4 + - nbconvert-core >=6.4.4 + - nbformat >=5.3.0 + - overrides >=5.0 + - packaging >=22.0 + - prometheus_client >=0.9 + - python >=3.9 + - pyzmq >=24 + - send2trash >=1.8.2 + - terminado >=0.8.3 + - tornado >=6.2.0 + - traitlets >=5.6.0 + - websocket-client >=1.7 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server?source=hash-mapping + size: 344376 + timestamp: 1747083217715 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_1.conda + sha256: 0890fc79422191bc29edf17d7b42cff44ba254aa225d31eb30819f8772b775b8 + md5: 2d983ff1b82a1ccb6f2e9d8784bdd6bd + depends: + - python >=3.9 + - terminado >=0.8.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server-terminals?source=hash-mapping + size: 19711 + timestamp: 1733428049134 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.4.5-pyhd8ed1ab_0.conda + sha256: 2013c2dd13bc773167e1ad11ae885b550c0297d030e2107bdc303243ff05d3f2 + md5: ad6bbe770780dcf9cf55d724c5a213fd + depends: + - async-lru >=1.0.0 + - httpx >=0.25.0 + - importlib-metadata >=4.8.3 + - ipykernel >=6.5.0 + - jinja2 >=3.0.3 + - jupyter-lsp >=2.0.0 + - jupyter_core + - jupyter_server >=2.4.0,<3 + - jupyterlab_server >=2.27.1,<3 + - notebook-shim >=0.2 + - packaging + - python >=3.9 + - setuptools >=41.1.0 + - tomli >=1.2.2 + - tornado >=6.2.0 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab?source=hash-mapping + size: 8074534 + timestamp: 1753022530771 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 + constrains: + - jupyterlab >=4.0.8,<5.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-pygments?source=hash-mapping + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_1.conda + sha256: d03d0b7e23fa56d322993bc9786b3a43b88ccc26e58b77c756619a921ab30e86 + md5: 9dc4b2b0f41f0de41d27f3293e319357 + depends: + - babel >=2.10 + - importlib-metadata >=4.8.3 + - jinja2 >=3.0.3 + - json5 >=0.9.0 + - jsonschema >=4.18 + - jupyter_server >=1.21,<3 + - packaging >=21.3 + - python >=3.9 + - requests >=2.31 + constrains: + - openapi-core >=0.18.0,<0.19.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-server?source=hash-mapping + size: 49449 + timestamp: 1733599666357 +- conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.10.0-pyh753f3f9_0.conda + sha256: 78d19d81ec9fff9cc7aa9d546e3844c1923fcb1752d6483cbd28c0d6e1e3c03e + md5: 9e1f77096da39525f54095edac3b2a48 + depends: + - absl-py + - h5py + - ml_dtypes + - namex + - numpy + - optree + - packaging + - python >=3.9 + - rich + constrains: + - jax >=0.4.0 + - pytorch >=2.1.0 + - tensorflow >=2.15.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/keras?source=hash-mapping + size: 778350 + timestamp: 1747722951119 +- conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.3.3-pyhd8ed1ab_0.conda + sha256: a8030a626960f522bc88cf966162fe20d47b4626db5a6afd4b69b9bb7543bf5d + md5: 0038c23b52e79facde5d5ecf6745cf64 + depends: + - absl-py + - h5py + - ml_dtypes + - namex + - numpy <2.0a0 + - optree + - packaging + - python >=3.9 + - rich + constrains: + - pytorch >=2.1,<2.3 + - jax 0.4.* + - tensorflow >=2.15.0,<2.17.0a + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/keras?source=hash-mapping + size: 860960 + timestamp: 1714206432046 +- conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.8.0-pyh753f3f9_0.conda + sha256: 71be487fcaa14b57a29654de223a333d9ca373dd9ea988b6312a77ecb65fb3ff + md5: fdb4c844d7bd8baed40a01225d837fca + depends: + - absl-py + - h5py + - ml_dtypes + - namex + - numpy + - optree + - packaging + - python >=3.9 + - rich + constrains: + - jax >=0.4.0 + - pytorch >=2.1.0 + - tensorflow >=2.15.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/keras?source=hash-mapping + size: 733634 + timestamp: 1736538851193 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyh534df25_0.conda + sha256: c8b436fa9853bf8b836c96afbb7684a04955b80b37f5d5285fd836b6a8566cc5 + md5: d2c0c5bda93c249f877c7fceea9e63af + depends: + - __osx + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 37280 + timestamp: 1735210369348 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + sha256: b6f57c17cf098022c32fe64e85e9615d427a611c48a5947cdfc357490210a124 + md5: cdd58ab99c214b55d56099108a914282 + depends: + - __linux + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 + - python >=3.9 + - secretstorage >=3.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 36985 + timestamp: 1735210286595 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_0.conda + sha256: 51813a024ff9ed172ebd8042ad5927400ece08da2498f815cb61f93c6a455b34 + md5: 9c869454a8fdb86fabd93df6cf6075a3 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 78152 + timestamp: 1754889395523 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_0.conda + sha256: abe5ba0c956c5b830c237a5aaf50516ac9ebccf3f9fd9ffb18a5a11640f43677 + md5: f1f7cfc42b0fa6adb4c304d609077a78 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 77278 + timestamp: 1754889408033 +- conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py311ha94bed4_0.conda + sha256: 114dbab78c685c8b670e13838e010d963cf0988bb00ec9be5b78802c873ea937 + md5: 0c761a1820f64ef9936504279d04ac0a + depends: + - python + - libcxx >=19 + - __osx >=10.13 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 67550 + timestamp: 1754889474169 +- conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py312hef387a8_0.conda + sha256: 24b38bcb27b58b5ba6744f127ed6f220468999533955a4903e262441708aed39 + md5: b77950bcb18f574107280502ea227291 + depends: + - python + - libcxx >=19 + - __osx >=10.13 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 68996 + timestamp: 1754889451056 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py311h63e5c0c_0.conda + sha256: b7d27d0daa8cd119935e9e80060b928b9723c1c7f463184b444c9355eceaea48 + md5: c11b1f9354c6a5298b5c389b2daa4358 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - python 3.11.* *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 66079 + timestamp: 1754889457729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py312hdc12c9d_0.conda + sha256: 290d8f1016c9581bd4d2246bb21832ba4e4ba1c7b059eb9106d92bba561bccc7 + md5: 91384df8de4c340a1232793cf39a12ce + depends: + - python + - python 3.12.* *_cpython + - libcxx >=19 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 67692 + timestamp: 1754889447292 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + sha256: 83b52685a4ce542772f0892a0f05764ac69d57187975579a0835ff255ae3ef9c + md5: d4765c524b1d91567886bde656fb514b + depends: + - __osx >=10.13 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1185323 + timestamp: 1719463492984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.2.2-pyhd8ed1ab_1.conda + sha256: 637a9c32e15a4333f1f9c91e0a506dbab4a6dab7ee83e126951159c916c81c99 + md5: 3a8063b25e603999188ed4bbf3485404 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/lark?source=hash-mapping + size: 92093 + timestamp: 1734709450256 +- conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f + md5: 8d67904973263afd2985ba56aa2d6bb4 + depends: + - python + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/latexcodec?source=hash-mapping + size: 18212 + timestamp: 1592937373647 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda + sha256: bcb81543e49ff23e18dea79ef322ab44b8189fb11141b1af99d058503233a5fc + md5: bf210d0c63f2afb9e414a858b79f0eaa + depends: + - __osx >=10.13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 226001 + timestamp: 1739161050843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda + sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f + md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 212125 + timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 676044 + timestamp: 1752032747103 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff + md5: 9344155d33912347b37f0ae6c410a835 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 264243 + timestamp: 1745264221534 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda + sha256: cc1f1d7c30aa29da4474ec84026ec1032a8df1d7ec93f4af3b98bb793d01184e + md5: 21f765ced1a0ef4070df53cb425e1967 + depends: + - __osx >=10.13 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 248882 + timestamp: 1745264331196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 + md5: a74332d9b60b62905e3d30709df08bf1 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 188306 + timestamp: 1745264362794 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda + sha256: 945396726cadae174a661ce006e3f74d71dbd719219faf7cc74696b267f7b0b5 + md5: c48fc56ec03229f294176923c3265c05 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + constrains: + - abseil-cpp =20240116.2 + - libabseil-static =20240116.2=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1264712 + timestamp: 1720857377573 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240116.2-cxx17_hf036a51_1.conda + sha256: 396d18f39d5207ecae06fddcbc6e5f20865718939bc4e0ea9729e13952833aac + md5: d6c78ca84abed3fea5f308ac83b8f54e + depends: + - __osx >=10.13 + - libcxx >=16 + constrains: + - abseil-cpp =20240116.2 + - libabseil-static =20240116.2=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1124364 + timestamp: 1720857589333 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda + sha256: 375e98c007cbe2535b89adccf4d417480d54ce2fb4b559f0b700da294dee3985 + md5: 03dd3d0563d01c2b82881734ee0eb334 + depends: + - __osx >=10.13 + - libcxx >=18 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1163503 + timestamp: 1736008705613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240116.2-cxx17_h00cdb27_1.conda + sha256: a9517c8683924f4b3b9380cdaa50fdd2009cd8d5f3918c92f64394238189d3cb + md5: f16963d88aed907af8b90878b8d8a05c + depends: + - __osx >=11.0 + - libcxx >=16 + constrains: + - abseil-cpp =20240116.2 + - libabseil-static =20240116.2=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1136123 + timestamp: 1720857649214 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + sha256: 410ab78fe89bc869d435de04c9ffa189598ac15bb0fe1ea8ace8fb1b860a2aa3 + md5: 01ba04e414e47f95c03d6ddd81fd37be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 36825 + timestamp: 1749993532943 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + sha256: f4fe00ef0df58b670696c62f2ec3f6484431acbf366ecfbcb71141c81439e331 + md5: 1a768b826dfc68e07786788d98babfc3 + depends: + - __osx >=10.13 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 30034 + timestamp: 1749993664561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + sha256: 0ea6b73b3fb1511615d9648186a7409e73b7a8d9b3d890d39df797730e3d1dbb + md5: 8ed0f86b7a5529b98ec73b43a53ce800 + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 30173 + timestamp: 1749993648288 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: 8a0ee1de693a9b3da4a11b95ec81b40dd434bd01fa1f5f38f8268cd2146bf8f0 + md5: 2b7bb4f7562c8cf334fc2e20c2d28abc + depends: + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas + - blas * openblas + - liblapack 3.9.0 20_linux64_openblas + - mkl <2025 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14433 + timestamp: 1700568383457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda + build_number: 34 + sha256: 08a394ba934f68f102298259b150eb5c17a97c30c6da618e1baab4247366eab3 + md5: 064c22bac20fecf2a99838f9b979374c + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - mkl <2025 + - blas 2.134 openblas + - liblapacke 3.9.0 34*_openblas + - libcblas 3.9.0 34*_openblas + - liblapack 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19306 + timestamp: 1754678416811 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: 89cac4653b52817d44802d96c13e5f194320e2e4ea805596641d0f3e22e32525 + md5: 1673476d205d14a9042172be795f63cb + depends: + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - blas * openblas + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14739 + timestamp: 1700568675962 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-34_h7f60823_openblas.conda + build_number: 34 + sha256: ea5d0341df78f7f2d6fe3a03a9b7327958d9e21b4f2d13ef0eddadc335999232 + md5: 3f29ba70f912e56d4be6b55bc213a082 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapacke 3.9.0 34*_openblas + - mkl <2025 + - libcblas 3.9.0 34*_openblas + - liblapack 3.9.0 34*_openblas + - blas 2.134 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19537 + timestamp: 1754678644797 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: 5b5b8394352c8ca06b15dcc9319d0af3e9f1dc03fc0a6f6deef05d664d6b763a + md5: 49bc8dec26663241ee064b2d7116ec2d + depends: + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14722 + timestamp: 1700568881837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-34_h10e41b3_openblas.conda + build_number: 34 + sha256: 5de3c3bfcdc8ba05da1a7815c9953fe392c2065d9efdc2491f91df6d0d1d9e76 + md5: cdb3e1ca1661dbf19f9aad7dad524996 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - blas 2.134 openblas + - mkl <2025 + - liblapacke 3.9.0 34*_openblas + - libcblas 3.9.0 34*_openblas + - liblapack 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19533 + timestamp: 1754678956963 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-34_h5709861_mkl.conda + build_number: 34 + sha256: d7865fcc7d29b22e4111ababec49083851a84bb3025748eed65184be765b6e7d + md5: a64dcde5f27b8e0e413ddfc56151664c + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - libcblas 3.9.0 34*_mkl + - liblapacke 3.9.0 34*_mkl + - blas 2.134 mkl + - liblapack 3.9.0 34*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 70548 + timestamp: 1754682440057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda + sha256: 462a8ed6a7bb9c5af829ec4b90aab322f8bcd9d8987f793e6986ea873bbd05cf + md5: cb98af5db26e3f482bebb80ce9d947d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 69233 + timestamp: 1749230099545 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h6e16a3a_3.conda + sha256: 23952b1dc3cd8be168995da2d7cc719dac4f2ec5d478ba4c65801681da6f9f52 + md5: ec21ca03bcc08f89b7e88627ae787eaf + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 67817 + timestamp: 1749230267706 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-h5505292_3.conda + sha256: 0e9c196ad8569ca199ea05103707cde0ae3c7e97d0cdf0417d873148ea9ad640 + md5: fbc4d83775515e433ef22c058768b84d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 68972 + timestamp: 1749230317752 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda + sha256: 3eb27c1a589cbfd83731be7c3f19d6d679c7a444c3ba19db6ad8bf49172f3d83 + md5: 1c6eecffad553bde44c5238770cfb7da + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 33148 + timestamp: 1749230111397 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h6e16a3a_3.conda + sha256: 499374a97637e4c6da0403ced7c9860d25305c6cb92c70dded738134c4973c67 + md5: 71d03e5e44801782faff90c455b3e69a + depends: + - __osx >=10.13 + - libbrotlicommon 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: [] + size: 30627 + timestamp: 1749230291245 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-h5505292_3.conda + sha256: d888c228e7d4f0f2303538f6a9705498c81d56fedaab7811e1186cb6e24d689b + md5: 01c4b35a1c4b94b60801f189f1ac6ee3 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: [] + size: 29249 + timestamp: 1749230338861 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda + sha256: 76e8492b0b0a0d222bfd6081cae30612aa9915e4309396fdca936528ccf314b7 + md5: 3facafe58f3858eb95527c7d3a3fc578 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 282657 + timestamp: 1749230124839 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h6e16a3a_3.conda + sha256: e6d7a42fe87a23df03c482c885e428cc965d1628f18e5cee47575f6216c7fbc5 + md5: 94c0090989db51216f40558958a3dd40 + depends: + - __osx >=10.13 + - libbrotlicommon 1.1.0 h6e16a3a_3 + license: MIT + license_family: MIT + purls: [] + size: 295250 + timestamp: 1749230310752 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-h5505292_3.conda + sha256: 0734a54db818ddfdfbf388fa53c5036a06bbe17de14005f33215d865d51d8a5e + md5: 1ce5e315293309b5bf6778037375fb08 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 h5505292_3 + license: MIT + license_family: MIT + purls: [] + size: 274404 + timestamp: 1749230355483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: 0e34fb0f82262f02fcb279ab4a1db8d50875dc98e3019452f8f387e6bf3c0247 + md5: 36d486d72ab64ffea932329a1d3729a3 + depends: + - libblas 3.9.0 20_linux64_openblas + constrains: + - liblapacke 3.9.0 20_linux64_openblas + - blas * openblas + - liblapack 3.9.0 20_linux64_openblas + - mkl <2025 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14383 + timestamp: 1700568410580 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda + build_number: 34 + sha256: edde454897c7889c0323216516abb570a593de728c585b14ef41eda2b08ddf3a + md5: 148b531b5457ad666ed76ceb4c766505 + depends: + - libblas 3.9.0 34_h59b9bed_openblas + constrains: + - liblapacke 3.9.0 34*_openblas + - blas 2.134 openblas + - liblapack 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19313 + timestamp: 1754678426220 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: b0a4eab6d22b865d9b0e39f358f17438602621709db66b8da159197bedd2c5eb + md5: b324ad206d39ce529fb9073f9d062062 + depends: + - libblas 3.9.0 20_osx64_openblas + constrains: + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14648 + timestamp: 1700568722960 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-34_hff6cab4_openblas.conda + build_number: 34 + sha256: 393e24b890009d4d4ace5531d39adfd9be3b97040653f6febbb74311dad84146 + md5: 0f6bf5f39b2301a165389e3624f0c297 + depends: + - libblas 3.9.0 34_h7f60823_openblas + constrains: + - liblapacke 3.9.0 34*_openblas + - liblapack 3.9.0 34*_openblas + - blas 2.134 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19518 + timestamp: 1754678655239 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: d3a74638f60e034202e373cf2950c69a8d831190d497881d13cbf789434d2489 + md5: 89f4718753c08afe8cda4dd5791ba94c + depends: + - libblas 3.9.0 20_osxarm64_openblas + constrains: + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14642 + timestamp: 1700568912840 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-34_hb3479ef_openblas.conda + build_number: 34 + sha256: 6639f6c6b2e76cb1be62cd6d9033bda7dc3fab2e5a80f5be4b5c522c27dcba17 + md5: e15018d609b8957c146dcb6c356dd50c + depends: + - libblas 3.9.0 34_h10e41b3_openblas + constrains: + - liblapack 3.9.0 34*_openblas + - blas 2.134 openblas + - liblapacke 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19521 + timestamp: 1754678970336 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-34_h2a3cdd5_mkl.conda + build_number: 34 + sha256: e9f31d44e668822f6420bfaeda4aa74cd6c60d3671cf0b00262867f36ad5a8c1 + md5: 25a019872ff471af70fd76d9aaaf1313 + depends: + - libblas 3.9.0 34_h5709861_mkl + constrains: + - liblapacke 3.9.0 34*_mkl + - blas 2.134 mkl + - liblapack 3.9.0 34*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 70700 + timestamp: 1754682490395 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_hddf928d_0.conda + sha256: 202742a287db5889ae5511fab24b4aff40f0c515476c1ea130ff56fae4dd565a + md5: b939740734ad5a8e8f6c942374dee68d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm20 >=20.1.8,<20.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 21250278 + timestamp: 1752223579291 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.8-default_ha444ac7_0.conda + sha256: 39fdf9616df5dd13dee881fc19e8f9100db2319e121d9b673a3fc6a0c76743a3 + md5: 783f9cdcb0255ed00e3f1be22e16de40 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm20 >=20.1.8,<20.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 12353158 + timestamp: 1752223792409 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 + md5: d4a250da4737ee127fb1fa6452a9002e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4523621 + timestamp: 1749905341688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + sha256: b6c5cf340a4f80d70d64b3a29a7d9885a5918d16a5cb952022820e6d3e79dc8b + md5: 45f6713cb00f124af300342512219182 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 449910 + timestamp: 1749033146806 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.14.1-h5dec5d8_0.conda + sha256: ca0d8d12056227d6b47122cfb6d68fc5a3a0c6ab75a0e908542954fc5f84506c + md5: 8738cd19972c3599400404882ddfbc24 + depends: + - __osx >=10.13 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 424040 + timestamp: 1749033558114 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.1-h73640d1_0.conda + sha256: 0055b68137309db41ec34c938d95aec71d1f81bd9d998d5be18f32320c3ccba0 + md5: 1af57c823803941dfc97305248a56d57 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 403456 + timestamp: 1749033320430 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.8-h3d58e20_1.conda + sha256: 9643d6c5a94499cddb5ae1bccc4f78aef8cfd77bcf6b37ad325bc7232a8a870f + md5: d2db320b940047515f7a27f870984fe7 + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 564830 + timestamp: 1752814841086 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.8-hf598326_1.conda + sha256: 119b3ac75cb1ea29981e5053c2cb10d5f0b06fcc81b486cb7281f160daf673a1 + md5: a69ef3239d3268ef8602c7a7823fd982 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 568267 + timestamp: 1752814881595 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf + md5: 64f0c503da58ec25ebd359e4d990afa8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 72573 + timestamp: 1747040452262 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.24-hcc1b750_0.conda + sha256: 2733a4adf53daca1aa4f41fe901f0f8ee9e4c509abd23ffcd7660013772d6f45 + md5: f0a46c359722a3e84deb05cd4072d153 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 69751 + timestamp: 1747040526774 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda + sha256: 417d52b19c679e1881cce3f01cad3a2d542098fa2d6df5485aac40f01aede4d1 + md5: 3baf58a5a87e7c2f4d243ce2f8f2fe5c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 54790 + timestamp: 1747040549847 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb9d3cd8_0.conda + sha256: f53458db897b93b4a81a6dbfd7915ed8fa4a54951f97c698dde6faa028aadfd2 + md5: 4c0ab57463117fbb8df85268415082f5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + purls: [] + size: 246161 + timestamp: 1749904704373 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 + md5: 1f4ed31220402fcddc083b4bff406868 + depends: + - ncurses + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 115563 + timestamp: 1738479554273 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 44840 + timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 106663 + timestamp: 1702146352558 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 74811 + timestamp: 1752719572741 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 72450 + timestamp: 1752719744781 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 65971 + timestamp: 1752719657566 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 141322 + timestamp: 1752719767870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 57433 + timestamp: 1743434498161 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 51216 + timestamp: 1743434595269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 39839 + timestamp: 1743434670405 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 44978 + timestamp: 1743435053850 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda + sha256: 7be9b3dac469fe3c6146ff24398b685804dfc7a1de37607b84abd076f57cc115 + md5: 51f5be229d83ecd401fb369ab96ae669 + depends: + - libfreetype6 >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 7693 + timestamp: 1745369988361 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.13.3-h694c41f_1.conda + sha256: afe0e2396844c8cfdd6256ac84cabc9af823b1727f704c137b030b85839537a6 + md5: 07c8d3fbbe907f32014b121834b36dd5 + depends: + - libfreetype6 >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 7805 + timestamp: 1745370212559 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.13.3-hce30654_1.conda + sha256: 1f8c16703fe333cdc2639f7cdaf677ac2120843453222944a7c6c85ec342903c + md5: d06282e08e55b752627a707d58779b8f + depends: + - libfreetype6 >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 7813 + timestamp: 1745370144506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda + sha256: 7759bd5c31efe5fbc36a7a1f8ca5244c2eabdbeb8fc1bee4b99cf989f35c7d81 + md5: 3c255be50a506c50765a93a6644f32fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 380134 + timestamp: 1745369987697 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.13.3-h40dfd5c_1.conda + sha256: 058165962aa64fc5a6955593212c0e1ea42ca6d6dba60ee61dff612d4c3818d7 + md5: c76e6f421a0e95c282142f820835e186 + depends: + - __osx >=10.13 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 357654 + timestamp: 1745370210187 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.13.3-h1d14073_1.conda + sha256: c278df049b1a071841aa0aca140a338d087ea594e07dcf8a871d2cfe0e330e75 + md5: b163d446c55872ef60530231879908b9 + depends: + - __osx >=11.0 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.13.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 333529 + timestamp: 1745370142848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 824153 + timestamp: 1753903866511 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29249 + timestamp: 1753903872571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda + sha256: 2fe41683928eb3c57066a60ec441e605a69ce703fc933d6d5167debfeba8a144 + md5: 53e876bc2d2648319e94c33c57b9ec74 + depends: + - libgfortran5 15.1.0 hcea5267_4 + constrains: + - libgfortran-ng ==15.1.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29246 + timestamp: 1753903898593 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.1.0-h5f6db21_0.conda + sha256: 10efd2a1e18641dfcb57bdc14aaebabe9b24020cf1a5d9d2ec8d7cd9b2352583 + md5: bca8f1344f0b6e3002a600f4379f8f2f + depends: + - libgfortran5 15.1.0 hfa3c126_0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 134053 + timestamp: 1750181840950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_0.conda + sha256: 9620b4ac9d32fe7eade02081cd60d6a359a927d42bb8e121bd16489acd3c4d8c + md5: e3b7dca2c631782ca1317a994dfe19ec + depends: + - libgfortran5 15.1.0 hb74de2c_0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 133859 + timestamp: 1750183546047 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_4.conda + sha256: a5713d8e5a92b4522de132b82368ba93a061e47bc15e6b638c745f28c67fec31 + md5: b1a97c0f2c4f1bb2b8872a21fc7e17a7 + depends: + - libgfortran 15.1.0 h69a702a_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29256 + timestamp: 1753904061220 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda + sha256: 3070e5e2681f7f2fb7af0a81b92213f9ab430838900da8b4f9b8cf998ddbdd84 + md5: 8a4ab7ff06e4db0be22485332666da0f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.1.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1564595 + timestamp: 1753903882088 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.1.0-hfa3c126_0.conda + sha256: b8e892f5b96d839f7bf6de267329c145160b1f33d399b053d8602085fdbf26b2 + md5: c97d2a80518051c0e88089c51405906b + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1226396 + timestamp: 1750181111194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_0.conda + sha256: 44b8ce4536cc9a0e59c09ff404ef1b0120d6a91afc32799331d85268cbe42438 + md5: 8b158ccccd67a40218e12626a39065a1 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 758352 + timestamp: 1750182604206 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 134712 + timestamp: 1731330998354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.3-hf39c6af_0.conda + sha256: e1ad3d9ddaa18f95ff5d244587fd1a37aca6401707f85a37f7d9b5002fcf16d0 + md5: 467f23819b1ea2b89c3fc94d65082301 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.45,<10.46.0a0 + constrains: + - glib 2.84.3 *_0 + license: LGPL-2.1-or-later + purls: [] + size: 3961899 + timestamp: 1754315006443 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + purls: [] + size: 132463 + timestamp: 1731330968309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + purls: [] + size: 75504 + timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 447289 + timestamp: 1753903801049 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda + sha256: 28241ed89335871db33cb6010e9ccb2d9e9b6bb444ddf6884f02f0857363c06a + md5: 8dabe607748cb3d7002ad73cd06f1325 + depends: + - c-ares >=1.28.1,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libgcc-ng >=12 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libre2-11 >=2023.9.1 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.62.2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7316832 + timestamp: 1713390645548 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda + sha256: 675ab892e51614d511317f704564c8c0a8b85e7620948f733eff99800ad25570 + md5: bfcedaf5f9b003029cc6abe9431f66bf + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8192164 + timestamp: 1740799778898 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.62.2-h384b2fc_0.conda + sha256: 7c228040e7dac4e5e7e6935a4decf6bc2155cc05fcfb0811d25ccb242d0036ba + md5: 9421f67cf8b4bc976fe5d0c3ab42de18 + depends: + - __osx >=10.13 + - c-ares >=1.28.1,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libcxx >=16 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libre2-11 >=2023.9.1 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.62.2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5189573 + timestamp: 1713392887258 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_2.conda + sha256: 1704fc25a408d89d5efd841ad0a3b42ba1a8b189afa40b89995c74da83058d91 + md5: c1f24237a5024ae9b3820401511a1660 + depends: + - __osx >=10.13 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5204405 + timestamp: 1740799079753 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.62.2-h9c18a4f_0.conda + sha256: d2c5b5a828f6f1242c11e8c91968f48f64446f7dd5cbfa1197545e465eb7d47a + md5: e624fc11026dbb84c549435eccd08623 + depends: + - c-ares >=1.28.1,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libcxx >=16 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libre2-11 >=2023.9.1 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.62.2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5016525 + timestamp: 1713392846329 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_2.conda + sha256: a6114f6020f02387aa8bc9167d77c23177f8a3650b55fb0ee100c5227ca475f9 + md5: c368d17cdc54d96aa6bd73d07816cf60 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5203869 + timestamp: 1740786448002 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h88281d1_1000.conda + sha256: 2fb437b82912c74b4869b66c601d52c77bb3ee8cb4812eab346d379f1c823225 + md5: e6298294e7612eccf57376a0683ddc80 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 >=2.13.8,<2.14.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2412139 + timestamp: 1752762145331 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 + md5: 9fa334557db9f63da6c9285fd2a48638 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 628947 + timestamp: 1745268527144 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda + sha256: 9c0009389c1439ec96a08e3bf7731ac6f0eab794e0a133096556a9ae10be9c27 + md5: 87537967e6de2f885a9fcebd42b7cb10 + depends: + - __osx >=10.13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 586456 + timestamp: 1745268522731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + sha256: 78df2574fa6aa5b6f5fc367c03192f8ddf8e27dc23641468d54e031ff560b9d4 + md5: 01caa4fbcaf0e6b08b3aef1151e91745 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 553624 + timestamp: 1745268405713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: ad7745b8d0f2ccb9c3ba7aaa7167d62fc9f02e45eb67172ae5f0dfb5a3b1a2cc + md5: 6fabc51f5e647d09cc010c40061557e0 + depends: + - libblas 3.9.0 20_linux64_openblas + constrains: + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas + - blas * openblas + - mkl <2025 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14350 + timestamp: 1700568424034 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda + build_number: 34 + sha256: 9c941d5da239f614b53065bc5f8a705899326c60c9f349d9fbd7bd78298f13ab + md5: f05a31377b4d9a8d8740f47d1e70b70e + depends: + - libblas 3.9.0 34_h59b9bed_openblas + constrains: + - liblapacke 3.9.0 34*_openblas + - libcblas 3.9.0 34*_openblas + - blas 2.134 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19324 + timestamp: 1754678435277 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: d64e11b93dada339cd0dcc057b3f3f6a5114b8c9bdf90cf6c04cbfa75fb02104 + md5: 704bfc2af1288ea973b6755281e6ad32 + depends: + - libblas 3.9.0 20_osx64_openblas + constrains: + - blas * openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14658 + timestamp: 1700568740660 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-34_h236ab99_openblas.conda + build_number: 34 + sha256: 6ecbd5c2b39e40766935c8311238cfbfcf7ca43b5eafc9bb5f883d59c705981e + md5: 8ddbc2de70c2fedfb4cfbcb8d5562ac8 + depends: + - libblas 3.9.0 34_h7f60823_openblas + constrains: + - liblapacke 3.9.0 34*_openblas + - blas 2.134 openblas + - libcblas 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19548 + timestamp: 1754678665504 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: e13f79828a7752f6e0a74cbe62df80c551285f6c37de86bc3bd9987c97faca57 + md5: 1fefac78f2315455ce2d7f34782eac0a + depends: + - libblas 3.9.0 20_osxarm64_openblas + constrains: + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14648 + timestamp: 1700568930669 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-34_hc9a63f6_openblas.conda + build_number: 34 + sha256: 659c7cc2d7104c5fa33482d28a6ce085fd116ff5625a117b7dd45a3521bf8efc + md5: 94b13d05122e301de02842d021eea5fb + depends: + - libblas 3.9.0 34_h10e41b3_openblas + constrains: + - libcblas 3.9.0 34*_openblas + - blas 2.134 openblas + - liblapacke 3.9.0 34*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19532 + timestamp: 1754678979401 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-34_hf9ab0e9_mkl.conda + build_number: 34 + sha256: c65298d584551cba1b7a42537f8e0093ec9fd0e871fc80ddf9cf6ffa0efa25ae + md5: ba80d9feadfbafceafb0bf46d35f5886 + depends: + - libblas 3.9.0 34_h5709861_mkl + constrains: + - libcblas 3.9.0 34*_mkl + - liblapacke 3.9.0 34*_mkl + - blas 2.134 mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82224 + timestamp: 1754682540087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.8-hecd9e04_0.conda + sha256: a6fddc510de09075f2b77735c64c7b9334cf5a26900da351779b275d9f9e55e1 + md5: 59a7b967b6ef5d63029b1712f8dcf661 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 >=2.13.8,<2.14.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 43987020 + timestamp: 1752141980723 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 104826 + timestamp: 1749230155443 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 104935 + timestamp: 1749230611612 +- conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.2-h707e725_0.conda + sha256: e026c1d12377330f62d9b5545de6892b4b062fdaed04f241a4dfa55ccb49be8b + md5: 941ad01c96903c853f9caede06e6180a + depends: + - __unix + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 23431 + timestamp: 1736538837120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e + md5: 18b81186a6adb43f000ad19ed7b70381 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 77667 + timestamp: 1748393757154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 71829 + timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 88657 + timestamp: 1723861474602 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda + sha256: 0dcfdcf3a445d2d7de4f3b186ab0a794dc872f4ea21622f9b997be72712c027f + md5: ab21007194b97beade22ceb7a3f6fee5 + depends: + - __osx >=10.13 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 606663 + timestamp: 1729572019083 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + sha256: 3b3f19ced060013c2dd99d9d46403be6d319d4601814c772a3472fe2955612b0 + md5: 7c7927b404672409d9917d49bff5f2d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 33418 + timestamp: 1734670021371 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + sha256: 628564517895ee1b09cf72c817548bd80ef1acce6a8214a8520d9f7b44c4cfaf + md5: d172b34a443b95f86089e8229ddc9a17 + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + constrains: + - openblas >=0.3.25,<0.3.26.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5545169 + timestamp: 1700536004164 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda + sha256: 3f3fc30fe340bc7f8f46fea6a896da52663b4d95caed1f144e8ea114b4bb6b61 + md5: 7e2ba4ca7e6ffebb7f7fc2da2744df61 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5918161 + timestamp: 1753405234435 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + sha256: 9895bccdbaa34958ab7dd1f29de66d1dfb94c551c7bb5a663666a500c67ee93c + md5: a01b96f00c3155c830d98a518c7dcbfb + depends: + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - llvm-openmp >=16.0.6 + constrains: + - openblas >=0.3.25,<0.3.26.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6019426 + timestamp: 1700537709900 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h83c2472_1.conda + sha256: 4e5fbf58105606c1cf77e2dda8ffca9e344c890353fe3e5d63211277dbba266e + md5: 1719f55187f999004d1a69c43b50e9da + depends: + - __osx >=10.13 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6261418 + timestamp: 1753406214733 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + sha256: b112e0d500bc0314ea8d393efac3ab8c67857e5a2b345348c98e703ee92723e5 + md5: a1843550403212b9dedeeb31466ade03 + depends: + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - llvm-openmp >=16.0.6 + constrains: + - openblas >=0.3.25,<0.3.26.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2896390 + timestamp: 1700535987588 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_1.conda + sha256: dfa2e506dcbd2b8e5656333021dbd422d2c1655dcfecbd7a50cac9d223c802b4 + md5: 165b15df4e15aba3a2b63897d6e4c539 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4282228 + timestamp: 1753404509306 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead + md5: 7df50d44d4a14d6c31a2c54f2cd92157 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 50757 + timestamp: 1731330993524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 28424 + timestamp: 1749901812541 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + sha256: e75a2723000ce3a4b9fd9b9b9ce77553556c93e475a4657db6ed01abc02ea347 + md5: 7af8e91b0deb5f8e25d1a595dea79614 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 317390 + timestamp: 1753879899951 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.50-h84aeda2_1.conda + sha256: 8d92c82bcb09908008d8cf5fab75e20733810d40081261d57ef8cd6495fc08b4 + md5: 1fe32bb16991a24e112051cc0de89847 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 297609 + timestamp: 1753879919854 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + sha256: a2e0240fb0c79668047b528976872307ea80cb330baf8bf6624ac2c6443449df + md5: 4d0f5ce02033286551a32208a5519884 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 287056 + timestamp: 1753879907258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda + sha256: 2dbcef0db82e0e7b6895b6c0dadd3d36c607044c40290c7ca10656f3fca3166f + md5: 6458be24f09e1b034902ab44fe9de908 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - openldap >=2.6.9,<2.7.0a0 + - openssl >=3.5.0,<4.0a0 + license: PostgreSQL + purls: [] + size: 2680582 + timestamp: 1746743259857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda + sha256: 8b5e4e31ed93bf36fd14e9cf10cd3af78bb9184d0f1f87878b8d28c0374aa4dc + md5: 06def97690ef90781a91b786cb48a0a9 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2883090 + timestamp: 1727161327039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-4.25.3-hd4aba4c_1.conda + sha256: f509cb24a164b84553b28837ec1e8311ceb0212a1dbb8c7fd99ca383d461ea6c + md5: 64ad501f0fd74955056169ec9c42c5c0 + depends: + - __osx >=10.13 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcxx >=17 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2212274 + timestamp: 1727160957452 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda + sha256: 7bd8467402040312cf1030d98427b6bdce9905e519a1979cd7aa5f0fb0902cad + md5: 5601e7ce099eb72741e9cd6413f42a07 + depends: + - __osx >=10.13 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2312598 + timestamp: 1735576514825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.25.3-hc39d83c_1.conda + sha256: f51bde2dfe73968ab3090c1098f520b65a8d8f11e945cb13bf74d19e30966b61 + md5: fa77986d9170450c014586ab87e144f8 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcxx >=17 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2177164 + timestamp: 1727160770879 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda + sha256: 3f3c65fe0e9e328b4c1ebc2b622727cef3e5b81b18228cfa6cf0955bc1ed8eff + md5: 41c69fba59d495e8cf5ffda48a607e35 + depends: + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + constrains: + - re2 2023.09.01.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 232603 + timestamp: 1708946763521 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2023.09.01-h81f5012_2.conda + sha256: 384b72a09bd4bb29c1aa085110b2f940dba431587ffb4e2c1a28f605887a1867 + md5: c5c36ec64e3c86504728c38b79011d08 + depends: + - __osx >=10.13 + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libcxx >=16 + constrains: + - re2 2023.09.01.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 184017 + timestamp: 1708947106275 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda + sha256: 8d29abd9b800f55b56e60b5acb02fab3f3269f5518a7fb4286ca93ca7fef0eff + md5: 975743594ba5382fe7e71cda599ac6e8 + depends: + - __osx >=10.13 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 179212 + timestamp: 1735541074638 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2023.09.01-h7b2c953_2.conda + sha256: c8a0a6e7a627dc9c66ffb8858f8f6d499f67fd269b6636b25dc5169760610f05 + md5: 0b7b2ced046d6b5fe6e9d46b1ee0324c + depends: + - libabseil * cxx17* + - libabseil >=20240116.1,<20240117.0a0 + - libcxx >=16 + constrains: + - re2 2023.09.01.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 171443 + timestamp: 1708947163461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + sha256: d3975cfe60e81072666da8c76b993af018cf2e73fe55acba2b5ba0928efaccf5 + md5: 6af4b059e26492da6013e79cbcb4d069 + depends: + - __osx >=10.13 + license: ISC + purls: [] + size: 210249 + timestamp: 1716828641383 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 932581 + timestamp: 1753948484112 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.4-h39a8b3b_0.conda + sha256: 466366b094c3eb4b1d77320530cbf5400e7a10ab33e4824c200147488eebf7a6 + md5: 156bfb239b6a67ab4a01110e6718cbc4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 980121 + timestamp: 1753948554003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 902645 + timestamp: 1753948599139 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-hf8de324_0.conda + sha256: 567d19bfa3cb5de3375e2dd0459364cfd642d627714d62239aab9f345e37f678 + md5: 2e7f18b6408aca87d84221c36f8dd950 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 898778 + timestamp: 1753948582073 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1288499 + timestamp: 1753948889360 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c + md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 284216 + timestamp: 1745608575796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + sha256: b5b239e5fca53ff90669af1686c86282c970dd8204ebf477cf679872eb6d48ac + md5: 3c376af8888c386b9d3d1c2701e2f3ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3903453 + timestamp: 1753903894186 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda + sha256: 81c841c1cf4c0d06414aaa38a249f9fdd390554943065c3a0b18a9fb7e8cc495 + md5: 2d34729cbc1da0ec988e57b13b712067 + depends: + - libstdcxx 15.1.0 h8f9b012_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29317 + timestamp: 1753903924491 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.18.0-cpu_h739b781_1.conda + sha256: 38a5982a56f6422bb0cf207db1bed3fdb0d8a232ed6851597199471cc7d92db0 + md5: 3f68b417e449a1fd829f5af515154770 + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libml_dtypes-headers >=0.5.0,<0.6 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libtensorflow_framework 2.18.0 cpu_h417b707_1 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 130801009 + timestamp: 1754342699932 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_cc-2.18.0-cpu_hce6ddfb_1.conda + sha256: 2655f265a093160d1249f1dc0ad1e610e8a583901f8a0d1a6b52a6b1cb2fa9c8 + md5: 55e004998ebaed9356c6217962731ed1 + depends: + - __osx >=10.13 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libml_dtypes-headers >=0.5.0,<0.6 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_framework 2.18.0 cpu_h38b2b02_1 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 138349626 + timestamp: 1754517183864 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_cc-2.18.0-cpu_hf321e49_1.conda + sha256: 6b96f28b9ac3c0224bbb3bfa20b214728d698774293c85253280bda3e314c6e5 + md5: 282c90a2f61920045a68a2c336af3c51 + depends: + - __osx >=11.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libml_dtypes-headers >=0.5.0,<0.6 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_framework 2.18.0 cpu_h2398287_1 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 120088427 + timestamp: 1754497895714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.18.0-cpu_h417b707_1.conda + sha256: 4fb1e742c7b49f9a0fe92f9f323d22e42471f896e3d0405fd11dbe2a454c61dd + md5: 892f403c0d4fc4f179003df061098b06 + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9039650 + timestamp: 1754342343515 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libtensorflow_framework-2.18.0-cpu_h38b2b02_1.conda + sha256: d6c24882c9742eaf6dc1e2eb7a6e6ce9583fd5a795270d5464d1f2679f267a03 + md5: f0d5fde91b0f589e393328a515f738fb + depends: + - __osx >=10.13 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 8460411 + timestamp: 1754516861583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.18.0-cpu_h2398287_1.conda + sha256: ffe63dcf069914d686dd8a6c7a0586f8b46b3ed84d219cefb89a5a58c2ed021f + md5: 3ebee6d8f4550dd64cc76fcefbd8b3a9 + depends: + - __osx >=11.0 + - giflib >=5.2.2,<5.3.0a0 + - icu >=75.1,<76.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 7683489 + timestamp: 1754497703678 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda + sha256: c62694cd117548d810d2803da6d9063f78b1ffbf7367432c5388ce89474e9ebe + md5: b6093922931b535a7ba566b6f384fbe6 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.24,<1.25.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 433078 + timestamp: 1755011934951 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h59ddb5d_6.conda + sha256: 656dc01238d4b766e35976319aba2a9b3ea707b467b7a5aad94ef49a150be7a8 + md5: 1cb7b8054ffa9460ca3dd782062f3074 + depends: + - __osx >=10.13 + - lerc >=4.0.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.24,<1.25.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 401676 + timestamp: 1755012183336 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h025e3ab_6.conda + sha256: d6ed4b307dde5d66b73aa3f155b3ed40ba9394947cfe148e2cd07605ef4b410b + md5: d0862034c2c563ef1f52a3237c133d8d + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.24,<1.25.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 372136 + timestamp: 1755012109767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b + md5: aea31d2e5b1091feca96fcfe945c3cf9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429011 + timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda + sha256: 00dbfe574b5d9b9b2b519acb07545380a6bc98d1f76a02695be4995d4ec91391 + md5: 7bb6608cf1f83578587297a158a6630b + depends: + - __osx >=10.13 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 365086 + timestamp: 1752159528504 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd + md5: e5e7d467f80da752be17796b87fe6385 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 294974 + timestamp: 1752159906788 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 + md5: 08bfa5da6e242025304b206d152479ef + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + purls: [] + size: 35794 + timestamp: 1737099561703 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda + sha256: 8896cd5deff6f57d102734f3e672bc17120613647288f9122bec69098e839af7 + md5: bbeca862892e2898bdb45792a61c4afc + depends: + - __osx >=10.13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 323770 + timestamp: 1727278927545 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.11.0-he8b52b9_0.conda + sha256: 23f47e86cc1386e7f815fa9662ccedae151471862e971ea511c5c886aa723a54 + md5: 74e91c36d0eef3557915c68b6c2bef96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.8,<2.14.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 791328 + timestamp: 1754703902365 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h04c0eec_1.conda + sha256: 03deb1ec6edfafc5aaeecadfc445ee436fecffcda11fcd97fde9b6632acb583f + md5: 10bcbd05e1c1c9d652fccb42b776a9fa + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 698448 + timestamp: 1754315344761 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h741aa76_1.conda + sha256: 32fa908bb2f2a6636dab0edaac1d4bf5ff62ad404a82d8bb16702bc5b8eb9114 + md5: aeb49dc1f5531de13d2c0d57ffa6d0c8 + depends: + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 1519401 + timestamp: 1754315497781 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h7a3aeb2_0.conda + sha256: 35ddfc0335a18677dd70995fa99b8f594da3beb05c11289c87b6de5b930b47a3 + md5: 31059dc620fa57d787e3899ed0421e6d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxml2 >=2.13.8,<2.14.0a0 + license: MIT + license_family: MIT + purls: [] + size: 244399 + timestamp: 1753273455036 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 57133 + timestamp: 1727963183990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.8-hf4e0ed4_1.conda + sha256: 881975b8e13fb65d5e3d1cd7dd574581082af10c675c27c342e317c03ddfeaac + md5: 55ae491cc02d64a55b75ffae04d7369b + depends: + - __osx >=10.13 + constrains: + - intel-openmp <0.0a0 + - openmp 20.1.8|20.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 307933 + timestamp: 1753978812327 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.8-hbb9b287_1.conda + sha256: e56f46b253dd1a99cc01dde038daba7789fc6ed35b2a93e3fc44b8578a82b3ec + md5: a10bdc3e5d9e4c1ce554c83855dff6c4 + depends: + - __osx >=11.0 + constrains: + - openmp 20.1.8|20.1.8.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 283300 + timestamp: 1753978829840 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.8-hfa2b4ca_1.conda + sha256: 568e9dec9078055adebf6c07202be079884b85780a4542f0f326763e6f642a2d + md5: 2c3afd82c44b0bf59fa8f924e30c0513 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - openmp 20.1.8|20.1.8.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 293712 + timestamp: 1753979476933 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda + sha256: d495279d947e01300bfbc124859151be4eec3a088c1afe173323fd3aa89423b2 + md5: b0404922d0459f188768d1e613ed8a87 + depends: + - importlib-metadata >=4.4 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markdown?source=hash-mapping + size: 80353 + timestamp: 1750360406187 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + md5: 5b5203189eb668f042ac2b0826244964 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=compressed-mapping + size: 64736 + timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda + sha256: 0bed20ec27dcbcaf04f02b2345358e1161fb338f8423a4ada1cf0f4d46918741 + md5: 8ce3f0332fd6de0d737e2911d329523f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 23091 + timestamp: 1733219814479 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda + sha256: 0291d90706ac6d3eea73e66cd290ef6d805da3fad388d1d476b8536ec92ca9a8 + md5: 6565a715337ae279e351d0abd8ffe88a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 25354 + timestamp: 1733219879408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py310h8e2f543_1.conda + sha256: c3f9a8738211c82e831117f2c5161dc940295aa251ec0f7ed466bced6f861360 + md5: 946e287b30b11071874906e8b87b437c + depends: + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 22219 + timestamp: 1733219861095 +- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py311ha3cf9ac_1.conda + sha256: e9965b5d4c29b17b1512035b24a7c126ed7bdb6b39103b52cae099d5bb4194a9 + md5: 1d6596ca7c7b66215c5c0d58b3cb0dd3 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24688 + timestamp: 1733219887972 +- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312h3520af0_1.conda + sha256: d521e272f7789ca62e7617058a4ea3bd79efa73de1a39732df209ca5299e64e2 + md5: 32d6bc2407685d7e2d8db424f42018c6 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 23888 + timestamp: 1733219886634 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda + sha256: d907e2b7264ae060c0b79ad4accd7b79a59d43ca75c3ba107e534cd0d58115b5 + md5: f6483697076f2711e6a54031a54314b6 + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 22681 + timestamp: 1733219957702 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda + sha256: 4f738a7c80e34e5e5d558e946b06d08e7c40e3cc4bdf08140bf782c359845501 + md5: 249e2f6f5393bb6b36b3d3a3eebdcdf9 + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24976 + timestamp: 1733219849253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.5-py311h38be061_0.conda + sha256: c8004497e11e3570ba01fc28943435df83070f6131d8b4963d87aeacfcc0fe25 + md5: 22c06b5668ab4d7cc60793b594a9244b + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - pyside6 >=6.7.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 17403 + timestamp: 1754005868082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.5-py312h7900ff3_0.conda + sha256: 34202064bc5a358ebbf561306dd259fd220ee22b14958f62d4990886f26db44a + md5: 32511cef24b61a6e955417060d3812c5 + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - pyside6 >=6.7.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 17348 + timestamp: 1754005897072 +- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.5-py311h6eed73b_0.conda + sha256: b82db2721eaac51694a86c624588c9ac6e33297b4fccec852347a2e72ffbb867 + md5: 434d3d2551a7c1614d010027de6b8dd9 + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 17377 + timestamp: 1754006147433 +- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.5-py312hb401068_0.conda + sha256: 5d9c0052cf8920caaab5082ada3fb0b74d40037b6b2c147eaff2ef89bb94f6ba + md5: 173dd337564a978e40d7a43e501391bb + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 17426 + timestamp: 1754005867479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.5-py311ha1ab1f8_0.conda + sha256: 5b2753a46f20f47992aee27e24630ead0891b20f6192cf137a7ce56f6f302959 + md5: cfabb394d6f3cc3c8eb1577152c1b651 + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 17387 + timestamp: 1754006069577 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.5-py312h1f38498_0.conda + sha256: e75ed12886976f48e938ccd3afcc41165904589133b03e4e0f1c1ddd6ff3a071 + md5: 92933847a00ad390bc9fe99c50c73b3f + depends: + - matplotlib-base >=3.10.5,<3.10.6.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 17451 + timestamp: 1754005874746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py311h0f3be63_0.conda + sha256: 565d2b4137bf8e72660f389779c1888bc5d9beea5c1cb246f0cb49fa14a66165 + md5: d4718e47a353473a8238fe1133ddb2ca + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.7 + - python_abi 3.11.* *_cp311 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 8391696 + timestamp: 1754005838796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda + sha256: 66e94e6226fd3dd04bb89d04079e2d8e2c74d923c0bbf255e483f127aee621ff + md5: 9246288e5ef2a944f7c9c648f9f331c7 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 8071030 + timestamp: 1754005868258 +- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.5-py311h249d4ed_0.conda + sha256: d6e76b72abeda0009d98377aead6c6f1279822675aa5180c81d0f50ce246232d + md5: 733d0eefd37c558c22a88979a7b77932 + depends: + - __osx >=10.13 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.7 + - python_abi 3.11.* *_cp311 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 8421669 + timestamp: 1754006118064 +- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.5-py312hb83d5b5_0.conda + sha256: 2d9f3d2865209c3350e780bb788629e198fed71fb015e52cb162310a459453bc + md5: 4eba589e971291d9b64b96d4578110b8 + depends: + - __osx >=10.13 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 8193888 + timestamp: 1754005842129 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py311h66dac5a_0.conda + sha256: 6ae542ebf2ebc8dfaf3fc37255da3138225d12990811d309356e1296aee6aaab + md5: 912f3fdccdaf269d1fb4fe7e63f37b44 + depends: + - __osx >=11.0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python-dateutil >=2.7 + - python_abi 3.11.* *_cp311 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 8199499 + timestamp: 1754006036791 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py312h05635fa_0.conda + sha256: bc44413a9f1984e6ab39bd0b805430a4e11e41e1d0389254c4d2d056be610512 + md5: 96e5de8c96b4557430f6af0d6693d4c9 + depends: + - __osx >=11.0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=compressed-mapping + size: 8031746 + timestamp: 1754005848626 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + sha256: 69b7dc7131703d3d60da9b0faa6dd8acbf6f6c396224cf6aef3e855b8c0c41c6 + md5: af6ab708897df59bd6e7283ceab1b56b + depends: + - python >=3.9 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/matplotlib-inline?source=hash-mapping + size: 14467 + timestamp: 1733417051523 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda + sha256: f3c599cdaae53ff279255b15e3fccd01c5fb33c59d307d90513fc40ad789f91f + md5: 71abbefb6f3b95e1668cd5e0af3affb9 + depends: + - psutil + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/memory-profiler?source=hash-mapping + size: 34808 + timestamp: 1735230409520 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.3-pyh29332c3_0.conda + sha256: a67484d7dd11e815a81786580f18b6e4aa2392f292f29183631a6eccc8dc37b3 + md5: 7ec6576e328bc128f4982cd646eeba85 + depends: + - python >=3.9 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mistune?source=hash-mapping + size: 72749 + timestamp: 1742402716323 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + sha256: ce841e7c3898764154a9293c0f92283c1eb28cdacf7a164c94b632a6af675d91 + md5: 5cddc979c74b90cf5e5cda4f97d5d8bb + depends: + - llvm-openmp >=20.1.8 + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 103088799 + timestamp: 1753975600547 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.3.2-py310hcc13569_0.conda + sha256: b8d490515e31049fb3408c60cb4cdf6dc445f4bc2377033a827dbf68463d2085 + md5: 1ad84020b1ab816d7ab3f3d0859faf40 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 164312 + timestamp: 1704727828371 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py311h7db5c69_2.conda + sha256: 1e59cd504003da4171df8524a5568eab6ed818e1065957cd1c3fa83cb6a18546 + md5: 7df028e3691fb3940a03e5ad7938414e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 164649 + timestamp: 1725475216339 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.4.0-py312hf9745cd_2.conda + sha256: 0dd6a676396af5f30bbf0b872bfea2716a11585731385d0e145b55fa2958336e + md5: c070bbf2a3c9e2e6d2c64b219e2e78da + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 167320 + timestamp: 1725475244129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.1-py310h5eaa309_0.conda + sha256: 80bb8601139177f4dab0d830993de9769bc6f1db13d275e5dbcf5d6568b6e337 + md5: 080f68e04d194abdba4a0a6a5178bf61 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 283388 + timestamp: 1736538961486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.1-py311h7db5c69_0.conda + sha256: 47c3b23593c0035f22cb2d039d00b769bbe161208289a03bd47fdb7a6ef6d21f + md5: b1a321f19f23f777a5fb758621a5f4b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 285282 + timestamp: 1736538946109 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.3.2-py310h276d7da_0.conda + sha256: e0a9a60919ee96539850a90bd2b22c3ff503f11ad2235e8c69385c92d867e686 + md5: 8d6495715c5eca87bb1a85ee76894da8 + depends: + - libcxx >=15 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 133986 + timestamp: 1704728085963 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py311haeb46be_2.conda + sha256: 38dc75c0b4de3fd56707f03398d42a22572b809669936697773280c9385f3943 + md5: ab651699c3147a94b4e5bbbf2c466238 + depends: + - __osx >=10.13 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 133229 + timestamp: 1725475266320 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.4.0-py312h98e817e_2.conda + sha256: d84d8801663c4bdcd66177362735c304ed9470fd276d166401be5db2ce9f5e35 + md5: 8d5261586fc38c8bb4cac7aea898251a + depends: + - __osx >=10.13 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 136193 + timestamp: 1725475212538 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.5.1-py310h96a9d13_0.conda + sha256: e863943f050090f711f7c321c35d8bca5a127501c62d447734e770f99deec68c + md5: 57cdcd8632eb473b3fa80e5588d88c0c + depends: + - __osx >=10.13 + - libcxx >=18 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 219977 + timestamp: 1736539028850 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.5.1-py311hcf53e2f_0.conda + sha256: cea8565ceff8f61cbca0a4052de4735d508f3aaa00a8a336211baf3dd558e6cb + md5: 910daa79623b896e6cfd944c20968686 + depends: + - __osx >=10.13 + - libcxx >=18 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 224151 + timestamp: 1736539160059 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.3.2-py310h401b61c_0.conda + sha256: a4efd36ef6a235246d2c20147335e0bfcef517b0d11b097bbe71c3a8cf913397 + md5: b1d0b21e241493b257497afe02b7a7cd + depends: + - libcxx >=15 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 124673 + timestamp: 1704728245055 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py311h9cb3ce9_2.conda + sha256: fe4e2223aef3637eba3930252ec374f4caf81d41acb55b149a88b656f4d44e6a + md5: c7facb1eaa9f3d7fe8b4216c2ad802ae + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 126145 + timestamp: 1725475284063 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.4.0-py312hcd31e36_2.conda + sha256: 3931aef8f1e04f2fd9cff55a0c8dd76f818a3eb4fad5ef6cfd83649d14a663e4 + md5: 70b338acc912c1989a36ed8511f884a7 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 123771 + timestamp: 1725475270272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.1-py310h5936506_0.conda + sha256: a75c01da122fc1043e32adba9094922afc5f758ddaea47f5e56e0c111123294b + md5: 23c80623fc06fa0fa60237b14674cc69 + depends: + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 202079 + timestamp: 1736539243508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.1-py311hca32420_0.conda + sha256: 95a4fa28900d5d22159b5a31aebd41a3a7d6e1c28a6b0d0823af3be68fda896b + md5: e918244981184dc37bf7155fef07300b + depends: + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 205071 + timestamp: 1736539273501 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.7.0-pyhd8ed1ab_0.conda + sha256: d0c2253dcb1da6c235797b57d29de688dabc2e48cc49645b1cff2b52b7907428 + md5: 7c65a443d58beb0518c35b26c70e201d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/more-itertools?source=hash-mapping + size: 61359 + timestamp: 1745349566387 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/munkres?source=hash-mapping + size: 15851 + timestamp: 1749895533014 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/noarch/namex-0.1.0-pyhd8ed1ab_0.conda + sha256: 295e0ef6aae0185b55752c981eca5c11443ba9ea4c236d45112128799fd99f51 + md5: 3eb854547a0183b994431957fa0e05d2 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/namex?source=hash-mapping + size: 11936 + timestamp: 1748346473739 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + sha256: a20cff739d66c2f89f413e4ba4c6f6b59c50d5c30b5f0d840c13e8c9c2df9135 + md5: 6bb0d77277061742744176ab555b723c + depends: + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - nbformat >=5.1 + - python >=3.8 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=hash-mapping + size: 28045 + timestamp: 1734628936013 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + sha256: dcccb07c5a1acb7dc8be94330e62d54754c0e9c9cb2bb6865c8e3cfe44cf5a58 + md5: d24beda1d30748afcc87c429454ece1b + depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.9 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.16.6 *_0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbconvert?source=hash-mapping + size: 200601 + timestamp: 1738067871724 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: bbe1963f1e47f594070ffe87cdf612ea + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbformat?source=hash-mapping + size: 100945 + timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + purls: [] + size: 822259 + timestamp: 1738196181298 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/nest-asyncio?source=hash-mapping + size: 11543 + timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.0-py39hd511f7d_0.conda + noarch: python + sha256: d16c07f60852528e0a58b6ce470cbf76ae4c2825bc583a73c6625aed55d3c552 + md5: 2a7a128cb2209e1a040f104aaf773340 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.9 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3?source=hash-mapping + size: 689460 + timestamp: 1752853171670 +- conda: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.3.0-py39ha61a9bf_0.conda + noarch: python + sha256: a3fdd6a22599bf9e2522a37d40956e95032698e96470e3271dc272c428573bec + md5: 71db150ef5451e02ba9869428ce41cf0 + depends: + - python + - __osx >=10.13 + - _python_abi3_support 1.* + - cpython >=3.9 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3?source=hash-mapping + size: 651341 + timestamp: 1752853233048 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.0-py39h24c5d98_0.conda + noarch: python + sha256: bc135c9abf5b38a63abc082712af64942663f2e5373f535df52ba6fec7988a24 + md5: 12896e493335f2f37257ed070d8a4080 + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.9 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3?source=hash-mapping + size: 624089 + timestamp: 1752853325963 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + sha256: 3636eec0e60466a00069b47ce94b6d88b01419b6577d8e393da44bb5bc8d3468 + md5: 7ba3f09fceae6a120d664217e58fe686 + depends: + - python >=3.9 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 34574 + timestamp: 1734112236147 +- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056 + md5: e7f89ea5f7ea9401642758ff50a2d9c1 + depends: + - jupyter_server >=1.8,<3 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/notebook-shim?source=hash-mapping + size: 16817 + timestamp: 1733408419340 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py310ha4c1d20_0.conda + sha256: 81bba557f0f6109f7a1cb8f4d739e5c9ef310a49f8a2842f1fc67bd3545067b0 + md5: 188e72aa313da668464e35309e9a32b0 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6853721 + timestamp: 1691056650655 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda + sha256: 028fe2ea8e915a0a032b75165f11747770326f3d767e642880540c60a3256425 + md5: 6593de64c935768b6bad3e19b3e978be + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7009070 + timestamp: 1707225917496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda + sha256: 16f2c3c3f912e55ee133cb5c2ddc719152e418335ffadb9130e2ee1e269b6ea3 + md5: 61e1b42eb1d9f0ebaf038522ce9ca2fe + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 9415425 + timestamp: 1753401560940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda + sha256: d54e52df67e0be7e5faa9e6f0efccea3d72f635a3159cc151c4668e5159f6ef3 + md5: 3f6efbc40eb13f019c856c410fa921d2 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8785045 + timestamp: 1753401550884 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py313hf6604e3_0.conda + sha256: 4bb3beafb59f0e29e2e63028109e2cbbf9d10680be76192da2cea342d8892152 + md5: 34da5460bdcd8a5d360ef46cae9f626d + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=compressed-mapping + size: 8889862 + timestamp: 1753401532585 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.25.2-py310h7451ae0_0.conda + sha256: 77dbf044b2b9149e2038fdc4e99bacbff5e6163136abf84c3f94bbc438ead546 + md5: a0f919ff93f102cb1720f71448010c61 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=15.0.7 + - liblapack >=3.9.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6475227 + timestamp: 1691057173893 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py310h4bfa8fc_0.conda + sha256: 914476e2d3273fdf9c0419a7bdcb7b31a5ec25949e4afbc847297ff3a50c62c8 + md5: cd6a2298387f558c9ea70ee73a189791 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6491938 + timestamp: 1707226191321 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.2-py311h09fcace_0.conda + sha256: d72790ba7a79548b7c9d8c509d0a8f6093e0fd7bbe97e9d1bd175ffd60f426a8 + md5: 37f9922b287fd0f76a743f8e38cbea8d + depends: + - python + - __osx >=10.13 + - libcxx >=19 + - libblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8551212 + timestamp: 1753401547206 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.2-py312hda18a35_0.conda + sha256: 911e18e2f26946dfe49786186ea27b855dc6e70702b621c395ba67caa583d396 + md5: 0349ca0107bd6613fa305d0b3a08e23a + depends: + - python + - __osx >=10.13 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7944998 + timestamp: 1753401533366 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.2-py313hdb1a8e5_0.conda + sha256: 181ca508c5f2c8aab4047cc8a6ecdf596e0897c7b137bcd36ad784fa8f184d35 + md5: 6cdf47cd7a9cb038ee6f7997ab4bb59b + depends: + - python + - __osx >=10.13 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8031795 + timestamp: 1753401536338 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.25.2-py310haa1e00c_0.conda + sha256: d8eddb8573609b03fa60f5daec29da55141a1faeff8c442bb4c6fd309e40411d + md5: 6242d13bf330eccd490979aaf3b5f7e4 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=15.0.7 + - liblapack >=3.9.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 5765063 + timestamp: 1691057015909 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py310hd45542a_0.conda + sha256: e3078108a4973e73c813b89228f4bd8095ec58f96ca29f55d2e45a6223a9a1db + md5: 267ee89a3a0b8c8fa838a2353f9ea0c0 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 5475744 + timestamp: 1707226187124 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py311h0856f98_0.conda + sha256: ffe161b3ee67c55ad994fb7dfab2411f99c9baa801ef9538de756cab53bbe92d + md5: d399436ee3e7a06af9941cdf624d99c9 + depends: + - python + - python 3.11.* *_cpython + - libcxx >=19 + - __osx >=11.0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7273975 + timestamp: 1753401541542 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py312h2f38b44_0.conda + sha256: 581039072c18b2abd8dfcf7fe5c16a8fbb72e14821bad4817ca00dbb16f3bad3 + md5: c58a6fa1ee8edb9de10d0f5c91806193 + depends: + - python + - libcxx >=19 + - python 3.12.* *_cpython + - __osx >=11.0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6657726 + timestamp: 1753401542508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.2-py313h674b998_0.conda + sha256: d5141dbc26706ba882780233d773229f0c81a40947ab30c6084c7b8b70022823 + md5: 4ed71a747fb592d7d271c20be89f1966 + depends: + - python + - __osx >=11.0 + - python 3.13.* *_cp313 + - libcxx >=19 + - python_abi 3.13.* *_cp313 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6747854 + timestamp: 1753401542639 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.25.2-py310hd02465a_0.conda + sha256: 4418a99e711ed162b69d57f3c277f5e4999501dc80c89fb75f51cc59abfbcdc4 + md5: faeadcd33c1207e7bedd0ee8621ba25a + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6122526 + timestamp: 1691057309489 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py311h80b3fa1_0.conda + sha256: d4a3832f3c79f0142b613bcf1670b90d1646c636f46ccc1d69d0d3b60af8d44c + md5: ecbc2648b2d6f542a45176ee67c63764 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8017357 + timestamp: 1753401560734 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py312ha72d056_0.conda + sha256: d220cb09740cc52b06c28add13b422b646f1f5d51bb64256469b7684c6cd5deb + md5: 4bb9d6a07b0ee763301e93305a8befb0 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7375495 + timestamp: 1753401563044 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.2-py313hce7ae62_0.conda + sha256: 9fcff5c199b240a34ceff2351c2d59a682b53c3eb0b3af4f6c3e747851ef4e33 + md5: c1652f4593830a93511346187a50d903 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7460218 + timestamp: 1753401558693 +- conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.9.0-pyhe01879c_1.conda + sha256: 9e1f3dda737ac9aeec3c245c5d856d0268c4f64a5293c094298d74bb55e2b165 + md5: 66f9ba52d846feffa1c5d62522324b4f + depends: + - python >=3.9 + - sphinx >=6 + - tomli >=1.1.0 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpydoc?source=hash-mapping + size: 60220 + timestamp: 1750861325361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda + sha256: 0b7396dacf988f0b859798711b26b6bc9c6161dca21bacfd778473da58730afa + md5: 01243c4aaf71bde0297966125aea4706 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libstdcxx >=14 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 357828 + timestamp: 1754297886899 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h036ada5_1.conda + sha256: fea2a79edb123fda31d73857e96b6cd24404a31d41693d8ef41235caed74b28e + md5: 38f264b121a043cf379980c959fb2d75 + depends: + - __osx >=10.13 + - libcxx >=19 + - libpng >=1.6.50,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 336370 + timestamp: 1754297904811 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda + sha256: 6013916893fcd9bc97c479279cfe4616de7735ec566bad0ee41bc729e14d31b2 + md5: ab581998c77c512d455a13befcddaac3 + depends: + - __osx >=11.0 + - libcxx >=19 + - libpng >=1.6.50,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 320198 + timestamp: 1754297986425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 + md5: 2e5bf4f1da39c0b32778561c3c4e5878 + depends: + - __glibc >=2.17,<3.0.a0 + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + purls: [] + size: 780253 + timestamp: 1748010165522 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e + md5: ffffb341206dd0dab0c36053c048d621 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3128847 + timestamp: 1754465526100 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.2-h6e31bce_0.conda + sha256: 8be57a11019666aa481122c54e29afd604405b481330f37f918e9fbcd145ef89 + md5: 22f5d63e672b7ba467969e9f8b740ecd + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2743708 + timestamp: 1754466962243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 + md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3074848 + timestamp: 1754465710470 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9275175 + timestamp: 1754467904482 +- conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + sha256: af71aabb2bfa4b2c89b7b06403e5cec23b418452cae9f9772bd7ac3f9ea1ff44 + md5: 52919815cd35c4e1a0298af658ccda04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/opt-einsum?source=hash-mapping + size: 62479 + timestamp: 1733688053334 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py310h03d9f68_0.conda + sha256: 2564bafa2033fa28798c986ef63e9c442b5855263a6d2b541ea43e626b63f69b + md5: 0e19e5ce27730b0031fbf7e87acfb173 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 406002 + timestamp: 1753455232017 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py311hdf67eae_0.conda + sha256: e6a747d6209835d2549329b8d4fd50a2e71da49162ca8a4ce6c27eb2f13b97ca + md5: ae04929eabf2cdfd6021d8e46d3e3c55 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 439473 + timestamp: 1753455345035 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.17.0-py312hd9148b4_0.conda + sha256: 9fa714a72689100a2f93fe61688a7ab58a78e8dc9129100f16c8b55ae6f33167 + md5: 9e4881c215bff288c23f1f17cc775f6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 443282 + timestamp: 1753455215533 +- conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py310h50c4e7d_0.conda + sha256: 441f9fbafdd12b6b2eaa05f4fa9148c87b31416228666ceafd8b0333ed9691f2 + md5: 48540f699b9571f94e1533d7d0119736 + depends: + - __osx >=10.13 + - libcxx >=19 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 381217 + timestamp: 1753455302130 +- conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py311hd4d69bb_0.conda + sha256: e7e3a7510c0197d3e6ba1bb65ff2fa4e50db23684961732fd199a0bdb97bef2f + md5: 661d30277f7ede3c72ad6046eebfe081 + depends: + - __osx >=10.13 + - libcxx >=19 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 409309 + timestamp: 1753455339755 +- conda: https://conda.anaconda.org/conda-forge/osx-64/optree-0.17.0-py312hedd4973_0.conda + sha256: 5ca15365a115ef368e163c0a64665b5278103abcacd0ee78960dafb3d019390e + md5: ff4676a2828ebea6500cd096152d937f + depends: + - __osx >=10.13 + - libcxx >=19 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 412444 + timestamp: 1753455346342 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py310hc9b05e5_0.conda + sha256: 0c18a9ebeea0c69aba68e845add297e970569eeb1293d4ea6ee7530c8a153018 + md5: 0b751094ed6b229740aded84ba4e72f4 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 362410 + timestamp: 1753455346194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py311h57a9ea7_0.conda + sha256: 019b16f4773ce2d4972f31ae4f4ba75999328740be7d9dc5a6ed4b30e52c93eb + md5: bdbc1d71fd5039a51d36b1de6c5624b7 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 389395 + timestamp: 1753455526684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.17.0-py312ha0dd364_0.conda + sha256: d168a71ff2df24ed0fadea44bf8064da2420ac68727ed8d29376a5acb06e1c79 + md5: 1979415e9220b8abb51b4902ed0b3f83 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + size: 388919 + timestamp: 1753455489017 +- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c + md5: e51f1e4089cad105b6cac64bd8166587 + depends: + - python >=3.9 + - typing_utils + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/overrides?source=hash-mapping + size: 30139 + timestamp: 1734587755455 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 62477 + timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.3-py310h7cbd5c2_1.conda + sha256: e8937c160b6eb469c5d80971046b25ed305fd97a8b1d6880de7c4a660cd245c3 + md5: 11e0099d4571b4974c04386e4ce679ed + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.10.* *_cp310 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 12296643 + timestamp: 1688741475871 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py311hed34c8f_0.conda + sha256: f9b19ac8eb0ac934ebf3eb84a1ac65099f3e2a62471cec13345243d848226ef7 + md5: 70b40d25020d03cc61ad9f1a76b90a7d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + constrains: + - lxml >=4.9.2 + - fastparquet >=2022.12.0 + - pandas-gbq >=0.19.0 + - xlsxwriter >=3.0.5 + - tabulate >=0.9.0 + - fsspec >=2022.11.0 + - xlrd >=2.0.1 + - zstandard >=0.19.0 + - numexpr >=2.8.4 + - blosc >=1.21.3 + - qtpy >=2.3.0 + - pyqt5 >=5.15.9 + - numba >=0.56.4 + - gcsfs >=2022.11.0 + - html5lib >=1.1 + - beautifulsoup4 >=4.11.2 + - pyarrow >=10.0.1 + - pyxlsb >=1.0.10 + - python-calamine >=0.1.7 + - xarray >=2022.12.0 + - matplotlib >=3.6.3 + - openpyxl >=3.1.0 + - sqlalchemy >=2.0.0 + - odfpy >=1.4.1 + - psycopg2 >=2.9.6 + - pyreadstat >=1.2.0 + - tzdata >=2022.7 + - pytables >=3.8.0 + - s3fs >=2022.11.0 + - scipy >=1.10.0 + - bottleneck >=1.3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15369643 + timestamp: 1752082224022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py312hf79963d_0.conda + sha256: 6ec86b1da8432059707114270b9a45d767dac97c4910ba82b1f4fa6f74e077c8 + md5: 7c73e62e62e5864b8418440e2a2cc246 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.12.* *_cp312 + - pytz >=2020.1 + constrains: + - html5lib >=1.1 + - fastparquet >=2022.12.0 + - xarray >=2022.12.0 + - pyqt5 >=5.15.9 + - pyxlsb >=1.0.10 + - matplotlib >=3.6.3 + - numba >=0.56.4 + - odfpy >=1.4.1 + - bottleneck >=1.3.6 + - tabulate >=0.9.0 + - scipy >=1.10.0 + - pyreadstat >=1.2.0 + - pandas-gbq >=0.19.0 + - openpyxl >=3.1.0 + - xlrd >=2.0.1 + - pyarrow >=10.0.1 + - xlsxwriter >=3.0.5 + - python-calamine >=0.1.7 + - gcsfs >=2022.11.0 + - zstandard >=0.19.0 + - fsspec >=2022.11.0 + - lxml >=4.9.2 + - s3fs >=2022.11.0 + - numexpr >=2.8.4 + - psycopg2 >=2.9.6 + - qtpy >=2.3.0 + - pytables >=3.8.0 + - tzdata >=2022.7 + - sqlalchemy >=2.0.0 + - beautifulsoup4 >=4.11.2 + - blosc >=1.21.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15092371 + timestamp: 1752082221274 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py313h08cd8bf_0.conda + sha256: e7331b169835d8f22d7fc7dfa16c075de8a2e95245b89623097017a9cb87d623 + md5: 0b23bc9b44d838b88f3ec8ab780113f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + constrains: + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - blosc >=1.21.3 + - numexpr >=2.8.4 + - s3fs >=2022.11.0 + - zstandard >=0.19.0 + - pyxlsb >=1.0.10 + - qtpy >=2.3.0 + - xlrd >=2.0.1 + - numba >=0.56.4 + - matplotlib >=3.6.3 + - fastparquet >=2022.12.0 + - python-calamine >=0.1.7 + - bottleneck >=1.3.6 + - html5lib >=1.1 + - odfpy >=1.4.1 + - pytables >=3.8.0 + - fsspec >=2022.11.0 + - pyreadstat >=1.2.0 + - lxml >=4.9.2 + - sqlalchemy >=2.0.0 + - openpyxl >=3.1.0 + - beautifulsoup4 >=4.11.2 + - tabulate >=0.9.0 + - xlsxwriter >=3.0.5 + - xarray >=2022.12.0 + - gcsfs >=2022.11.0 + - scipy >=1.10.0 + - pandas-gbq >=0.19.0 + - pyarrow >=10.0.1 + - pyqt5 >=5.15.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15120709 + timestamp: 1752082214786 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.0.3-py310h5e4fcda_1.conda + sha256: 797be0eff944a01ec3bbac43dbe2b860e42ae530d2f4188c05409c6f95174402 + md5: 5b1a8f096180ca4c39ddea7ccdb9d4a7 + depends: + - libcxx >=15.0.7 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.10.* *_cp310 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 11741378 + timestamp: 1688741606761 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py311hf4bc098_0.conda + sha256: 7a372f0dd1abc11468fb7ec357279730f37c6ffe6a2272fa0ee45ed95dee39f1 + md5: b574a18f6b0cb48b8ae30506aa1bf2d7 + depends: + - __osx >=10.13 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + constrains: + - xarray >=2022.12.0 + - bottleneck >=1.3.6 + - tzdata >=2022.7 + - pyxlsb >=1.0.10 + - scipy >=1.10.0 + - sqlalchemy >=2.0.0 + - pandas-gbq >=0.19.0 + - psycopg2 >=2.9.6 + - beautifulsoup4 >=4.11.2 + - blosc >=1.21.3 + - odfpy >=1.4.1 + - xlrd >=2.0.1 + - numexpr >=2.8.4 + - openpyxl >=3.1.0 + - fsspec >=2022.11.0 + - tabulate >=0.9.0 + - pyarrow >=10.0.1 + - python-calamine >=0.1.7 + - gcsfs >=2022.11.0 + - pyreadstat >=1.2.0 + - zstandard >=0.19.0 + - pyqt5 >=5.15.9 + - xlsxwriter >=3.0.5 + - numba >=0.56.4 + - html5lib >=1.1 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - fastparquet >=2022.12.0 + - pytables >=3.8.0 + - qtpy >=2.3.0 + - s3fs >=2022.11.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14567004 + timestamp: 1752082247199 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py312hbf2c5ff_0.conda + sha256: a0c3c20b33e449690d0bcef2f2589d6b8b4ed65498d82bd0935ed735fcf07e3f + md5: b54f2b1bc50bbe54852f0b790313bfe8 + depends: + - __osx >=10.13 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.12.* *_cp312 + - pytz >=2020.1 + constrains: + - fsspec >=2022.11.0 + - scipy >=1.10.0 + - fastparquet >=2022.12.0 + - zstandard >=0.19.0 + - numba >=0.56.4 + - python-calamine >=0.1.7 + - pyreadstat >=1.2.0 + - psycopg2 >=2.9.6 + - matplotlib >=3.6.3 + - xlrd >=2.0.1 + - bottleneck >=1.3.6 + - html5lib >=1.1 + - s3fs >=2022.11.0 + - pyarrow >=10.0.1 + - odfpy >=1.4.1 + - beautifulsoup4 >=4.11.2 + - pyxlsb >=1.0.10 + - xarray >=2022.12.0 + - sqlalchemy >=2.0.0 + - pytables >=3.8.0 + - pyqt5 >=5.15.9 + - tabulate >=0.9.0 + - qtpy >=2.3.0 + - blosc >=1.21.3 + - openpyxl >=3.1.0 + - tzdata >=2022.7 + - gcsfs >=2022.11.0 + - xlsxwriter >=3.0.5 + - numexpr >=2.8.4 + - lxml >=4.9.2 + - pandas-gbq >=0.19.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14253723 + timestamp: 1752082246640 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.1-py313h366a99e_0.conda + sha256: c4571cf77d528dcef2c3b2f75c987e6139d1fd2c1e948779afacb26b28d989bf + md5: 3f95c70574b670f1f8e4f28d66aca339 + depends: + - __osx >=10.13 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + constrains: + - lxml >=4.9.2 + - html5lib >=1.1 + - blosc >=1.21.3 + - sqlalchemy >=2.0.0 + - odfpy >=1.4.1 + - fastparquet >=2022.12.0 + - numba >=0.56.4 + - s3fs >=2022.11.0 + - tzdata >=2022.7 + - openpyxl >=3.1.0 + - fsspec >=2022.11.0 + - gcsfs >=2022.11.0 + - matplotlib >=3.6.3 + - pyxlsb >=1.0.10 + - beautifulsoup4 >=4.11.2 + - xlsxwriter >=3.0.5 + - qtpy >=2.3.0 + - pyarrow >=10.0.1 + - python-calamine >=0.1.7 + - pytables >=3.8.0 + - scipy >=1.10.0 + - xlrd >=2.0.1 + - pyqt5 >=5.15.9 + - bottleneck >=1.3.6 + - numexpr >=2.8.4 + - pyreadstat >=1.2.0 + - xarray >=2022.12.0 + - zstandard >=0.19.0 + - tabulate >=0.9.0 + - pandas-gbq >=0.19.0 + - psycopg2 >=2.9.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14260153 + timestamp: 1752082247312 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.0.3-py310h1cdf563_1.conda + sha256: d2ac911bf24f39dd83a83ea15333291b175227961bf2d45bad31317243c4fdb1 + md5: 680ece3f188b726782ef4aa84e8cca12 + depends: + - libcxx >=15.0.7 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.10.* *_cp310 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 11705997 + timestamp: 1688741660429 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py311hff7e5bb_0.conda + sha256: b49a99663fa1cefbd6833ad96f5540486b5bba2a7896c786e3c5e7e701dd8903 + md5: 428db6a596a76367ce13eb63f9ecd4b5 + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + constrains: + - numba >=0.56.4 + - html5lib >=1.1 + - sqlalchemy >=2.0.0 + - scipy >=1.10.0 + - xlrd >=2.0.1 + - gcsfs >=2022.11.0 + - fastparquet >=2022.12.0 + - pytables >=3.8.0 + - s3fs >=2022.11.0 + - pyqt5 >=5.15.9 + - xlsxwriter >=3.0.5 + - tabulate >=0.9.0 + - blosc >=1.21.3 + - odfpy >=1.4.1 + - pandas-gbq >=0.19.0 + - qtpy >=2.3.0 + - lxml >=4.9.2 + - pyarrow >=10.0.1 + - python-calamine >=0.1.7 + - tzdata >=2022.7 + - psycopg2 >=2.9.6 + - numexpr >=2.8.4 + - xarray >=2022.12.0 + - fsspec >=2022.11.0 + - pyreadstat >=1.2.0 + - zstandard >=0.19.0 + - bottleneck >=1.3.6 + - matplotlib >=3.6.3 + - beautifulsoup4 >=4.11.2 + - pyxlsb >=1.0.10 + - openpyxl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14364425 + timestamp: 1752082703458 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py312h98f7732_0.conda + sha256: f4f98436dde01309935102de2ded045bb5500b42fb30a3bf8751b15affee4242 + md5: d3775e9b27579a0e96150ce28a2542bd + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.12.* *_cp312 + - pytz >=2020.1 + constrains: + - openpyxl >=3.1.0 + - pyarrow >=10.0.1 + - s3fs >=2022.11.0 + - zstandard >=0.19.0 + - psycopg2 >=2.9.6 + - fastparquet >=2022.12.0 + - fsspec >=2022.11.0 + - qtpy >=2.3.0 + - blosc >=1.21.3 + - xlsxwriter >=3.0.5 + - xarray >=2022.12.0 + - python-calamine >=0.1.7 + - tabulate >=0.9.0 + - odfpy >=1.4.1 + - numexpr >=2.8.4 + - tzdata >=2022.7 + - scipy >=1.10.0 + - pyreadstat >=1.2.0 + - beautifulsoup4 >=4.11.2 + - numba >=0.56.4 + - pyqt5 >=5.15.9 + - pytables >=3.8.0 + - lxml >=4.9.2 + - xlrd >=2.0.1 + - matplotlib >=3.6.3 + - bottleneck >=1.3.6 + - pandas-gbq >=0.19.0 + - html5lib >=1.1 + - pyxlsb >=1.0.10 + - sqlalchemy >=2.0.0 + - gcsfs >=2022.11.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 13991815 + timestamp: 1752082557265 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py313hd1f53c0_0.conda + sha256: e580627963dbc525dc78aeeea2877ff095042898edde3902db8528cc333fc99c + md5: 9e56f740327ee1950d448ec59d8492db + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + constrains: + - fsspec >=2022.11.0 + - odfpy >=1.4.1 + - tzdata >=2022.7 + - xlsxwriter >=3.0.5 + - numba >=0.56.4 + - numexpr >=2.8.4 + - gcsfs >=2022.11.0 + - bottleneck >=1.3.6 + - blosc >=1.21.3 + - s3fs >=2022.11.0 + - pyxlsb >=1.0.10 + - scipy >=1.10.0 + - qtpy >=2.3.0 + - fastparquet >=2022.12.0 + - sqlalchemy >=2.0.0 + - zstandard >=0.19.0 + - python-calamine >=0.1.7 + - lxml >=4.9.2 + - xarray >=2022.12.0 + - beautifulsoup4 >=4.11.2 + - xlrd >=2.0.1 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - pandas-gbq >=0.19.0 + - openpyxl >=3.1.0 + - pyarrow >=10.0.1 + - html5lib >=1.1 + - pyreadstat >=1.2.0 + - pytables >=3.8.0 + - tabulate >=0.9.0 + - pyqt5 >=5.15.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14015815 + timestamp: 1752082296385 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.0.3-py310h1c4a608_1.conda + sha256: 2bd9ed92347d53d7ce99b3b45b832ecd6c3dd9ae68ca7153841dcab943ba6a85 + md5: 9fb6d4a7414daf2aa66ddfa14d568fd0 + depends: + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.10.* *_cp310 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 11000365 + timestamp: 1688741630200 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.1-py313hc90dcd4_0.conda + sha256: b39c5c5020a374cad19512f4969a3e67186f7bfe67d26945db46c04a92814cb4 + md5: 7f716cab8fd235019f7bf8e29b4e9b56 + depends: + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - pyqt5 >=5.15.9 + - s3fs >=2022.11.0 + - matplotlib >=3.6.3 + - numexpr >=2.8.4 + - xarray >=2022.12.0 + - sqlalchemy >=2.0.0 + - pandas-gbq >=0.19.0 + - tabulate >=0.9.0 + - xlsxwriter >=3.0.5 + - scipy >=1.10.0 + - fastparquet >=2022.12.0 + - bottleneck >=1.3.6 + - python-calamine >=0.1.7 + - lxml >=4.9.2 + - xlrd >=2.0.1 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - qtpy >=2.3.0 + - openpyxl >=3.1.0 + - zstandard >=0.19.0 + - pyreadstat >=1.2.0 + - psycopg2 >=2.9.6 + - fsspec >=2022.11.0 + - odfpy >=1.4.1 + - beautifulsoup4 >=4.11.2 + - blosc >=1.21.3 + - pytables >=3.8.0 + - pyarrow >=10.0.1 + - html5lib >=1.1 + - tzdata >=2022.7 + - gcsfs >=2022.11.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 13924933 + timestamp: 1752082433528 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandocfilters?source=hash-mapping + size: 11627 + timestamp: 1631603397334 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + sha256: 17131120c10401a99205fc6fe436e7903c0fa092f1b3e80452927ab377239bcc + md5: 5c092057b6badd30f75b06244ecd01c9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - 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 + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + sha256: ab52916f056b435757d46d4ce0a93fd73af47df9c11fd72b74cc4b7e1caca563 + md5: ee23fabfd0a8c6b8d6f3729b47b2859d + depends: + - numpy >=1.4.0 + - python >=3.9 + license: BSD-2-Clause AND PSF-2.0 + license_family: BSD + purls: + - pkg:pypi/patsy?source=hash-mapping + size: 186594 + timestamp: 1733792482894 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda + sha256: 27c4014f616326240dcce17b5f3baca3953b6bc5f245ceb49c3fa1e6320571eb + md5: b90bece58b4c2bf25969b70f3be42d25 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1197308 + timestamp: 1745955064657 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + purls: + - pkg:pypi/pexpect?source=hash-mapping + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + sha256: e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b + md5: 11a9d1d09a3615fc07c3faf79bc0b943 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pickleshare?source=hash-mapping + size: 11748 + timestamp: 1733327448200 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda + sha256: cf296d5185090f27ac4e3d73177ff865ca87307c815d759f3baa0f9c8680a250 + md5: 8b4568b1357f5ec5494e36b06076c3a1 + depends: + - __glibc >=2.17,<3.0.a0 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=13 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 43054892 + timestamp: 1751482121228 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda + sha256: 7c9a8f65a200587bf7a0135ca476f9c472348177338ed8b825ddcc08773fde68 + md5: 7911e727a6c24db662193a960b81b6b2 + depends: + - __glibc >=2.17,<3.0.a0 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=13 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42964111 + timestamp: 1751482158083 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.3.0-py311h25da234_0.conda + sha256: 407b51154fac30242ff797b58aa841dd71233e0fcdf3a9c704cf706fea15af00 + md5: 16c2e3310d762b1ce0fea2b0c2fd381f + depends: + - __osx >=10.13 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42386550 + timestamp: 1751482240771 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.3.0-py312hd9f36e3_0.conda + sha256: c80c1e858659beadcd9de16ccb208a319d34cce9a6412731cf2d08dfc1eb86fa + md5: a3c63eeab0ecca11e93104aebed345fc + depends: + - __osx >=10.13 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42486529 + timestamp: 1751482537411 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py311hb9ba9e9_0.conda + sha256: 6eb85c7828cd28f79980dff822a2acac74c8edaa186a9dfef53bc2bf7421cd26 + md5: afcdff84f6b7dd35ba49f3fe55dcc90f + depends: + - __osx >=11.0 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42028662 + timestamp: 1751482509684 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.3.0-py312h50aef2c_0.conda + sha256: 3d60288e8cfd42e4548c9e5192a285e73f81df2869f69b9d3905849b45d9bd2a + md5: dddff48655b5cd24a5170a6df979943a + depends: + - __osx >=11.0 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42514714 + timestamp: 1751482419501 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda + sha256: ec9ed3cef137679f3e3a68e286c6efd52144684e1be0b05004d9699882dadcdd + md5: dfce4b2af4bfe90cdcaf56ca0b28ddf5 + depends: + - python >=3.9,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=compressed-mapping + size: 1177168 + timestamp: 1753924973872 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 450960 + timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + sha256: 0f48999a28019c329cd3f6fd2f01f09fc32cc832f7d6bbe38087ddac858feaa3 + md5: 424844562f5d337077b445ec6b1398a7 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 23531 + timestamp: 1746710438805 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 24246 + timestamp: 1747339794916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + sha256: 66b6d429ab2201abaa7282af06b17f7631dcaafbc5aff112922b48544514b80a + md5: bc6c44af2a9e6067dd7e949ef10cdfba + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 195839 + timestamp: 1754831350570 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.22.1-pyhd8ed1ab_0.conda + sha256: 454e2c0ef14accc888dd2cd2e8adb8c6a3a607d2d3c2f93962698b5718e6176d + md5: c64b77ccab10b822722904d889fa83b5 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/prometheus-client?source=hash-mapping + size: 52641 + timestamp: 1748896836631 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + sha256: ebc1bb62ac612af6d40667da266ff723662394c0ca78935340a5b5c14831227b + md5: d17ae9db4dc594267181bd199bf9a551 + depends: + - python >=3.9 + - wcwidth + constrains: + - prompt_toolkit 3.0.51 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 271841 + timestamp: 1744724188108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-4.25.3-py310h0e2eeba_1.conda + sha256: 03361d8328089e3f0b762e887fefb74bb74f3d81325f8c448054a90adb0bc6c8 + md5: 3e274aa9ac708a9f34ee2a0009c01e5b + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libgcc >=13 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 331722 + timestamp: 1725018565633 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py311hfdbb021_0.conda + sha256: 2d9b2b9a7549e7dd58138cd3211a11893b8f6dee5a1137529623bf92cddba45b + md5: ddf920c3b5d1cbd5ffbea591d2ad09ea + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 471398 + timestamp: 1731366737017 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + sha256: acb2e0ee948e3941f8ed191cb77f654e06538638aed8ccd71cbc78a15242ebbb + md5: 9d7e427d159c1b2d516cc047ff177c48 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 464794 + timestamp: 1731366525051 +- conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-4.25.3-py310h533c97b_1.conda + sha256: 97799a7482fd2b9865dd581f6c965a36d94b79e37671aed9a9f38322e68c8321 + md5: fddd3718db0f26d38132b955b2db1e81 + depends: + - __osx >=10.13 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcxx >=17 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 315927 + timestamp: 1725018684969 +- conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py311hc356e98_0.conda + sha256: 649e58ab635f3427385ca50ee140378f18fa2ad7c859cfc1467a35943c84e2e2 + md5: 285db01a934e27ed55ee2d0c7457d1ff + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 460403 + timestamp: 1731366830835 +- conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-5.28.3-py312haafddd8_0.conda + sha256: b42f78b07c09ba48ccd8aefce8fc28eb2c07a820667965a2219138b0b81cd56e + md5: 519d8df0d097c2c2fcccf87bc2d65fe1 + depends: + - __osx >=10.13 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 452197 + timestamp: 1731366580337 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-4.25.3-py310ha1b16c5_1.conda + sha256: 5b0c50ca224e12bd07eafe32b5708fe82d92513e23db404421f9ec00ddbe37e8 + md5: 8d1dc9d4be78c814024a8a60fa62b5b7 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcxx >=17 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 314747 + timestamp: 1725018767731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py311h155a34a_0.conda + sha256: 18a1b3e59b76c27b03318818e85f7a66b035de77c6b32f077e4af72efbc12269 + md5: ab0b501f96671046b577316280ddb72b + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 457403 + timestamp: 1731367189837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 + md5: 5afbe52a59f04dd1fe566d0d17590d7e + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 448803 + timestamp: 1731367010746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py311h9ecbd09_0.conda + sha256: 50d0944b59a9c6dfa6b99cc2632bf8bc9bef9c7c93710390ded6eac953f0182d + md5: 1a390a54b2752169f5ba4ada5a8108e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 484778 + timestamp: 1740663319335 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + sha256: 158047d7a80e588c846437566d0df64cec5b0284c7184ceb4f3c540271406888 + md5: 8e30db4239508a538e4a3b3cdf5b9616 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 466219 + timestamp: 1740663246825 +- conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py311h4d7f069_0.conda + sha256: e290563f61f810f745b32d4c1ebe4ec87827323134f6bee2e8cc894391cbc548 + md5: 7b5cdf63ced6576ead40a82ea0616322 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 490169 + timestamp: 1740663371249 +- conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py312h01d7ebd_0.conda + sha256: bdfa40a1ef3a80c3bec425a5ed507ebda2bdebce2a19bccb000db9d5c931750c + md5: fcad6b89f4f7faa999fa4d887eab14ba + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 473946 + timestamp: 1740663466925 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py311h917b07b_0.conda + sha256: 3ea107f769b3ac99411f6bd6d86f946566ba3983894cbeb0e43439934a90c2f5 + md5: 12f8d65fb5a6bd03aedd5ac74391f1ea + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 492006 + timestamp: 1740663355030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py312hea69d52_0.conda + sha256: cb11dcb39b2035ef42c3df89b5a288744b5dcb5a98fb47385760843b1d4df046 + md5: 0f461bd37cb428dc20213a08766bb25d + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 476376 + timestamp: 1740663381256 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda + sha256: 05944ca3445f31614f8c674c560bca02ff05cb51637a96f665cb2bbe496099e5 + md5: 8bcf980d2c6b17094961198284b8e862 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 8364 + timestamp: 1726802331537 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/ptyprocess?source=hash-mapping + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pure-eval?source=hash-mapping + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.25.1-pyhd8ed1ab_0.conda + sha256: 3053895e08ce56923e48eea7d1c07a6d8bf09948d1e69a21ae7ab9e459b0a227 + md5: 9c25a850410220d31085173fbfdfa191 + depends: + - importlib-metadata + - latexcodec >=1.0.4 + - python >=3.9 + - pyyaml >=3.01 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex?source=hash-mapping + size: 73965 + timestamp: 1751015096707 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py311h38be061_2.conda + sha256: f6ce37fc10a1c003f0db95a2bec20f3df09802617815cb848fa379a79c660b76 + md5: a092cf434b09ea147245e978999a379d + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16886 + timestamp: 1725691834495 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda + sha256: bf9c8f4c5282d46ce54bd2c6837fa5ff7a1c112382be3d13a7a0ae038d92b7c7 + md5: 0472f87b9dc0b1db7b501f4d814ba90b + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16629 + timestamp: 1725691821342 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py311h6eed73b_2.conda + sha256: 1369e4901a1f75503ba96cb1f6810a292fd74168132d8415a0535d03804f99cc + md5: ae7f6f48333c569d3d14f65e3a720403 + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16872 + timestamp: 1725691839313 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda + sha256: b2668b6b195c2fbcdffddb98ebb489e77b21b96d35056a2f5eb6e36b7b3a3fbf + md5: 5becc4ce9642b93f69bcf091ce1f8104 + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16678 + timestamp: 1725691864150 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py311h267d04e_2.conda + sha256: 0082d4294c41f464b0cb40ba131614c796c572acf98a316f658d09ada7d14152 + md5: ba6c0a1c98470d2d416823f074aa427f + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 17289 + timestamp: 1725691887200 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda + sha256: 246ff1b7cd335a5ffb60f180426d1f7c75b7abd04e8a54dfb95ac499b5bb8307 + md5: 573f5bef5c0b4ea1405e78e941a29284 + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 17243 + timestamp: 1725691887793 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + sha256: 073473ba9c0cc3946026dde9112d2edb0ac52f6cc35d2126f4bff8bad1cc74a6 + md5: 837aaf71ddf3b27acae0e7e9015eebc6 + depends: + - accessible-pygments + - babel + - beautifulsoup4 + - docutils !=0.17.0 + - pygments >=2.7 + - python >=3.9 + - sphinx >=6.1 + - typing_extensions + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pydata-sphinx-theme?source=hash-mapping + size: 1547597 + timestamp: 1734446468767 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 889287 + timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.1-py311h2f44256_0.conda + sha256: 1124855261a8ddbe89d3d3d9bff81baa367d2f8b8300d0d94bb0db011f34e07c + md5: 9ed5f7f859b030414087e221e6881fe1 + depends: + - __osx >=10.13 + - libffi >=3.4.6,<3.5.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-core?source=hash-mapping + size: 486545 + timestamp: 1750207980507 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.1-py311hf0763de_0.conda + sha256: ae4d7acab635209c88586849e1023892fc3242b0540567178efc17546eb33586 + md5: bff41faa73404184a27ec3903bc1baf2 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-core?source=hash-mapping + size: 476864 + timestamp: 1750208146293 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.1-py311hfbc4093_0.conda + sha256: f8055dedb38952114787e56cf56827108daff2b9c1e340e0fe1e45164eef3825 + md5: 1ea1af1e872c875b1532c6b5c562a0ee + depends: + - __osx >=10.13 + - libffi >=3.4.6,<3.5.0a0 + - pyobjc-core 11.1.* + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping + size: 384309 + timestamp: 1750225386024 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.1-py311hab620ed_0.conda + sha256: 78d7e37661a41f18190a9b51c74712e69f7fdc2505fb2d5866d1d1843acb98e3 + md5: 1cdf530164d41cf7424e28f39562fe83 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - pyobjc-core 11.1.* + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping + size: 390526 + timestamp: 1750225447749 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda + sha256: afe32182b1090911b64ac0f29eb47e03a015d142833d8a917defd65d91c99b74 + md5: aa0028616c0750c773698fdc254b2b8d + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=compressed-mapping + size: 102292 + timestamp: 1753873557076 +- pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + name: pyproject-hooks + version: 1.2.0 + sha256: 9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.1-py311h846acb3_0.conda + sha256: e12c65ff50636191f2145117d1bb1b9f9d95e066fe89e1ad214958a92d7532cb + md5: ad35b71ce948f1a2b5b1452a9cc46823 + depends: + - __glibc >=2.17,<3.0.a0 + - libclang13 >=20.1.6 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libxml2 >=2.13.8,<2.14.0a0 + - libxslt >=1.1.39,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - qt6-main 6.9.1.* + - qt6-main >=6.9.1,<6.10.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=hash-mapping + - pkg:pypi/shiboken6?source=hash-mapping + size: 10156720 + timestamp: 1749047391642 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.1-py312hdb827e4_0.conda + sha256: 782c46d57daf2e027cd4d6a7c440ccecf09aca34e200d209b1d1a4ebb0548789 + md5: 843ad8ae4523f47a7f636f576750c487 + depends: + - __glibc >=2.17,<3.0.a0 + - libclang13 >=20.1.6 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libxml2 >=2.13.8,<2.14.0a0 + - libxslt >=1.1.39,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - qt6-main 6.9.1.* + - qt6-main >=6.9.1,<6.10.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=hash-mapping + - pkg:pypi/shiboken6?source=hash-mapping + size: 10133664 + timestamp: 1749047343971 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + sha256: 93e267e4ec35353e81df707938a6527d5eb55c97bf54c3b87229b69523afb59d + md5: a49c2283f24696a7b30367b7346a0144 + depends: + - colorama >=0.4 + - exceptiongroup >=1 + - iniconfig >=1 + - packaging >=20 + - pluggy >=1.5,<2 + - pygments >=2.7.2 + - python >=3.9 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 276562 + timestamp: 1750239526127 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + sha256: 218306243faf3c36347131c2b36bb189daa948ac2e92c7ab52bb26cc8c157b3c + md5: c54c0107057d67ddf077751339ec2c63 + depends: + - coverage >=5.2.1 + - pytest >=4.6 + - python >=3.8 + - toml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + size: 25507 + timestamp: 1711411153367 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + sha256: b7b58a5be090883198411337b99afb6404127809c3d1c9f96e99b59f36177a96 + md5: 8375cfbda7c57fbceeda18229be10417 + depends: + - execnet >=2.1 + - pytest >=7.0.0 + - python >=3.9 + constrains: + - psutil >=3.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-xdist?source=hash-mapping + size: 39300 + timestamp: 1751452761594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda + sha256: 4111e5504fa4f4fb431d3a73fa606daccaf23a5a1da0f17a30db70ffad9336a7 + md5: 4ea0c77cdcb0b81813a0436b162d7316 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.10.* *_cp310 + license: Python-2.0 + purls: [] + size: 25042108 + timestamp: 1749049293621 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + sha256: 9979a7d4621049388892489267139f1aa629b10c26601ba5dce96afc2b1551d4 + md5: 8c399445b6dc73eab839659e6c7b5ad1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 30629559 + timestamp: 1749050021812 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + sha256: 6cca004806ceceea9585d4d655059e951152fc774a471593d4f5138e6a54c81d + md5: 94206474a5608243a10c92cefbe0908f + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31445023 + timestamp: 1749050216615 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.5-hec9711d_102_cp313.conda + build_number: 102 + sha256: c2cdcc98ea3cbf78240624e4077e164dc9d5588eefb044b4097c3df54d24d504 + md5: 89e07d92cf50743886f41638d58c4328 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 33273132 + timestamp: 1750064035176 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.18-h93e8a92_0_cpython.conda + sha256: 6a8d4122fa7406d31919eee6cf8e0185f4fb13596af8fdb7c7ac46d397b02de8 + md5: 00299cefe3c38a8e200db754c4f025c4 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.10.* *_cp310 + license: Python-2.0 + purls: [] + size: 12921103 + timestamp: 1749048830353 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.13-h9ccd52b_0_cpython.conda + sha256: d8e15db837c10242658979bc475298059bd6615524f2f71365ab8e54fbfea43c + md5: 6e28c31688c6f1fdea3dc3d48d33e1c0 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 15423460 + timestamp: 1749049420299 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.11-h9ccd52b_0_cpython.conda + sha256: ebda5b5e8e25976013fdd81b5ba253705b076741d02bdc8ab32763f2afb2c81b + md5: 06049132ecd09d0c1dc3d54d93cf1d5d + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13571569 + timestamp: 1749049058713 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + build_number: 102 + sha256: 8b2f14010eb0baf04ed1eb3908c9e184cd14512c4d64c43f313251b90e75b345 + md5: afa9492a7d31f6f7189ca8f08aceadac + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 13955531 + timestamp: 1750063132430 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.18-h6cefb37_0_cpython.conda + sha256: a9b9a74a98348019b28be674cc64c23d28297f3d0d9ebe079e81521b5ab5d853 + md5: 2732121b53b3651565a84137c795605d + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.10.* *_cp310 + license: Python-2.0 + purls: [] + size: 12385306 + timestamp: 1749048585934 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + sha256: 2c966293ef9e97e66b55747c7a97bc95ba0311ac1cf0d04be4a51aafac60dcb1 + md5: 95facc4683b7b3b9cf8ae0ed10f30dce + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 14573820 + timestamp: 1749048947732 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.11-hc22306f_0_cpython.conda + sha256: cde8b944c2dc378a5afbc48028d0843583fd215493d5885a80f1b41de085552f + md5: 9207ebad7cfbe2a4af0702c92fd031c4 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13009234 + timestamp: 1749048134449 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.18-h8c5b53a_0_cpython.conda + sha256: 548f9e542e72925d595c66191ffd17056f7c0029b7181e2d99dbef47e4f3f646 + md5: f1775dab55c8a073ebd024bfb2f689c1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - python_abi 3.10.* *_cp310 + license: Python-2.0 + purls: [] + size: 15832933 + timestamp: 1749048670944 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + sha256: 723dbca1384f30bd2070f77dd83eefd0e8d7e4dda96ac3332fbf8fe5573a8abb + md5: bedbb6f7bb654839719cd528f9b298ad + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 18242669 + timestamp: 1749048351218 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.11-h3f84c4b_0_cpython.conda + sha256: b69412e64971b5da3ced0fc36f05d0eacc9393f2084c6f92b8f28ee068d83e2e + md5: 6aa5e62df29efa6319542ae5025f4376 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 15829289 + timestamp: 1749047682640 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.5-h7de537c_102_cp313.conda + build_number: 102 + sha256: 3de2b9f89b220cb779f6947cf87b328f73d54eed4f7e75a3f9337caeb4443910 + md5: a9a4658f751155c819d6cd4c47f0a4d2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + purls: [] + size: 16825621 + timestamp: 1750062318985 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + sha256: 1b09a28093071c1874862422696429d0d35bd0b8420698003ac004746c5e82a2 + md5: 38e34d2d1d9dca4fb2b9a0a04f604e2c + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fastjsonschema?source=hash-mapping + size: 226259 + timestamp: 1733236073335 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.2.10-pyhbc23db3_0.conda + sha256: 0d1ebed2c296e11f15b53cb97c7a8222d597658f76e12559c6b509f604b72056 + md5: 2c18ee679aa838a190eeaae5a14afc9e + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/flatbuffers?source=hash-mapping + size: 34490 + timestamp: 1739279336726 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.13-hd8ed1ab_0.conda + sha256: 9bc2f57084388a955ba799240359d73083fb27c45bb02f3a3eff72b4948718c5 + md5: dc7aefbecef49699c2cd086f2431049d + depends: + - cpython 3.11.13.* + - python_abi * *_cp311 + license: Python-2.0 + purls: [] + size: 47472 + timestamp: 1749048180043 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/python-json-logger?source=hash-mapping + size: 13383 + timestamp: 1677079727691 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 + md5: 88476ae6ebd24f39261e0854ac244f33 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 144160 + timestamp: 1742745254292 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda + build_number: 8 + sha256: 7ad76fa396e4bde336872350124c0819032a9e8a0a40590744ff9527b54351c1 + md5: 05e00f3b21e88bb3d658ac700b2ce58c + constrains: + - python 3.10.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6999 + timestamp: 1752805924192 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + build_number: 8 + sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 + md5: 8fcb6b0e2161850556231336dae58358 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7003 + timestamp: 1752805919375 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + build_number: 8 + sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 + md5: c3efd25ac4d74b1584d2f7a57195ddf1 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6958 + timestamp: 1752805918820 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7002 + timestamp: 1752805902938 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 + md5: bc8e3267d44011051f2eb14d22fb0960 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 189015 + timestamp: 1742920947249 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + sha256: d107ad62ed5c62764fba9400f2c423d89adf917d687c7f2e56c3bfed605fb5b3 + md5: 014417753f948da1f70d132b2de573be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 213136 + timestamp: 1737454846598 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py311ha3cf9ac_2.conda + sha256: 4855c51eedcde05f3d9666a0766050c7cbdff29b150d63c1adc4071637ba61d7 + md5: f49b0da3b1e172263f4f1e2f261a490d + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 197287 + timestamp: 1737454852180 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312h3520af0_2.conda + sha256: de96d83b805dba03422d39e855fb33cbeedc8827235d6f76407a3b42dc085910 + md5: 4a2d83ac55752681d54f781534ddd209 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 193577 + timestamp: 1737454858212 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + sha256: 2af6006c9f692742181f4aa2e0656eb112981ccb0b420b899d3dd42c881bd72f + md5: 250b2ee8777221153fd2de9c279a7efa + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 196951 + timestamp: 1737454935552 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda + sha256: ad225ad24bfd60f7719709791345042c3cb32da1692e62bd463b084cf140e00d + md5: 68149ed4d4e9e1c42d2ba1f27f08ca96 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192148 + timestamp: 1737454886351 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + sha256: 6095e1d58c666f6a06c55338df09485eac34c76e43d92121d5786794e195aa4d + md5: e474ba674d780f0fa3b979ae9e81ba91 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 187430 + timestamp: 1737454904007 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.1-py311hc251a9f_0.conda + sha256: 64875cabb7389f4cc02ed928f8cc96695d3bdc7aab51c29e2f8f3886b99b2774 + md5: 83c2c7413f58bf7caf7b969d867f8ae8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 393530 + timestamp: 1754238172151 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-27.0.1-py311h2ea2559_0.conda + sha256: c6bc7ff07624e0f771ff27f2238b7a641dc7fc54a9c0b6a1d2fbfb187de8b3e5 + md5: 30580692f8b4af90818f923cc074e712 + depends: + - __osx >=10.13 + - libcxx >=19 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 369903 + timestamp: 1754238326972 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.0.1-py311h2637eca_0.conda + sha256: e493068ad3a2f132e8f57395adc87e9ef50da807e96d693332a51c2edd8a13cb + md5: 76956e134cbe53b352fa684f54641cad + depends: + - __osx >=11.0 + - libcxx >=19 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 365819 + timestamp: 1754238452204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + size: 552937 + timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda + sha256: 79d804fa6af9c750e8b09482559814ae18cd8df549ecb80a4873537a5a31e06e + md5: dd1ea9ff27c93db7c01a7b7656bd4ad4 + depends: + - __osx >=10.13 + - libcxx >=16 + license: LicenseRef-Qhull + purls: [] + size: 528122 + timestamp: 1720814002588 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 + md5: 6483b1f59526e05d7d894e466b5b6924 + depends: + - __osx >=11.0 + - libcxx >=16 + license: LicenseRef-Qhull + purls: [] + size: 516376 + timestamp: 1720814307311 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.1-h6ac528c_2.conda + sha256: 8795462e675b7235ad3e01ff3367722a37915c7084d0fb897b328b7e28a358eb + md5: 34ccdb55340a25761efbac1ff1504091 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - double-conversion >=3.3.1,<3.4.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - harfbuzz >=11.0.1 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp20.1 >=20.1.8,<20.2.0a0 + - libclang13 >=20.1.8 + - libcups >=2.3.3,<2.4.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.84.2,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libllvm20 >=20.1.8,<20.2.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libpq >=17.5,<18.0a0 + - libsqlite >=3.50.3,<4.0a0 + - libstdcxx >=14 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libxkbcommon >=1.10.0,<2.0a0 + - libxml2 >=2.13.8,<2.14.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + - pcre2 >=10.45,<10.46.0a0 + - wayland >=1.24.0,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xcb-util-cursor >=0.1.5,<0.2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxcomposite >=0.4.6,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 6.9.1 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 53080009 + timestamp: 1753420196625 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda + sha256: f0f520f57e6b58313e8c41abc7dfa48742a05f1681f05654558127b667c769a8 + md5: 8f70e36268dea8eb666ef14c29bd3cda + depends: + - libre2-11 2023.09.01 h5a48ba9_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26617 + timestamp: 1708946796423 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2023.09.01-hb168e87_2.conda + sha256: 5739ed2cfa62ed7f828eb4b9e6e69ff1df56cb9a9aacdc296451a3cb647034eb + md5: 266f8ca8528fc7e0fa31066c309ad864 + depends: + - libre2-11 2023.09.01 h81f5012_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26814 + timestamp: 1708947195067 +- conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda + sha256: 960729dd943daff21bf2b1f5a9380c17420c5307d4d250766525e266bd0acca7 + md5: 5fd6022c97d78c252f1cc8d7433e97d0 + depends: + - libre2-11 2024.07.02 h0e468a2_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26920 + timestamp: 1735541096841 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2023.09.01-h4cba328_2.conda + sha256: 0e0d44414381c39a7e6f3da442cb41c637df0dcb383a07425f19c19ccffa0118 + md5: 0342882197116478a42fa4ea35af79c1 + depends: + - libre2-11 2023.09.01 h7b2c953_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26770 + timestamp: 1708947220914 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 256712 + timestamp: 1740379577668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + md5: c58dd5d147492671866464405364c0f1 + depends: + - cmarkgfm >=0.8.0 + - docutils >=0.21.2 + - nh3 >=0.2.14 + - pygments >=2.5.1 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/readme-renderer?source=hash-mapping + size: 17481 + timestamp: 1734339765256 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + sha256: e20909f474a6cece176dfc0dc1addac265deb5fa92ea90e975fbca48085b20c3 + md5: 9140f1c09dd5489549c6a33931b943c7 + depends: + - attrs >=22.2.0 + - python >=3.9 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + size: 51668 + timestamp: 1737836872415 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 + md5: f6082eae112814f1447b56a5e1f6ed05 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 59407 + timestamp: 1749498221996 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + md5: 66de8645e324fda0ea6ef28c2f99a2ab + depends: + - python >=3.9 + - requests >=2.0.1,<3.0.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests-toolbelt?source=hash-mapping + size: 44285 + timestamp: 1733734886897 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 + md5: 36de09a8d3e5d5e6f4ee63af49e59706 + depends: + - python >=3.9 + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3339-validator?source=hash-mapping + size: 10209 + timestamp: 1733600040800 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + md5: 43e14f832d7551e5a8910672bfc3d8c6 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/rfc3986?source=hash-mapping + size: 38028 + timestamp: 1733921806657 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 + md5: 912a71cc01012ee38e6b90ddd561e36f + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3986-validator?source=hash-mapping + size: 7818 + timestamp: 1598024297745 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92 + md5: 7234f99325263a5af6d4cd195035e8f2 + depends: + - python >=3.9 + - lark >=1.2.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3987-syntax?source=hash-mapping + size: 22913 + timestamp: 1752876729969 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.1.0-pyhe01879c_0.conda + sha256: 3bda3cd6aa2ca8f266aeb8db1ec63683b4a7252d7832e8ec95788fb176d0e434 + md5: c41e49bd1f1479bed6c6300038c5466e + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 201098 + timestamp: 1753436991345 +- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda + sha256: 0116a9ca9bf3487e18979b58b2f280116dba55cb53475af7a6d835f7aa133db8 + md5: 5f0f24f8032c2c1bb33f59b75974f5fc + depends: + - python >=3.9 + license: 0BSD OR CC0-1.0 + purls: + - pkg:pypi/roman-numerals-py?source=hash-mapping + size: 13348 + timestamp: 1740240332327 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py311h902ca64_0.conda + sha256: c32892bc6ec30f932424c6a02f2b6de1062581a1cc942127792ec7980ddc31aa + md5: 397e7e07356db9425069fa86e8920404 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=compressed-mapping + size: 386391 + timestamp: 1754570119627 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.27.0-py311hd3d88a1_0.conda + sha256: fe6a950458dcded2c4e7a879eba06f5b3b699fe6a5fcc2ee2882785d459f2874 + md5: b133a892de6369b6971ac2a83ae396c8 + depends: + - python + - __osx >=10.13 + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=compressed-mapping + size: 377319 + timestamp: 1754570012589 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.27.0-py311h1c3fc1a_0.conda + sha256: a048d46fcfc3974fcbb8dcf3667fc6c904fa7abc343abd9d1de75c05b96b6735 + md5: 65b920af8c94ae5d14cc76ba2c9e07c4 + depends: + - python + - __osx >=11.0 + - python 3.11.* *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 364274 + timestamp: 1754570021333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.8-py311hae69bc3_0.conda + sha256: a1b59b39866f72d542e2ea11fca30e63d3a9957cde2f48661c1246724537b51c + md5: bc378b1e199bfcc587d60a62cc40eb6c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 6368265 + timestamp: 1717617707365 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.8-py311h9a97b26_0.conda + sha256: 99d13fbc8006444ddbe9c3a7d211a35465fdc12ae4b86c8d2cca2028d5c1dece + md5: 584fae048b02bfc877916128627c7095 + depends: + - __osx >=10.13 + - libcxx >=16 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=10.12 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 6146957 + timestamp: 1717617809570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.8-py311hd374d79_0.conda + sha256: c547e2e224446cf020d7e7e7ba30239c7b56f7ebd08341a5761703b9325af630 + md5: 9d18539bbfd1f729e436d45a5d1ff5ed + depends: + - __osx >=11.0 + - libcxx >=16 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 5894830 + timestamp: 1717617812872 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.8-py311ha637bb9_0.conda + sha256: 96711e0444fabbd962748d02a7a04b9d9b7ad78acca70bf1d3e2f19ed97b15b1 + md5: 4a78b9d647d91d13ccce27e03122ea0f + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 6271021 + timestamp: 1717619129790 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py310h981052a_1.conda + sha256: b3718226723c94f5a93f417acb29ad82b0520acf945a06ae90e0b7ed076191a7 + md5: 672f0238a945f1c98fe97b147c8a040a + depends: + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9132101 + timestamp: 1715869775101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311he08f58d_1.conda + sha256: b818f7df6ae949012a38b41b6577ac2319569971b1a063c0386447ec2c6c09ed + md5: fd4a80e35c05513590b33c83fc81dcc7 + depends: + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 10331975 + timestamp: 1715869752060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py311h57cc02b_1.conda + sha256: b6489f65911847d1f9807e254e9af0815548454b911df4d0b5019f9ab16fe530 + md5: d1b6d7a73364d9fe20d2863bd2c43e3a + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 10596895 + timestamp: 1726083362968 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py312h7a48858_0.conda + sha256: 7c869c73c95ef09edef839448ae3d153c4e3a208fb110c4260225f342d23e08e + md5: 102727f71df02a51e9e173f2e6f87d57 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 10628698 + timestamp: 1736497249999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py310h228f341_0.conda + sha256: 947723672949e864fe78f863f1473c85fbf6f95080e9a13fee5ed4f505b892f5 + md5: ac228f0fb67550ffd0040b1003415d97 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.21,<3 + - numpy >=1.22.0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8391987 + timestamp: 1752826124531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py311hc3e1efb_0.conda + sha256: 24a54f66daac89a0072562dd913757c244dba667011615f4bfd71dd0005a6842 + md5: 84389133a1970eb439621ac6611d9d58 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9834955 + timestamp: 1752826119952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py312h4f0b9e3_0.conda + sha256: c87194d7a0659493aa8ca9007bba2a4a8965e60037c396cd2e08fc1b5c91548b + md5: 7f96df096abbe0064f0ec5060c1d2af4 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9685421 + timestamp: 1752826143141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.7.1-py313h06d4379_0.conda + sha256: b2b47437b25767be23857cf444ba8795aa3fc183904b49c88ced7698d41ea1df + md5: 19b0fff5b5cb13e7d238cb7fae1b4e0b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9660473 + timestamp: 1752826158952 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py310h9d65eca_1.conda + sha256: 2c371b40a43c66d80011421ce59ad676ad1f0146201d5a51e5a55c964f32df54 + md5: 768e956ba883484746968b17f551f520 + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=16 + - llvm-openmp >=16.0.6 + - llvm-openmp >=18.1.5 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8076634 + timestamp: 1715870044393 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py311h3c3ac6d_1.conda + sha256: 2cf5eba017eb53d09dcad6116615cb2209321d134e46f4501c4bd435525db156 + md5: eb6f2d36c84d6702eab64ffbe166f3fa + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=16 + - llvm-openmp >=16.0.6 + - llvm-openmp >=18.1.5 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9363425 + timestamp: 1715869957926 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.5.2-py311ha1d5734_1.conda + sha256: 2bec7d70f518550b2d573f2cbe083db95dd65e5b4f0fb417a0c94300bfd146e1 + md5: 2797c34b77d64a38c092dd9b21ed908b + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=17 + - llvm-openmp >=17.0.6 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9712928 + timestamp: 1726083255913 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py312he1a5313_0.conda + sha256: dcdb37893344a321442ce97fd37a5d45b2c6d93a6638fb6e876c638284088d2c + md5: c177b3800953875a115ecba027a66d63 + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9721328 + timestamp: 1736497397042 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py310hed48b8a_0.conda + sha256: 6bd8ce7da04fc87d535e507eea1b9a9435ad6e17fe3d8dc46af768bb4658ad69 + md5: 34ff9b92704ff0e7e877324193a3331d + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.21,<3 + - numpy >=1.22.0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 7872815 + timestamp: 1752826132279 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py311he6af739_0.conda + sha256: 2aea4520417058cc23cb421fb7a478b0dc2c6d88b6619943fa6df83882e3ed53 + md5: 9713f867666c580c58363abe2b17086d + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9248781 + timestamp: 1752826227140 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py312hf34d0c2_0.conda + sha256: 64a309bfe938f32169f1ff5160e3a1f0387020a072cc4d1d998ed1342c65325c + md5: 702f651c3e601a88700bcce18f31b0c9 + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9083864 + timestamp: 1752826115451 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.7.1-py313hbe0a5c7_0.conda + sha256: 8b18c638a78cecae6045c15d38eeeffc63a8723dd9def4dd3f41ad7506287153 + md5: ec0123126328fa823d853b2301aa0d49 + depends: + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9072495 + timestamp: 1752826384806 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py310h64e73be_1.conda + sha256: ff8d8adeb7ac8416d1f6bf0b057bbe2155a3c58c2f1bf8a8b8e1fcd4f2b0c04d + md5: 110b10ba3774411ffd1ed9fef8dac184 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=16 + - llvm-openmp >=16.0.6 + - llvm-openmp >=18.1.5 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8141101 + timestamp: 1715870026027 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py311hbfb48bc_1.conda + sha256: e21e11fee63202ba6dc59df71af1db16351468b0a8c742a7080b1cb2f852c59a + md5: eb4b192b29d412853c75a15102dfd832 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=16 + - llvm-openmp >=16.0.6 + - llvm-openmp >=18.1.5 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9449312 + timestamp: 1715870005992 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.5.2-py311h9e23f0f_1.conda + sha256: cc9f8c3f12ef7cce384285c11e76e981349771542edf14ba069b8b2f22744b5e + md5: ad77674e1f893b3ffe27ffa532e2724f + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=17 + - llvm-openmp >=17.0.6 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9729967 + timestamp: 1726083178729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py312h39203ce_0.conda + sha256: 63e7751b861b5d8a6bfe32a58e67b446b8235f8768e860db955b394e4c7a9edc + md5: 3d38707ed1991a65dd165c5460d7f3a2 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - scipy + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9769459 + timestamp: 1736497509734 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py310hce580d2_0.conda + sha256: 0d342c9bbfc4e5318113e7791dd3d78b68045f7bd2a8401287d95b4fdffe2eef + md5: 131e7e9d4e27846ed041648d9a771845 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.21,<3 + - numpy >=1.22.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 7792569 + timestamp: 1752826153368 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py311hb5ee8ec_0.conda + sha256: 0cc40a7a7f8e4e89f1fec2d0ce8dc04eea4ba682277890468957a99afc5fac8f + md5: d242e68776e653f9150d733132beaf43 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9141305 + timestamp: 1752826408697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py312h54d6233_0.conda + sha256: c1a079efc29fdb840f9a2b53ee44940aafbe81b4f1845c1281aa9da77b2c4ce5 + md5: d384e66a54996cc54614fdd111489d6a + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8931629 + timestamp: 1752826246695 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.7.1-py313h595da1d_0.conda + sha256: e836fda86004060229eb375c88c0f5399751cee5fe0590ae98f9a2baa5060a57 + md5: c1524113ded9af7f6587fee1f8a34209 + depends: + - __osx >=11.0 + - joblib >=1.2.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9056781 + timestamp: 1752826576207 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py310hf2a6c47_1.conda + sha256: 24e9f3db0a2f477cbe20d1c98b48edd0d768af21dd7e6c3553e286f01deabfe5 + md5: 9142e7e901c0f6e76541b523d480043e + depends: + - joblib >=1.2.0 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=2.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 7798267 + timestamp: 1715870160624 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311hdcb8d17_1.conda + sha256: e38cac2faa50b04ae06da6a7c9690ad8f893f2b3318b052ac15710221f32e231 + md5: 4179839852432a4e95b5ff86dd5faa9c + depends: + - joblib >=1.2.0 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=2.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9070251 + timestamp: 1715870319512 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.5.2-py311hdcb8d17_1.conda + sha256: 3f23a54f327af0227115b1ac3a8d6b32926e87bfe0097e3c906bd205bb9340b7 + md5: c3e550b20baa56f911022f6304c8f547 + depends: + - joblib >=1.2.0 + - numpy >=1.19,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy + - threadpoolctl >=3.1.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9491082 + timestamp: 1726083711620 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py312h816cc57_0.conda + sha256: a35e90775f8eb213fe300747a5d9f242830fdde768871e6d194e27bbc0af0fff + md5: 7d3fcb33b1b3ce559d8e83699504d9ee + depends: + - joblib >=1.2.0 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy + - threadpoolctl >=3.1.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9503776 + timestamp: 1736497647297 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py311h8a15ebc_0.conda + sha256: aff91a38cbb4a061cbf2bf04d53e5a8071bb5a0f71fe5434c59250486e2a7eb1 + md5: 3c95c59d7e1aa8c5ed723efe1fc0f46b + depends: + - joblib >=1.2.0 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8990170 + timestamp: 1752826365145 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.1-py313he28f1d7_0.conda + sha256: 5fe48e7490e29a2bbc9cc1a855681394e76fec58ce3219f701b97acade984f8c + md5: 2af70ba46f832324988ad71571585a39 + depends: + - joblib >=1.2.0 + - numpy >=1.22.0 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - scipy >=1.8.0 + - threadpoolctl >=3.1.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8755230 + timestamp: 1753180633780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py310hb13e2d6_0.conda + sha256: d465ffa50c22c0ce7472831abbb01f10411bb62d2ee3b493ff3fe3dc214765cb + md5: f0063b2885bfae11324a00a693f88781 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15254417 + timestamp: 1700813355821 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda + sha256: 4cb98641f870666d365594013701d5691205a0fe81ac3ba7778a23b1cc2caa8e + md5: 8c29cd33b64b2eb78597fa28b5595c8d + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 16417101 + timestamp: 1739791865060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda + sha256: 6d0902775e3ff96dd1d36ac627e03fe6c0b3d2159bb71e115dd16a1f31693b25 + md5: 5ec0a1732a05376241e1e4c6d50e0e91 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17193126 + timestamp: 1739791897768 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda + sha256: b9faaa024b77a3678a988c5a490f02c4029c0d5903998b585100e05bc7d4ff36 + md5: 00b999c5f9d01fb633db819d79186bd4 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17064784 + timestamp: 1739791925628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda + sha256: 9f983efb5ea5ba254c5c98187f0293d1d4338aa49f1721ca5635ea26fada95e0 + md5: 03f860a54dadae93531ca573c3ed901a + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 16935076 + timestamp: 1754970591111 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda + sha256: 988c9fb07058639c3ff6d8e1171a11dbd64bcc14d5b2dfe3039b610f6667b316 + md5: b01bd2fd775d142ead214687b793d20d + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17190354 + timestamp: 1754970575489 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py313h3a520b0_0.conda + sha256: 61edbefb9e23fd61d4348a697d45b737d89796d0dd20175167ddec4bfeb17b25 + md5: 0fc019eb24bf48840e18de7263af5773 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17223792 + timestamp: 1754970565760 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.4-py310h3f1db6d_0.conda + sha256: e47f31119e786352e696ce7877ff97e6e198a43eafbb257b19747b5ae0eadb41 + md5: e09db12a57141c4f74ae12e0a5d9629a + depends: + - __osx >=10.9 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16.0.6 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15000837 + timestamp: 1700813888140 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py310hef62574_0.conda + sha256: da86efbfa72e4eb3e4748e5471d04fdbe3f9887f367b6302c1dcdb155bbf712b + md5: e79860e43d87b020a0254f0b3f5017c5 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14682985 + timestamp: 1739792429025 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py311h0c91ca8_0.conda + sha256: 796252d7772df42edd29a45ae70eb18843a7e476d42c96c273cd6e677ec148c8 + md5: 58c17d411ed0cd1220ed3e824a3efc82 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15759628 + timestamp: 1739792317052 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py312hd04560d_0.conda + sha256: 4c34ef6a688c3ea99a11a9c32941133800f4e10ff5af0074998abed80392c75a + md5: cea880e674e00193c7fb915eea6c8200 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15547115 + timestamp: 1739791861956 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py311h8688b46_0.conda + sha256: ec0f186e7266c05a85b54876d37cab3af5b4e19ee976252e244f8ffca54180b9 + md5: ab9711f351dd1074e733d39ec8998c63 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15526772 + timestamp: 1754970438744 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py312h594e5de_0.conda + sha256: 9a20672be8210e9d5401435b7f3d81e5c8836842e652eda2ec607d9aadb768cc + md5: 3049c99f851921b483b528daa81e2bdc + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15332499 + timestamp: 1754971101552 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.1-py313hada7951_0.conda + sha256: e2e6560419f6809d272880e82e50b7cf2e11bb64ca8b4aa64fe90b420a138d1d + md5: 0754bd8f813107c8f6adda6530e07b60 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15410632 + timestamp: 1754971272367 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.4-py310h2b794db_0.conda + sha256: bf95a330f5568456378ba51311b859db04e1f0e2b61970d69aad9eea8ee88d8b + md5: 63565e585933d2853fa3c33d2e4c1007 + depends: + - __osx >=10.9 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16.0.6 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 13965072 + timestamp: 1700814632317 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py310h32ab4ed_0.conda + sha256: f6ff2c1ba4775300199e8bc0331d2e2ccb5906f58f3835c5426ddc591c9ad7bf + md5: a389f540c808b22b3c696d7aea791a41 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 13507343 + timestamp: 1739792089317 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py311h0675101_0.conda + sha256: bc3e873e85c55deaaad446c410d9001d12a133c1b48fa2cb0050b4f46f926aa3 + md5: df904770f3fdb6c0265a09cdc22acf54 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14569129 + timestamp: 1739792318601 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py312h99a188d_0.conda + sha256: af61f6e29a0d3d4c66699a35b19ce6849d6e0fa15017d7a9ef6268cc1c4e1264 + md5: b1d324bf5018b451152bbdc4ffd3d378 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14394729 + timestamp: 1739792424558 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py311hffedffa_0.conda + sha256: c9b294b9944fa4c73c593cfa94d7aca66ba95450273bd30a5e7d573c551e9cb7 + md5: f4785acbf810e95938f26f50a0471bbe + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14125735 + timestamp: 1754970582556 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py312h286a95b_0.conda + sha256: 2d9d0173b58010c2ee09280b7e4fa185d191380a4f042698263b4ffa2671818b + md5: 9841d229c34dbca6fd039e76cfca307b + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 13840981 + timestamp: 1754970654942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.1-py313h74efe86_0.conda + sha256: c39467e39d444517edcf5ffd117f1984dc69523da8f519f6c6cbf6c38653a033 + md5: 21ee392d9c8f7329fac0c43fb85c74bf + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14095281 + timestamp: 1754970453860 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.4-py310hf667824_0.conda + sha256: 34db915d0815a9368ea950e9d31a30b01e1ba395953295cdd1224a59a7cb5a3e + md5: b8b12cba10231b68dd802a9b6e262c54 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libopenblas <0.3.26 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 14186301 + timestamp: 1700814640256 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py311h99d06ae_0.conda + sha256: 62ae1a1e02c919513213351474d1c72480fb70388a345fa81f1c95fa822d98bf + md5: c7ec15b5ea6a27bb71af2ea5f7c97cbb + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15487645 + timestamp: 1739793313482 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py312h451d5c4_0.conda + sha256: a154a6b6f4efefc65366437f611fa89c8178059e2ee7350515fe4a4c3da55c1d + md5: 50632c72cc92ae3ebb615cb496bbf946 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15350553 + timestamp: 1739793319263 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py311ha4356f8_0.conda + sha256: 9c95edd96860de08bfd37daf2730f5af2c09e78ab23524e102d70af6475d5d0f + md5: bba89b1898e314cb9ed72fea88b631db + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15253716 + timestamp: 1754971061028 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.1-py313h22ae3c1_0.conda + sha256: 852fe5f600cd3f883ae1ecb5eea1eaf0407256ea69cdd02e32e7b27b60414492 + md5: 001fed7e72552a872a4b26a3e88aac79 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.6 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15237060 + timestamp: 1754971035400 +- conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + noarch: python + sha256: ea29a69b14dd6be5cdeeaa551bf50d78cafeaf0351e271e358f9b820fcab4cb0 + md5: 62afb877ca2c2b4b6f9ecb37320085b6 + depends: + - seaborn-base 0.13.2 pyhd8ed1ab_3 + - statsmodels >=0.12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6876 + timestamp: 1733730113224 +- conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + sha256: f209c9c18187570b85ec06283c72d64b8738f825b1b82178f194f4866877f8aa + md5: fd96da444e81f9e6fcaac38590f3dd42 + depends: + - matplotlib-base >=3.4,!=3.6.1 + - numpy >=1.20,!=1.24.0 + - pandas >=1.2 + - python >=3.9 + - scipy >=1.7 + constrains: + - seaborn =0.13.2=*_3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/seaborn?source=hash-mapping + size: 227843 + timestamp: 1733730112409 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_3.conda + sha256: e7d68675349e80416aa0d4fb8262c2f4a223ef9e6e430704be3f809ea0c34d57 + md5: b7d5a90193f112c78e25befb013dd606 + depends: + - cryptography + - dbus + - jeepney >=0.6 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/secretstorage?source=hash-mapping + size: 32190 + timestamp: 1725915725812 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + sha256: 00926652bbb8924e265caefdb1db100f86a479e8f1066efe395d5552dde54d02 + md5: 938c8de6b9de091997145b3bf25cdbf9 + depends: + - __linux + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 22736 + timestamp: 1733322148326 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + sha256: 5282eb5b462502c38df8cb37cd1542c5bbe26af2453a18a0a0602d084ca39f53 + md5: e67b1b1fa7a79ff9e8e326d0caf55854 + depends: + - __osx + - pyobjc-framework-cocoa + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 23100 + timestamp: 1733322309409 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 748788 + timestamp: 1748804951958 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=compressed-mapping + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + sha256: 8b8acbde6814d1643da509e11afeb6bb30eb1e3004cf04a7c9ae43e9b097f063 + md5: 3d8da0248bdae970b4ade636a104b7f5 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 45805 + timestamp: 1753083455352 +- conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h25c286d_0.conda + sha256: e9ccbdbfaa9abd21636decd524d9845dee5a67af593b1d54525a48f2b03d3d76 + md5: e6544ab8824f58ca155a5b8225f0c780 + depends: + - libcxx >=19 + - __osx >=10.13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 39975 + timestamp: 1753083485577 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hd121638_0.conda + sha256: b3d447d72d2af824006f4ba78ae4188747886d6d95f2f165fe67b95541f02b05 + md5: ba9ca3813f4db8c0d85d3c84404e02ba + depends: + - libcxx >=19 + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 38824 + timestamp: 1753083462800 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 + md5: bf7a226e58dfb8346c70df36065d86c9 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sniffio?source=hash-mapping + size: 15019 + timestamp: 1733244175724 +- conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + sha256: 17007a4cfbc564dc3e7310dcbe4932c6ecb21593d4fec3c68610720f19e73fb2 + md5: 755cf22df8693aa0d1aec1c123fa5863 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/snowballstemmer?source=hash-mapping + size: 73009 + timestamp: 1747749529809 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + sha256: 7518506cce9a736042132f307b3f4abce63bf076f5fb07c1f4e506c0b214295a + md5: fb32097c717486aa34b38a9db57eb49e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/soupsieve?source=hash-mapping + size: 37773 + timestamp: 1746563720271 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + sha256: 995f58c662db0197d681fa345522fd9e7ac5f05330d3dff095ab2f102e260ab0 + md5: f7af826063ed569bb13f7207d6f949b0 + depends: + - alabaster >=0.7.14 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.20,<0.22 + - imagesize >=1.3 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.11 + - requests >=2.30.0 + - roman-numerals-py >=1.0.0 + - snowballstemmer >=2.2 + - sphinxcontrib-applehelp >=1.0.7 + - sphinxcontrib-devhelp >=1.0.6 + - sphinxcontrib-htmlhelp >=2.0.6 + - sphinxcontrib-jsmath >=1.0.1 + - sphinxcontrib-qthelp >=1.0.6 + - sphinxcontrib-serializinghtml >=1.1.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinx?source=hash-mapping + size: 1424416 + timestamp: 1740956642838 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + sha256: 8cd892e49cb4d00501bc4439fb0c73ca44905f01a65b2b7fa05ba0e8f3924f19 + md5: bf22cb9c439572760316ce0748af3713 + depends: + - python >=3.9 + - sphinx >=1.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-copybutton?source=hash-mapping + size: 17893 + timestamp: 1734573117732 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + sha256: eb335aef48e49107b55299cedc197f86d05651f1eeff83ed8acf89df7cdc9765 + md5: 3e6c15d914b03f83fc96344f917e0838 + depends: + - python >=3.9 + - sphinx >=6,<9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-design?source=hash-mapping + size: 911336 + timestamp: 1734614675610 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.19.0-pyhd8ed1ab_0.conda + sha256: 8c4e94769a818ea5d36e96766a78533bb37f7733a52d7d51ce796e0df2165a15 + md5: 3cfa26d23bd7987d84051879f202a855 + depends: + - pillow + - python >=3.9 + - sphinx >=4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sphinx-gallery?source=hash-mapping + size: 389536 + timestamp: 1739451602050 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba + md5: 16e3f039c0aa6446513e94ab18a8784b + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping + size: 29752 + timestamp: 1733754216334 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.5-pyhd8ed1ab_0.conda + sha256: b128f051391c67c5ee77bf5aa2e6e4073adfc22631829491db112fcafe58f196 + md5: 6267ad9b8e6c02ea6280a9d6eabe1026 + depends: + - docutils >=0.8,!=0.18.*,!=0.19.* + - importlib-metadata >=3.6 + - pybtex >=0.25 + - pybtex-docutils >=1.0.0 + - python >=3.9 + - setuptools + - sphinx >=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-bibtex?source=hash-mapping + size: 33137 + timestamp: 1751029066274 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d + md5: 910f28a05c178feba832f842155cbfff + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping + size: 24536 + timestamp: 1733754232002 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 + md5: e9fb3fe8a5b758b4aff187d434f94f03 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping + size: 32895 + timestamp: 1733754385092 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 + md5: fa839b5ff59e192f411ccc7dae6588bb + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping + size: 10462 + timestamp: 1733753857224 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca + md5: 00534ebcc0375929b45c3039b5ba7636 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping + size: 26959 + timestamp: 1733753505008 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + sha256: 64d89ecc0264347486971a94487cb8d7c65bfc0176750cf7502b8a272f4ab557 + md5: 3bc61f7161d28137797e038263c04c54 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping + size: 28669 + timestamp: 1733750596111 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc + depends: + - asttokens + - executing + - pure_eval + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/stack-data?source=hash-mapping + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.5-py311hb0beb2c_0.conda + sha256: 766186eb4ff37a69479ec0695df9d7b775a8fd79b8ded727a1963cc1bedcfc80 + md5: 763f2b77d523c8662fa8a4fcabc4ef36 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 12015823 + timestamp: 1751917868394 +- conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.5-py312h8b63200_0.conda + sha256: 71af2d8efae963c83f9cd49f4648087d0acd41a58972a5bd7b097273b895ed54 + md5: d3588408248f78db333a5b019a4ca696 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 12062670 + timestamp: 1751917720541 +- conda: https://conda.anaconda.org/conda-forge/osx-64/statsmodels-0.14.5-py311ha2d3830_0.conda + sha256: 6dcc2a61a73de340317241d70f9f47499c69a62e508b8b251af738bff631f1de + md5: 2d429e456dd67796ed0e3114fb559f82 + depends: + - __osx >=10.13 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 11852156 + timestamp: 1751918004113 +- conda: https://conda.anaconda.org/conda-forge/osx-64/statsmodels-0.14.5-py312h34a05c3_0.conda + sha256: 5620ebca940ce29415489f3006c710a925d7f730879910b3071d2277cb2375e8 + md5: d1782681f1d944cc1e8712591415304a + depends: + - __osx >=10.13 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 11749728 + timestamp: 1751918146123 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.5-py311h9dc9093_0.conda + sha256: a12928c2ed682227bbae9962519fb3316a9162db3c73a3afbb97138fdc3a7173 + md5: 0bb11b13609c9212051ea0c20a2acf2e + depends: + - __osx >=11.0 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 11795676 + timestamp: 1751917879126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.5-py312hcde60ef_0.conda + sha256: 911a6fcfa2c04de64d03378e705a0678bf511f25aa0f5f9c8e4570ccb071b241 + md5: 79208bf3a11cedbe7dd53a6798cb88d2 + depends: + - __osx >=11.0 + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 11703160 + timestamp: 1751918258652 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_2.conda + sha256: f09f3ad838158ce03a07e92acb370d6f547f625319f8defe3bde15dc446a3050 + md5: 6f339f632ba0618d8f42acf80218757b + depends: + - libhwloc >=2.12.1,<2.12.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 149955 + timestamp: 1754499612925 +- conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.16.2-pyhd8ed1ab_0.conda + sha256: 471ed4bf7811b7a6ede1fd9a6c281cd07139b0b5694b3a18fe21a8d4bee032c7 + md5: 78633141b91d2910b08fac6458e0ddb1 + depends: + - absl-py >=0.4 + - grpcio >=1.48.2 + - markdown >=2.6.8 + - numpy >=1.12.0 + - protobuf >=3.19.6,!=4.24.0 + - python >=3.8 + - setuptools >=41.0.0 + - six >=1.9 + - tensorboard-data-server >=0.7.0,<0.8.0 + - werkzeug >=1.0.1 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard?source=hash-mapping + size: 5174472 + timestamp: 1708285949271 +- conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.18.0-pyhd8ed1ab_1.conda + sha256: 769d8c95b691586ee197845c52a3c7e6a9be7b3008650a73794bc7727b6831ac + md5: 90a735b377427589728e588b5241a253 + depends: + - absl-py >=0.4 + - grpcio >=1.48.2 + - markdown >=2.6.8 + - numpy >=1.12.0 + - packaging + - protobuf >=3.19.6,!=4.24.0 + - python >=3.9 + - setuptools >=41.0.0 + - six >1.9 + - tensorboard-data-server >=0.7.0,<0.8.0 + - werkzeug >=1.0.1 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard?source=hash-mapping + size: 5188442 + timestamp: 1733820813359 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py310h6c63255_2.conda + sha256: 7525504f377ffbc9104c338722902fe67f5999efff26f47ab17ec3aa4547146f + md5: fd269768504e55006d52f0a5face4dcf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3571250 + timestamp: 1728640103310 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py311hafd3f86_2.conda + sha256: b2abc9b9b57c7ea212099fcc30d0e3523fc79a731ec11f69ce5402879c37cb3e + md5: 599c214c5dd150c9dd716db4cdbedf2e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3571735 + timestamp: 1728640114903 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312hda17c39_2.conda + sha256: 9dc3ebf51a96a1c2b82b2d8907030453b797141a8cb0bdaa66c67c7b622d28c3 + md5: 8f4e72393be23b3eaa7bbc3cd4a71c40 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3571270 + timestamp: 1728640174186 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py310h38cfc11_2.conda + sha256: 7fd3a2724d783b171bed301f0db223db4cd5821c9ccf7f92b004b804640647d5 + md5: 6c48c82d96f57b1ac93d3b1532ce6eab + depends: + - __osx >=10.13 + - openssl >=3.3.2,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3291067 + timestamp: 1728640305185 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py311h968b48f_2.conda + sha256: 4eb64cd1154c397484244810c76aa2ddba323f6e1b6a5d761607db69be045d61 + md5: 47e79d74a783a2923f8c2209b710b10d + depends: + - __osx >=10.13 + - openssl >=3.3.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3295888 + timestamp: 1728640368055 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py312h83535b2_2.conda + sha256: 3e18ef4a6e4083796f18625c816655e6db556438a75cd483615793f91e3d522f + md5: 68529fd96db202f50dd884267513c56d + depends: + - __osx >=10.13 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3294991 + timestamp: 1728640443683 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py310hddb97a1_2.conda + sha256: 4751d2d86e6af546dd47cae9d6af5d03731a65ff68dd83e08d9eefe7d3a833ce + md5: 966cbf9ee94af0ef6c9f40ced5a31a4b + depends: + - __osx >=11.0 + - openssl >=3.3.2,<4.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3184983 + timestamp: 1728640387582 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py311h544b224_2.conda + sha256: 71a570633106625077e7e555e898f7d8c2b0f97c6214d5bb141f72278dd20176 + md5: 1d963afdc56e67ba4764a3a164e2c5ee + depends: + - __osx >=11.0 + - openssl >=3.3.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3183895 + timestamp: 1728640514435 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h5fad481_2.conda + sha256: d35dc8ebe9175553a6ab13a454599b6bf5fde88a21e74aeeb69647dac1402fe4 + md5: 87d96f4ea7da623d06fe7e870df4f861 + depends: + - __osx >=11.0 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorboard-data-server?source=hash-mapping + size: 3183519 + timestamp: 1728640252231 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.16.1-cpu_py310h49b650b_0.conda + sha256: e51f41cf58f445687520283042ce782d1d4cc6561048efce93d84909548330d9 + md5: 0642b314cfbc3e2be4dbd5c3097aee2d + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310h224022f_0 + - tensorflow-estimator 2.16.1 cpu_py310hc6dcfef_0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 42219 + timestamp: 1716523409933 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py311h6ac8430_1.conda + sha256: 5b96b98b5bc2f1e3fbecd5b775160c105795fc2b19a68b826cc8092466d284f0 + md5: da8d1069fd349779d8be729fc574da7e + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h726d943_1 + - tensorflow-estimator 2.18.0 cpu_py311h6310aac_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46033 + timestamp: 1754344484819 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.18.0-cpu_py312h69ecde4_1.conda + sha256: 5f4b226d2b40282348a5d6fbeee42ceb1da60a2a2f548c491a8dbfd76a5605e4 + md5: 6ce20c017d613798910fb0fb8fcf16a3 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h11d59fd_1 + - tensorflow-estimator 2.18.0 cpu_py312h651dbe2_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46034 + timestamp: 1754344503040 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.16.1-cpu_py310hf35338a_0.conda + sha256: d798767cc337274c66df24d9a1de910b6e431f26c68337d45f11524663de3226 + md5: d8b2559558715946c652e53b4add39a0 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310h3690a3c_0 + - tensorflow-estimator 2.16.1 cpu_py310h0134bc7_0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 42562 + timestamp: 1716411024700 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py311h69da8e3_1.conda + sha256: 0b584f16104f5e6733735ff92adf58aa9438ab2a1bd1f669706f4491a7166d34 + md5: 1171ffdf103da305386db017f3a4e2c4 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h8bba074_1 + - tensorflow-estimator 2.18.0 cpu_py311hc2375f7_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46257 + timestamp: 1754519950130 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.18.0-cpu_py312hf9ba072_1.conda + sha256: bfff3702f30296d9f9c1465635749c55ee9f498ffaf1a545072765dd64f564d8 + md5: 7fddb414aa2046d50ef516faaa00ca7f + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h7973d44_1 + - tensorflow-estimator 2.18.0 cpu_py312hd6a94b3_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46226 + timestamp: 1754519930463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.16.1-cpu_py310h5a6a72a_0.conda + sha256: eec803cb4c61a7747bb7b768494e35d354dbc00c0a39821ae3d3f09c4689e557 + md5: 465e37e7d9aec99b411df184a1a8b464 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310hf600a1e_0 + - tensorflow-estimator 2.16.1 cpu_py310h85e80fb_0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 42718 + timestamp: 1716417160662 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py311h9d3d1e9_1.conda + sha256: 30fcf449fd7ed74e6f2b412d949a8062f953e2a0fff418b5586d2501db2125ff + md5: 78f3619b558ea007aef0da81dd7369c3 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h5147c6a_1 + - tensorflow-estimator 2.18.0 cpu_py311h61c9c21_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46171 + timestamp: 1754499427251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.18.0-cpu_py312hb6b62e0_1.conda + sha256: 816595f0080d58e0617bda5fee4bb3bd60be258417e1bc9a4cf70973c308aba0 + md5: 94339beae4bae4682242df1c448d1306 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h81ab8d0_1 + - tensorflow-estimator 2.18.0 cpu_py312h5e86b3d_1 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: [] + size: 46145 + timestamp: 1754499440394 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.16.1-cpu_py310h224022f_0.conda + sha256: fca1f4fb4e82d34e3974d1f6f5489c521c2b60f36307480ed140002f2d0e3b62 + md5: 43e6673f4fcabef68fd60434a49b6b70 + depends: + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.3.25,<24.3.26.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.62.* + - h5py >=3.10 + - icu >=73.2,<74.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcurl >=8.8.0,<9.0a0 + - libgcc-ng >=12 + - libgrpc >=1.62.2,<1.63.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libsqlite >=3.45.3,<4.0a0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - ml_dtypes >=0.3.1,<0.4 + - numpy >=1.22,<2.0a0 + - numpy >=1.22.4,<2.0a0 + - openssl >=3.3.0,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=3.20.3,<5,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.10,<3.11.0a0 + - python-flatbuffers >=23.5.26 + - python_abi 3.10.* *_cp310 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.0,<1.3.0a0 + - tensorboard >=2.16,<2.17 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 154505441 + timestamp: 1716522833206 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py311h726d943_1.conda + sha256: 55fdda8b4915454d506cf8eb8ea690fb72a477d8104576664b7cd709bb08a52f + md5: f912a49674e45a10555fd728e7fa11e8 + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libtensorflow_cc 2.18.0 cpu_h739b781_1 + - libtensorflow_framework 2.18.0 cpu_h417b707_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.1,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.11,<3.12.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.11.* *_cp311 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 62002056 + timestamp: 1754343278613 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.18.0-cpu_py312h11d59fd_1.conda + sha256: 14d97840183c2601f43d0ea2ad711b8c615eab1222cb4b582205f11b4135db0d + md5: ddb06c8bf7066513613e05868e64bcb0 + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libtensorflow_cc 2.18.0 cpu_h739b781_1 + - libtensorflow_framework 2.18.0 cpu_h417b707_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.1,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.12,<3.13.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.12.* *_cp312 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 61295262 + timestamp: 1754343766460 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.16.1-cpu_py310h3690a3c_0.conda + sha256: b8bd5c04bfc3db2039f389ecb196e6b412b20f607770b2b16bd23d19f233bba1 + md5: 5da358ffaf12df22d55aa6b6830c148b + depends: + - __osx >=10.13 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.3.25,<24.3.26.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.62.* + - h5py >=3.10 + - icu >=73.2,<74.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcurl >=8.8.0,<9.0a0 + - libcxx >=16 + - libgrpc >=1.62.2,<1.63.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libsqlite >=3.45.3,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ml_dtypes >=0.3.1,<0.4 + - numpy >=1.22,<2.0a0 + - numpy >=1.22.4,<2.0a0 + - openssl >=3.3.0,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=3.20.3,<5,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.10,<3.11.0a0 + - python-flatbuffers >=23.5.26 + - python_abi 3.10.* *_cp310 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.0,<1.3.0a0 + - tensorboard >=2.16,<2.17 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 167807146 + timestamp: 1716410307202 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py311h8bba074_1.conda + sha256: 5955e6710cf73b498ae599ae81350fcba14be6de76b6c426d559bb5cfeb689dc + md5: 56c982bbc0c7627f3b027122b3947244 + depends: + - __osx >=10.13 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_cc 2.18.0 cpu_hce6ddfb_1 + - libtensorflow_framework 2.18.0 cpu_h38b2b02_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.2,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.11,<3.12.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.11.* *_cp311 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 79179655 + timestamp: 1754518297908 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.18.0-cpu_py312h7973d44_1.conda + sha256: 086579095ca677b836e71a2bdb3b43fe3fbc6ed891930465169fc1261c276137 + md5: 024797cca216238d64c99b3f9e06adff + depends: + - __osx >=10.13 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_cc 2.18.0 cpu_hce6ddfb_1 + - libtensorflow_framework 2.18.0 cpu_h38b2b02_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.2,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.12,<3.13.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.12.* *_cp312 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 78965333 + timestamp: 1754517681229 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.16.1-cpu_py310hf600a1e_0.conda + sha256: 03dabfedcb35d8c2ba7aa6d0e1d711200280d41d5d1be40b96977ae793f30d63 + md5: a1db4f5fab7f4d0e9652f7cc8035854b + depends: + - __osx >=11.0 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.3.25,<24.3.26.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.62.* + - h5py >=3.10 + - icu >=73.2,<74.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240116.2,<20240117.0a0 + - libcurl >=8.8.0,<9.0a0 + - libcxx >=16 + - libgrpc >=1.62.2,<1.63.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libprotobuf >=4.25.3,<4.25.4.0a0 + - libsqlite >=3.45.3,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ml_dtypes >=0.3.1,<0.4 + - numpy >=1.22,<2.0a0 + - numpy >=1.22.4,<2.0a0 + - openssl >=3.3.0,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=3.20.3,<5,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.10,<3.11.0a0 + - python-flatbuffers >=23.5.26 + - python_abi 3.10.* *_cp310 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.0,<1.3.0a0 + - tensorboard >=2.16,<2.17 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 148970074 + timestamp: 1716416801713 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py311h5147c6a_1.conda + sha256: 1c1d1b49a26d95c077e055d8267fdcde3940c7c339febcb9a1bbf525226da270 + md5: fa8776e4a4282f29b6459c2ed6cc5167 + depends: + - __osx >=11.0 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_cc 2.18.0 cpu_hf321e49_1 + - libtensorflow_framework 2.18.0 cpu_h2398287_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.2,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.11,<3.12.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.11.* *_cp311 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 73114560 + timestamp: 1754498205860 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.18.0-cpu_py312h81ab8d0_1.conda + sha256: a0e4bf6530a5e8f9efd2e8db5708a6664372aac866ebdd5987f5318b27fc8efa + md5: 0f4a1295b15d2797f8beaee0f22af723 + depends: + - __osx >=11.0 + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - flatbuffers >=24.12.23,<24.12.24.0a0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - giflib >=5.2.2,<5.3.0a0 + - google-pasta >=0.1.1 + - grpcio 1.67.* + - h5py >=3.11 + - icu >=75.1,<76.0a0 + - keras >=3.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libtensorflow_cc 2.18.0 cpu_hf321e49_1 + - libtensorflow_framework 2.18.0 cpu_h2398287_1 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.4.0,<0.5 + - numpy >=1.23,<3 + - openssl >=3.5.2,<4.0a0 + - opt_einsum >=2.3.2 + - packaging + - protobuf >=5.26,<6 + - python >=3.12,<3.13.0a0 + - python-flatbuffers >=24.3.25 + - python_abi 3.12.* *_cp312 + - requests >=2.21.0,<3 + - six >=1.12 + - snappy >=1.2.2,<1.3.0a0 + - tensorboard >=2.18,<2.19 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + track_features: + - tensorflow-cpu + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 73631276 + timestamp: 1754498401137 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.16.1-cpu_py310hc6dcfef_0.conda + sha256: b5fc38e8836b400f16d00582c9ff768b4228aeaeacbbeede3757b37c843119d6 + md5: 2885387bbefa00f77062b7ddb75e1f5d + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310h224022f_0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 552895 + timestamp: 1716523398292 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py311h6310aac_1.conda + sha256: 533b4262f0fb8ebe9fe54cdd6f044e70dfb9742047f7dd71cf985a1413dfa212 + md5: d323d646f7c804be96a528f790c8101a + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.1,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h726d943_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 724529 + timestamp: 1754344255821 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.18.0-cpu_py312h651dbe2_1.conda + sha256: e01422497cae77eb1b2079d2d081b67df6e00e96ab674d4102785da03bbc1e9b + md5: 7de9e86d584ac5ad22777eafdaa29045 + depends: + - __glibc >=2.17,<3.0.a0 + - _x86_64-microarch-level >=1 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.1,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h11d59fd_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 699214 + timestamp: 1754344401313 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.16.1-cpu_py310h0134bc7_0.conda + sha256: 8fec0468662dd587963868f531712f0e4c94b39643e834e6c22dc8df24ee78a4 + md5: d35c296411ec2bc8c97247db8185dced + depends: + - __osx >=10.13 + - libcxx >=16 + - openssl >=3.3.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310h3690a3c_0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 553428 + timestamp: 1716411007761 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py311hc2375f7_1.conda + sha256: e01005cf9f25c98b03c1fc3122583e5f1ef3e405721dc27ee2f53ffc4e206223 + md5: cdd151c69b37fcf63f54688ce4c6d9f1 + depends: + - __osx >=10.13 + - libcxx >=18 + - openssl >=3.5.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h8bba074_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 723569 + timestamp: 1754519634255 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.18.0-cpu_py312hd6a94b3_1.conda + sha256: 94bfd5b0a9eb04d92d1be973a18d0215dd435d3dc4bca0c5d3ed427e3df830f4 + md5: 46f044faaa6108df1e892f2662911a1e + depends: + - __osx >=10.13 + - libcxx >=18 + - openssl >=3.5.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h7973d44_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 700860 + timestamp: 1754519057340 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.16.1-cpu_py310h85e80fb_0.conda + sha256: 15638b4d63bb2a761cf5f8e2f905be91b3186f5bf40ddbeb1f3afe49da2ef87e + md5: 3a152ec5c177114053878a239868dadf + depends: + - __osx >=11.0 + - libcxx >=16 + - openssl >=3.3.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tensorflow-base 2.16.1 cpu_py310hf600a1e_0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 553671 + timestamp: 1716417145716 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py311h61c9c21_1.conda + sha256: 1422189be7f85c4ab37fbdeb9d7e2da0d1b00e4c768a248008f444c3aac3adb4 + md5: c96062e28110ed8f6f074329f8eb5e56 + depends: + - __osx >=11.0 + - libcxx >=18 + - openssl >=3.5.2,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tensorflow-base 2.18.0 cpu_py311h5147c6a_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 722554 + timestamp: 1754499045339 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-estimator-2.18.0-cpu_py312h5e86b3d_1.conda + sha256: 0e91eb003237bb8279ce870fc12e7e21d1c04a39eb6d1cac116ec67fda23884d + md5: 65d1fbbbb27cad0fb2266cb0f612b9fc + depends: + - __osx >=11.0 + - libcxx >=18 + - openssl >=3.5.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tensorflow-base 2.18.0 cpu_py312h81ab8d0_1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tensorflow-estimator?source=hash-mapping + size: 699391 + timestamp: 1754499167407 +- conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + sha256: 04c7b49fbe6a2421ca9126f3f880877e995c457aed8afeb5ad18f03990ca8738 + md5: 951a99e94afe3d38bfdbd04902fe33b7 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/termcolor?source=hash-mapping + size: 13131 + timestamp: 1746039688416 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda + sha256: b300557c0382478cf661ddb520263508e4b3b5871b471410450ef2846e8c352c + md5: efba281bbdae5f6b0a1d53c6d4a97c93 + depends: + - __linux + - ptyprocess + - python >=3.8 + - tornado >=6.1.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/terminado?source=hash-mapping + size: 22452 + timestamp: 1710262728753 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda + sha256: 4daae56fc8da17784578fbdd064f17e3b3076b394730a14119e571707568dc8a + md5: 00b54981b923f5aefcd5e8547de056d5 + depends: + - __osx + - ptyprocess + - python >=3.8 + - tornado >=6.1.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/terminado?source=hash-mapping + size: 22717 + timestamp: 1710265922593 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-2.0.0-pyh5ca1d4c_0.tar.bz2 + sha256: 9e02a7b85c7d103eee186a7d3f4ec2cb7005493fed7a9ae0b7dde6cec3f77f69 + md5: 884543801746a703120fb16cbe1a483b + depends: + - python >=3.5 + license: BSD 3-Clause + license_family: BSD + purls: + - pkg:pypi/threadpoolctl?source=hash-mapping + size: 14580 + timestamp: 1582658451382 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + sha256: 6016672e0e72c4cf23c0cf7b1986283bd86a9c17e8d319212d78d8e9ae42fdfd + md5: 9d64911b31d57ca443e9f1e36b04385f + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/threadpoolctl?source=hash-mapping + size: 23869 + timestamp: 1741878358548 +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 + md5: f1acf5fdefa8300de697982bcb1761c9 + depends: + - python >=3.5 + - webencodings >=0.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/tinycss2?source=hash-mapping + size: 28285 + timestamp: 1729802975370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3285204 + timestamp: 1748387766691 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + sha256: b24468006a96b71a5f4372205ea7ec4b399b0f2a543541e86f883de54cd623fc + md5: 9864891a6946c2fe037c02fca7392ab4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3259809 + timestamp: 1748387843735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125538 + timestamp: 1748388189063 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3466348 + timestamp: 1748388121356 +- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + md5: b0dd904de08b7db706167240bf37b164 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/toml?source=hash-mapping + size: 22132 + timestamp: 1734091907682 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + sha256: 040a5a05c487647c089ad5e05ad5aff5942830db2a4e656f1e300d73436436f1 + md5: 30a0a26c8abccf4b7991d590fe17c699 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 21238 + timestamp: 1753796677376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py311h49ec1c0_0.conda + sha256: 99b43e96b71271bf906d87d9dceeb1b5d7f79d56d2cd58374e528b56830c99af + md5: 8e82bf1a7614ac43096a5c8d726030a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 869655 + timestamp: 1754732128935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py312h4c3975b_0.conda + sha256: 891965f8e495ad5cef399db03a13df48df7add06ae131f4b77a88749c74b2060 + md5: 82dacd4832dcde0c2b7888248a3b3d7c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=compressed-mapping + size: 850503 + timestamp: 1754732194289 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py311h13e5629_0.conda + sha256: a93bef1cc950c77c043c450a6740c81b583d196780a11fcd0b95300e23acb0be + md5: 7edf47f4bdc8f6934c558c35036fda91 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 869677 + timestamp: 1754732189934 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.2-py312h2f459f6_0.conda + sha256: 93ab198aa2f4dc4edf0f34bb58daabe62cbbd13c164eba8319f9bc197e2b613a + md5: 45295c7a0d78367b40351370cd8fd8a6 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 849962 + timestamp: 1754732232519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py311h3696347_0.conda + sha256: e174acd73e641bc71673b9d4793a2c0321206baafd7a76e92b011fdc85a67908 + md5: cb8f3a7aa93ebc21113e2f6266d66c9c + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 871796 + timestamp: 1754732249406 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py312h163523d_0.conda + sha256: 82ceea2527ac484f5c8d7dee95033935b7fecb0b42afb2d9538f7397404aa6d8 + md5: 181a5ca410bad66be792da0e11038016 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 853490 + timestamp: 1754732280524 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.1.0-pyh29332c3_0.conda + sha256: c5b373f6512b96324c9607d7d91a76bb53c1056cb1012b4f9c86900c6b7f8898 + md5: d319066fad04e07a0223bf9936090161 + depends: + - id + - importlib-metadata >=3.6 + - keyring >=15.1 + - packaging >=24.0 + - python >=3.9 + - readme_renderer >=35.0 + - requests >=2.20 + - requests-toolbelt >=0.8.0,!=0.9.0 + - rfc3986 >=1.4.0 + - rich >=12.0.0 + - urllib3 >=1.26.0 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/twine?source=hash-mapping + size: 40401 + timestamp: 1737553658703 +- conda: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20250809-pyhd8ed1ab_0.conda + sha256: e54a82e474f4f4b6988c6c7186e5def628c840fca81f5d103e9f78f01d5fead1 + md5: 63a644e158c4f8eeca0d1290ac25e0cc + depends: + - python >=3.9 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/types-python-dateutil?source=hash-mapping + size: 24646 + timestamp: 1754722843717 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda + sha256: 349951278fa8d0860ec6b61fcdc1e6f604e6fce74fabf73af2e39a37979d0223 + md5: 75be1a943e0a7f99fcf118309092c635 + depends: + - typing_extensions ==4.14.1 pyhe01879c_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 90486 + timestamp: 1751643513473 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda + sha256: 4f52390e331ea8b9019b87effaebc4f80c6466d09f68453f52d5cdc2a3e1194f + md5: e523f4f1e980ed7a4240d7e27e9ec81f + depends: + - python >=3.9 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 51065 + timestamp: 1751643513473 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c + md5: f6d7aa696c67756a650e91e15e88223c + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/typing-utils?source=hash-mapping + size: 15183 + timestamp: 1733331395943 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + purls: [] + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 559710 + timestamp: 1728377334097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + sha256: 4542cc3093f480c7fa3e104bfd9e5b7daeff32622121be6847f9e839341b0790 + md5: 4e8447ca8558a203ec0577b4730073f3 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13858 + timestamp: 1725784165345 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311hf2f7c97_5.conda + sha256: d1aaec2edf78eeb79407d907679a78ecc0c97f7390046a45d561e22b348de553 + md5: 1b576e5588d90b82f96e3e21490b085d + depends: + - __osx >=10.13 + - cffi + - libcxx >=17 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13060 + timestamp: 1725784205661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + sha256: f48499c8f639265c53dc794ff2f2d0aa163845eb31841c226ec172f64861654d + md5: d5fe38d502e3d758c8f0fed8ba9ea652 + depends: + - __osx >=11.0 + - cffi + - libcxx >=17 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13603 + timestamp: 1725784278728 +- conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h3257749_5.conda + sha256: 7624abb32c075e234dad59acb5b580006adfef348cd1aefcbe0be31546aa5b73 + md5: 938a78ac20d6ed625b8d76015c6be88d + depends: + - cffi + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 17253 + timestamp: 1725784407361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda + sha256: e786fb0925515fffc83e393d2a0e2814eaf9be8a434f1982b399841a2c07980b + md5: 51a12678b609f5794985fda8372b1a49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 405017 + timestamp: 1736692662280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + sha256: 638916105a836973593547ba5cf4891d1f2cb82d1cf14354fcef93fd5b941cdc + md5: 617f5d608ff8c28ad546e5d9671cbb95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 404401 + timestamp: 1736692621599 +- conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-16.0.0-py311h4d7f069_0.conda + sha256: 57ece538ef5ffbb61eabe2972b05dfba0f3c48991bd406fa3ed34203102fba5b + md5: 8eec66bc3c7fccd3c4eec33f729aeb29 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 400137 + timestamp: 1736692685449 +- conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-16.0.0-py312h01d7ebd_0.conda + sha256: ac5cc7728c3052777aa2d54dde8735f677386b38e3a4c09a805120274a8b3475 + md5: 27740ecb2764b1cddbe1e7412ed16034 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 399510 + timestamp: 1736692713652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-16.0.0-py311h917b07b_0.conda + sha256: 4edd8c92ea579b8b5997e4b6159271dc47ce4826e880b8f8eec52be88619b03f + md5: d1e4a3605a1ca37cb73937772c5310af + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 411234 + timestamp: 1736692763548 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-16.0.0-py312hea69d52_0.conda + sha256: c6ca9ea11eecc650df4bce4b3daa843821def6d753eeab6d81de35bb43f9d984 + md5: 9a835052506b91ea8f0d8e352cd12246 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 409745 + timestamp: 1736692768349 +- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0 + md5: e7cb0f5745e4c5035a460248334af7eb + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/uri-template?source=hash-mapping + size: 23990 + timestamp: 1733323714454 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8 + md5: 436c165519e140cb08d246a4472a9d6a + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 101735 + timestamp: 1750271478254 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18249 + timestamp: 1753739241465 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 682424 + timestamp: 1753739239305 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 113963 + timestamp: 1753739198723 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + sha256: 398f40090e80ec5084483bb798555d0c5be3d1bb30f8bb5e4702cd67cdb595ee + md5: 2bd6c0c96cfc4dbe9bde604a122e3e55 + depends: + - distlib >=0.3.7,<1 + - filelock >=3.12.2,<4 + - platformdirs >=3.9.1,<5 + - python >=3.9 + - typing_extensions >=4.13.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=compressed-mapping + size: 4381624 + timestamp: 1755111905876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + sha256: ba673427dcd480cfa9bbc262fd04a9b1ad2ed59a159bd8f7e750d4c52282f34c + md5: 0f2ca7906bf166247d1d760c3422cb8a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + purls: [] + size: 330474 + timestamp: 1751817998141 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 + md5: b68980f2495d096e71c7fd9d7ccf63e6 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=hash-mapping + size: 32581 + timestamp: 1733231433877 +- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-24.11.1-pyhd8ed1ab_0.conda + sha256: 08315dc2e61766a39219b2d82685fc25a56b2817acf84d5b390176080eaacf99 + md5: b49f7b291e15494aafb0a7d74806f337 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webcolors?source=hash-mapping + size: 18431 + timestamp: 1733359823938 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webencodings?source=hash-mapping + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda + sha256: 1dd84764424ffc82030c19ad70607e6f9e3b9cb8e633970766d697185652053e + md5: 84f8f77f0a9c6ef401ee96611745da8f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/websocket-client?source=hash-mapping + size: 46718 + timestamp: 1733157432924 +- conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda + sha256: cd9a603beae0b237be7d9dfae8ae0b36ad62666ac4bb073969bce7da6f55157c + md5: 0a9b57c159d56b508613cc39022c1b9e + depends: + - markupsafe >=2.1.1 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/werkzeug?source=hash-mapping + size: 243546 + timestamp: 1733160561258 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + md5: 75cb7132eb58d97896e173ef12ac9986 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 62931 + timestamp: 1733130309598 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py310h7c4b9e2_0.conda + sha256: 57345db5cba6ad3f618413af5581069f733d10624cb9f969605ecacc6aa710fa + md5: 204db22a01eadc13a0d3f77a322d898a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=compressed-mapping + size: 57009 + timestamp: 1755006508577 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py311h49ec1c0_0.conda + sha256: 98ea1e7a6da62377d0fab668bc93d1db57ee56607a18426928e4f004ee9790f9 + md5: a7edc57f727dd421a8f2a76dd599e99f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 65592 + timestamp: 1755007023021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_0.conda + sha256: af711a6449d2ca3fa4c245dee78665050c6ff3a08e8ea5d4bed8472f290c8b67 + md5: 28f4b2672dab90c896adf9acf2b774c1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=compressed-mapping + size: 64581 + timestamp: 1755007045538 +- conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py310h1b7cace_0.conda + sha256: 2579d3cb3cd915145fcd0bc10dd730ac3a7bb95f01f01ec58ae98120b19a49e8 + md5: 4488b4df17ce5b608a6153805d21928e + depends: + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 53945 + timestamp: 1755006657950 +- conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py311h13e5629_0.conda + sha256: 5761dc2e3baf777458213b7510b57ab91df639f9133abe0c1f51ac372235ede7 + md5: c8da0f305dc74372abe635cc00a1bbb1 + depends: + - __osx >=10.13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 62034 + timestamp: 1755006556885 +- conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py312h2f459f6_0.conda + sha256: 18c49f1c475c55be856b1a43892389ef4e2d79114392ea5718d8e5b04ff0fb2e + md5: 9af60a9fe81152586f8f2a168741a581 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 60804 + timestamp: 1755006545368 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py310h7bdd564_0.conda + sha256: 10606b8eb60128d53db4e3ac2840f125af3fd0b973ecc0cb8c52b7807505d4df + md5: afa2ee9a5f33f036941f476ab6f6a806 + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=compressed-mapping + size: 54013 + timestamp: 1755006615821 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py311h3696347_0.conda + sha256: 0e20caa41d795a5cc1f73780dc303154ce0228a820c7f1756b55dc1ad2e0ec97 + md5: bab997b5ebc068f99e2ca194508ff65e + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 62522 + timestamp: 1755006602947 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py312h163523d_0.conda + sha256: 96d3b22da285244f83f6f7be54471634c88516f661326a9caa2eb9e44fae0ea0 + md5: 91548390b971bf77d15369b0916b6ff0 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 61356 + timestamp: 1755006569811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d + md5: fdc27cb255a7a2cc73b7919a968b48f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20772 + timestamp: 1750436796633 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + sha256: c7b35db96f6e32a9e5346f97adc968ef2f33948e3d7084295baebc0e33abdd5b + md5: eb44b3b6deb1cab08d72cb61686fe64c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.13 + - libxcb >=1.16,<2.0.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20296 + timestamp: 1726125844850 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 + md5: a0901183f08b6c7107aab109733a3c91 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + license: MIT + license_family: MIT + purls: [] + size: 24551 + timestamp: 1718880534789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 + md5: ad748ccca349aec3e91743e08b5e2b50 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 14314 + timestamp: 1718846569232 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df + md5: 0e0cbe0564d03a99afd5fd7b362feecd + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 16978 + timestamp: 1718848865819 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a + md5: 608e0ef8256b81d04456e8d211eee3e8 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 51689 + timestamp: 1718844051451 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + sha256: a5d4af601f71805ec67403406e147c48d6bad7aaeae92b0622b7e2396842d3fe + md5: 397a013c2dc5145a70737871aaa87e98 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 392406 + timestamp: 1749375847832 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 27590 + timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 835896 + timestamp: 1741901112627 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda + sha256: b4d2225135aa44e551576c4f3cf999b3252da6ffe7b92f0ad45bb44b887976fc + md5: 4cf40e60b444d56512a64f39d12c20bd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 13290 + timestamp: 1734229077182 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f + md5: d3c295b50f092ab525ffe3c2aa4b7413 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13603 + timestamp: 1727884600744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13217 + timestamp: 1727891438799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda + sha256: bb4d1ef9cafef535494adf9296130b6193b3a44375883185b5167de03eb1ac7f + md5: 9f438e1b6f4e73fd9e6d78bfe7c36743 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 18465 + timestamp: 1727794980957 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50060 + timestamp: 1727752228921 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 19575 + timestamp: 1727794961233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d + md5: 2de7f99d6581a4a7adbff607b5c278ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 29599 + timestamp: 1727794874300 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + sha256: 8a4e2ee642f884e6b78c20c0892b85dd9b2a6e64a6044e903297e616be6ca35b + md5: 5efa5fa6243a622445fdfd72aee15efa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 17819 + timestamp: 1734214575628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 + md5: a645bb90997d3fc2aea0adf6517059bd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 79419 + timestamp: 1753484072608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + sha256: b932dce8c9de9a8ffbf0db0365d29677636e599f7763ca51e554c43a0c5f8389 + md5: 6a0a76cd2b3d575e1b7aaeb283b9c3ed + depends: + - __osx >=10.13 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 292112 + timestamp: 1731585246902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad + md5: df5e78d904988eb55042c0c97446079f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 22963 + timestamp: 1749421737203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda + sha256: f9b76c2f8a0f96e656843553272e547170182f5b8aba1a6bcba28f7611d87c23 + md5: f9254b5b0193982416b91edcb4b2676f + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 722119 + timestamp: 1745869786772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda + sha256: 76d28240cc9fa0c3cb2cde750ecaf98716ce397afaf1ce90f8d18f5f43a122f1 + md5: ca02de88df1cc3cfc8f24766ff50cb3c + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 731883 + timestamp: 1745869796301 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda + sha256: ff62d2e1ed98a3ec18de7e5cf26c0634fd338cb87304cf03ad8cbafe6fe674ba + md5: 630db208bc7bbb96725ce9832c7423bb + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 732224 + timestamp: 1745869780524 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310hbb8c376_2.conda + sha256: fad4ae15d30c13d0d51748139064fc0bb59359719881e7a370ca8652c4917828 + md5: 5b75d4015ead2df6bf15bc372edfa139 + depends: + - __osx >=10.13 + - cffi >=1.11 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 681744 + timestamp: 1745869885563 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py311h4d7f069_2.conda + sha256: 72ab78bbde3396ffb2b81a2513f48a27c128ddc4e06a8d3dbcfa790479deab40 + md5: 2712198232a6fcc673f9eef62fce85d5 + depends: + - __osx >=10.13 + - cffi >=1.11 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 691672 + timestamp: 1745869990327 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h01d7ebd_2.conda + sha256: 970db6b96b9ac7c1418b8743cf63c3ee6285ec7f56ffc94ac7850b4c2ebc3095 + md5: 64aea64b791ab756ef98c79f0e48fee5 + depends: + - __osx >=10.13 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 690063 + timestamp: 1745869852235 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h078409c_2.conda + sha256: 6fdb3e71c6af5fe9c2469befb724a80d8c874078df1fa9738d84cf857d84d4b1 + md5: a617ab3d9042eef702d8d163c50e9b5e + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 522323 + timestamp: 1745870245475 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py311h917b07b_2.conda + sha256: 7c7f7e24ff49dc6ecb804373bedca663d3c24d57cac55524be8c83da90313928 + md5: 9fd87c9aae7db68b4a3427886b5f3eea + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 532851 + timestamp: 1745869893672 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312hea69d52_2.conda + sha256: c499a2639c2981ac2fd33bae2d86c15d896bc7524f1c5651a7d3b088263f7810 + md5: ba0eb639914e4033e090b46f53bec31c + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 532173 + timestamp: 1745870087418 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567578 + timestamp: 1742433379869 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + sha256: c171c43d0c47eed45085112cb00c8c7d4f0caa5a32d47f2daca727e45fb98dca + md5: cd60a4a5a8d6a476b30d8aa4bb49251a + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 485754 + timestamp: 1742433356230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 399979 + timestamp: 1742433432699 diff --git a/pyproject.toml b/pyproject.toml index b41338e5c..4e8e833e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,18 +1,266 @@ -[tool.black] -target-version = ['py38'] -include = '\.pyi?$' +[build-system] +requires = ["setuptools>=71", "setuptools_scm[toml]>=8"] +build-backend = "setuptools.build_meta" + +[project] +name = "imbalanced-learn" +dynamic = ["version", "readme"] +description = "Toolbox for imbalanced dataset in machine learning" +authors = [ + { name="G. Lemaitre", email="g.lemaitre58@gmail.com"}, + { name="C. Aridas", email="ichkoar@gmail.com"}, +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Scientific/Engineering", + "Topic :: Software Development :: Libraries", +] +requires-python = ">=3.10" +dependencies = [ + "numpy>=1.25.2,<3", + "scipy>=1.11.4,<2", + "scikit-learn>=1.4.2,<2", + "joblib>=1.2.0,<2", + "threadpoolctl>=2.0.0,<4", +] -[tool.isort] -profile = "black" +[tool.setuptools.dynamic] +version = { file = "imblearn/VERSION.txt" } +readme = { file = "README.rst" } -[tool.ruff] -# all rules can be found here: https://beta.ruff.rs/docs/rules/ -select = ["E", "F", "W", "I"] +[project.optional-dependencies] +dev = [ + "ipykernel", + "ipython", + "jupyterlab", +] +docs = [ + "pandas>=2.0.3,<3", + "tensorflow>=2.16.1,<3", + "matplotlib>=3.7.3,<4", + "seaborn>=0.12.2,<1", + "memory_profiler>=0.61.0,<1", + "numpydoc>=1.5.0,<2", + "sphinx>=8.0.2,<9", + "sphinx-gallery>=0.13.0,<1", + "sphinxcontrib-bibtex>=2.6.3,<3", + "sphinx-copybutton>=0.5.2,<1", + "pydata-sphinx-theme>=0.15.4,<1", + "sphinx-design>=0.6.1,<1", +] +linters = [ + "black==23.3.0", + "ruff==0.4.8", + "pre-commit", +] +optional = [ + "pandas>=2.0.3,<3", +] +tensorflow = [ + "tensorflow>=2.16.1,<3", +] +keras = [ + "keras>=3.3.3,<4", +] +tests = [ + "packaging>=23.2,<25", + "pytest>=7.2.2,<9", + "pytest-cov>=4.1.0,<6", + "pytest-xdist>=3.5.0,<4", +] + +[project.urls] +Homepage = "https://imbalanced-learn.org/" +Source = "https://github.com/scikit-learn-contrib/imbalanced-learn" +Issues = "https://github.com/scikit-learn-contrib/imbalanced-learn/issues" + +[tool.setuptools] +packages = ["imblearn"] + +[tool.pixi.project] +channels = ["conda-forge"] +platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"] + +[tool.pixi.dependencies] +numpy = ">=1.25.2,<3" +scipy = ">=1.11.4,<2" +scikit-learn = ">=1.4.2,<2" +joblib = ">=1.2.0,<2" +threadpoolctl = ">=2.0.0,<4" + +[tool.pixi.feature.dev.dependencies] +ipykernel = "*" +ipython = "*" +jupyterlab = "*" +pip = "*" +twine = "*" + +[tool.pixi.feature.dev.pypi-dependencies] +"build" = "*" + +[tool.pixi.feature.docs.dependencies] +matplotlib = ">=3.7.3,<4" +seaborn = ">=0.12.2,<1" +memory_profiler = ">=0.61.0,<1" +numpydoc = ">=1.5.0,<2" +sphinx = ">=8.0.2,<9" +sphinx-gallery = ">=0.13.0,<1" +sphinxcontrib-bibtex = ">=2.4.1,<3" +sphinx-copybutton = ">=0.5.2,<1" +pydata-sphinx-theme = ">=0.15.4,<1" +sphinx-design = ">=0.6.1,<1" + +[tool.pixi.feature.linters.dependencies] +black = "==23.3.0" +ruff = "==0.4.8" +pre-commit = "*" + +[tool.pixi.feature.optional.dependencies] +pandas = ">=2.0.3,<3" + +[tool.pixi.feature.keras] +platforms = ["linux-64", "osx-arm64", "osx-64"] + +[tool.pixi.feature.keras.dependencies] +keras = ">=3.3.3,<4" + +[tool.pixi.feature.tensorflow] +platforms = ["linux-64", "osx-arm64", "osx-64"] + +[tool.pixi.feature.tensorflow.dependencies] +tensorflow = ">=2.16.1,<3" +keras = ">=3.3.3,<3.9" + +[tool.pixi.feature.min-dependencies.dependencies] +numpy = "==1.25.2" +scipy = "==1.11.4" +scikit-learn = "==1.4.2" +joblib = "==1.2.0" +threadpoolctl = "==2.0.0" + +[tool.pixi.feature.min-optional-dependencies.dependencies] +pandas = "==2.0.3" + +[tool.pixi.feature.min-keras] +platforms = ["linux-64", "osx-arm64", "osx-64"] +[tool.pixi.feature.min-keras.dependencies] +keras = "==3.3.3" + +[tool.pixi.feature.min-tensorflow] +platforms = ["linux-64", "osx-arm64", "osx-64"] + +[tool.pixi.feature.min-tensorflow.dependencies] +tensorflow = "==2.16.1" +keras = "==3.3.3" + +[tool.pixi.feature.sklearn-1-4.dependencies] +scikit-learn = "~=1.4.0" + +[tool.pixi.feature.sklearn-1-5.dependencies] +scikit-learn = "~=1.5.0" + +[tool.pixi.feature.sklearn-1-6.dependencies] +scikit-learn = "~=1.6.0" + +[tool.pixi.feature.scipy-1-15.dependencies] +# for scikit-learn < 1.7, scipy > 1.15 is raising a deprecation warning +scipy = "~=1.15.0" + +[tool.pixi.feature.py310.dependencies] +python = "~=3.10.0" + +[tool.pixi.feature.py311.dependencies] +python = "~=3.11.0" + +[tool.pixi.feature.py312.dependencies] +python = "~=3.12.0" + +[tool.pixi.feature.py313.dependencies] +python = "~=3.13.0" + +[tool.pixi.feature.tests.dependencies] +packaging = ">=23.2,<25" +pytest = ">=7.2.2,<9" +pytest-cov = ">=4.1.0,<6" +pytest-xdist = ">=3.5.0,<4" + +[tool.pixi.pypi-dependencies] +imbalanced-learn = { path = ".", editable = true } + +[tool.pixi.feature.docs.tasks] +build-docs = { cmd = "make html", cwd = "doc" } +clean-docs = { cmd = "rm -rf _build/ && rm -rf auto_examples/ && rm -rf reference/generated/", cwd = "doc" } + +[tool.pixi.feature.linters.tasks] +linters = { cmd = "pre-commit install && pre-commit run -v --all-files --show-diff-on-failure" } + +[tool.pixi.feature.tests.tasks] +tests = { cmd = "pytest -vsl --cov=imblearn --cov-report=xml imblearn" } + +[tool.pixi.environments] +linters = ["linters"] +docs = ["optional", "docs", "tensorflow"] +optional = ["optional"] +tests = ["tests", "tensorflow"] +dev = ["dev", "optional", "docs", "linters", "tests", "tensorflow"] + +ci-py310-min-dependencies = ["py310", "min-dependencies", "tests"] +ci-py310-min-optional-dependencies = ["py310", "min-dependencies", "min-optional-dependencies", "tests"] +ci-py310-min-keras = ["py310", "min-keras", "tests"] +ci-py310-min-tensorflow = ["py310", "min-tensorflow", "tests"] + +ci-py311-sklearn-1-4 = ["py311", "sklearn-1-4", "scipy-1-15", "tests"] +ci-py311-sklearn-1-5 = ["py311", "sklearn-1-5", "scipy-1-15", "tests"] +ci-py312-sklearn-1-6 = ["py312", "sklearn-1-6", "scipy-1-15", "tests"] +ci-py311-latest-tensorflow = ["py311", "tensorflow", "tests"] +ci-py311-latest-keras = ["py311", "keras", "tests"] + +ci-py313-latest-dependencies = ["py313", "tests"] +ci-py313-latest-optional-dependencies = ["py313", "optional", "tests"] + +[tool.black] +line-length = 88 +target_version = ['py310', 'py311'] +preview = true +# Exclude irrelevant directories for formatting +exclude = ''' +/( + \.eggs + | \.git + | \.mypy_cache + | \.vscode + | \.pytest_cache + | \.idea + | build + | dist +)/ +''' + +[tool.ruff] # max line length for black line-length = 88 -target-version = "py38" +target-version = "py310" +exclude=[ + ".git", + "__pycache__", + "dist", + "doc/_build", + "doc/auto_examples", + "build", +] +[tool.ruff.lint] +# all rules can be found here: https://beta.ruff.rs/docs/rules/ +select = ["E", "F", "W", "I"] ignore=[ # space before : (needed for how black formats slicing) "E203", @@ -20,6 +268,22 @@ ignore=[ "E731", # do not use variables named 'l', 'O', or 'I' "E741", - # Import not on the top of the file - "E402", ] + +[tool.ruff.lint.per-file-ignores] +# It's fine not to put the import at the top of the file in the examples +# folder. +"examples/*"=["E402"] +"doc/conf.py"=["E402"] + +[tool.pytest.ini_options] +filterwarnings = [ + # Turn deprecation warnings into errors + "error::FutureWarning", + "error::DeprecationWarning", + + # raised by `joblib` in old versions + "ignore:.*distutils Version classes are deprecated.*:DeprecationWarning", +] +addopts = "--doctest-modules --color=yes -rs" +doctest_optionflags = "NORMALIZE_WHITESPACE ELLIPSIS" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index f19672de5..000000000 --- a/setup.cfg +++ /dev/null @@ -1,60 +0,0 @@ -[bumpversion] -current_version = 0.13.0.dev0 -tag = False -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? -serialize = - {major}.{minor}.{patch}.{release}{dev} - {major}.{minor}.{patch} - -[bumpversion:part:release] -optional_value = gamma -values = - dev - gamma - -[bumpversion:part:dev] - -[bumpversion:file:imblearn/_version.py] - -[aliases] -test = pytest - -[tool:pytest] -doctest_optionflags = NORMALIZE_WHITESPACE ELLIPSIS -testpaths = imblearn -addopts = - --doctest-modules - --color=yes - -rs -filterwarnings = - ignore:the matrix subclass:PendingDeprecationWarning - -[flake8] -max-line-length = 88 -target-version = ['py38'] -ignore = - E24, - E121, - E123, - E126, - E203, - E226, - E704, - E731, - E741, - W503, - W504 -exclude = - .git, - __pycache__, - dist, - doc/_build, - doc/auto_examples, - build, -per-file-ignores = - examples/*: E402 - doc/conf.py: E402 - -[mypy] -ignore_missing_imports = True -allow_redefinition = True diff --git a/setup.py b/setup.py deleted file mode 100755 index 5e26c3480..000000000 --- a/setup.py +++ /dev/null @@ -1,79 +0,0 @@ -#! /usr/bin/env python -"""Toolbox for imbalanced dataset in machine learning.""" - -import codecs -import os - -from setuptools import find_packages, setup - -try: - import builtins -except ImportError: - # Python 2 compat: just to be able to declare that Python >=3.7 is needed. - import __builtin__ as builtins - -# This is a bit (!) hackish: we are setting a global variable so that the -# main imblearn __init__ can detect if it is being loaded by the setup -# routine, to avoid attempting to load components that aren't built yet: -# the numpy distutils extensions that are used by imbalanced-learn to -# recursively build the compiled extensions in sub-packages is based on the -# Python import machinery. -builtins.__IMBLEARN_SETUP__ = True - -import imblearn._min_dependencies as min_deps # noqa - -# get __version__ from _version.py -ver_file = os.path.join("imblearn", "_version.py") -with open(ver_file) as f: - exec(f.read()) - -DISTNAME = "imbalanced-learn" -DESCRIPTION = "Toolbox for imbalanced dataset in machine learning." -with codecs.open("README.rst", encoding="utf-8-sig") as f: - LONG_DESCRIPTION = f.read() -MAINTAINER = "G. Lemaitre, C. Aridas" -MAINTAINER_EMAIL = "g.lemaitre58@gmail.com, ichkoar@gmail.com" -URL = "https://github.com/scikit-learn-contrib/imbalanced-learn" -LICENSE = "MIT" -DOWNLOAD_URL = "https://github.com/scikit-learn-contrib/imbalanced-learn" -VERSION = __version__ # noqa -CLASSIFIERS = [ - "Intended Audience :: Science/Research", - "Intended Audience :: Developers", - "License :: OSI Approved", - "Programming Language :: C", - "Programming Language :: Python", - "Topic :: Software Development", - "Topic :: Scientific/Engineering", - "Operating System :: Microsoft :: Windows", - "Operating System :: POSIX", - "Operating System :: Unix", - "Operating System :: MacOS", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", -] -PYTHON_REQUIRES = ">=3.8" -INSTALL_REQUIRES = (min_deps.tag_to_packages["install"],) -EXTRAS_REQUIRE = { - key: value for key, value in min_deps.tag_to_packages.items() if key != "install" -} - - -setup( - name=DISTNAME, - maintainer=MAINTAINER, - maintainer_email=MAINTAINER_EMAIL, - description=DESCRIPTION, - license=LICENSE, - url=URL, - version=VERSION, - download_url=DOWNLOAD_URL, - long_description=LONG_DESCRIPTION, - zip_safe=False, # the package can run out of an .egg file - classifiers=CLASSIFIERS, - packages=find_packages(), - install_requires=INSTALL_REQUIRES, - extras_require=EXTRAS_REQUIRE, -)