diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..997504b46 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true -diff diff --git a/.github/actions/create_python_environment/action.yml b/.github/actions/create_python_environment/action.yml deleted file mode 100644 index 475362c66..000000000 --- a/.github/actions/create_python_environment/action.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Create Python environment -description: Create the QUEENS Python environment with all dependencies - -outputs: - ppm: - description: Python package manager - value: ${{ steps.environment.outputs.ppm }} - -runs: - using: composite - steps: - - uses: conda-incubator/setup-miniconda@v3 - - name: Create environment and install QUEENS - id: environment - shell: bash -l {0} - env: - PYTHON_PACKAGE_MANAGER: conda - run: | - $PYTHON_PACKAGE_MANAGER env create -f environment.yml - $PYTHON_PACKAGE_MANAGER activate queens - pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cpu - pip install -e .[safe_develop,fourc] - $PYTHON_PACKAGE_MANAGER env export > pipeline_conda_environment.yml - $PYTHON_PACKAGE_MANAGER list - echo "ppm=$PYTHON_PACKAGE_MANAGER" >> $GITHUB_OUTPUT diff --git a/.github/actions/run-pytest-suite/action.yml b/.github/actions/run-pytest-suite/action.yml new file mode 100644 index 000000000..8980c7d1b --- /dev/null +++ b/.github/actions/run-pytest-suite/action.yml @@ -0,0 +1,74 @@ +name: Run pytest suite +description: Run a marked pytest suite and publish its reports. + +inputs: + test-suite-name: + description: Test suite name used in coverage, JUnit, and artifact filenames. + required: true + markers: + description: Pytest marker expression to select tests. + required: true + +runs: + using: composite + steps: + - name: Prepare report names + id: report-names + shell: bash + env: + TEST_SUITE_NAME: ${{ inputs.test-suite-name }} + run: | + echo "coverage-file=.coverage.${TEST_SUITE_NAME}" >> "$GITHUB_OUTPUT" + echo "junit-file=test_junit_${TEST_SUITE_NAME}.xml" >> "$GITHUB_OUTPUT" + echo "artifact-name=raw_test_reports_${TEST_SUITE_NAME}" >> "$GITHUB_OUTPUT" + + - name: Run pytest + id: pytest + shell: bash + continue-on-error: true + env: + COVERAGE_FILE: ${{ steps.report-names.outputs.coverage-file }} + JUNIT_FILE: ${{ steps.report-names.outputs.junit-file }} + PYTEST_MARKERS: ${{ inputs.markers }} + run: | + pytest_args=( + -v + -m "${PYTEST_MARKERS}" + --cov + --cov-report=term + --color=yes + -o junit_logging=all + --junitxml="${JUNIT_FILE}" + ) + + if [ -n "${TEST_TIMING_OPTION:-}" ]; then + read -r -a timing_args <<< "${TEST_TIMING_OPTION}" + pytest_args+=("${timing_args[@]}") + fi + + pytest "${pytest_args[@]}" + + - name: Publish junit pytest report + if: always() + uses: mikepenz/action-junit-report@v6 + with: + report_paths: ${{ steps.report-names.outputs.junit-file }} + annotate_only: true + job_summary: false + + - name: Upload raw test reports + if: always() + uses: actions/upload-artifact@v7 + with: + name: ${{ steps.report-names.outputs.artifact-name }} + include-hidden-files: true + path: | + ${{ steps.report-names.outputs.coverage-file }} + ${{ steps.report-names.outputs.junit-file }} + if-no-files-found: error + retention-days: 7 + + - name: Fail if pytest failed + if: steps.pytest.outcome == 'failure' + shell: bash + run: exit 1 diff --git a/.github/actions/setup-queens-pixi/action.yml b/.github/actions/setup-queens-pixi/action.yml new file mode 100644 index 000000000..aed4eb401 --- /dev/null +++ b/.github/actions/setup-queens-pixi/action.yml @@ -0,0 +1,88 @@ +--- +name: Setup QUEENS pixi environment +description: > + Set up pixi, install QUEENS editable into the selected environment, + and optionally ensure rsync is available. + +inputs: + cache: + description: Whether setup-pixi should enable caching. + required: false + default: "true" + cache-write: + description: Whether setup-pixi should write to the cache. + required: false + default: "false" + run-install: + description: Whether setup-pixi should install the selected pixi environments. + required: false + default: "true" + environments: + description: Whitespace-separated list of pixi environments to install. + required: false + default: default + activate-environment: + description: Pixi environment to activate and use for the editable install. + required: false + default: default + install-editable: + description: Whether to install QUEENS editable into the selected pixi environment. + required: false + default: "true" + ensure-rsync: + description: Whether to verify that rsync is available, installing it if necessary. + required: false + default: "true" + frozen: + description: Whether to install with frozen requirements. + required: false + default: "true" + +runs: + using: composite + steps: + - name: Read pixi version + id: pixi-version + shell: bash + run: | + pixi_version="$(tr -d '[:space:]' < "${GITHUB_WORKSPACE}/.pixi-version")" + echo "version=${pixi_version}" >> "$GITHUB_OUTPUT" + + - uses: prefix-dev/setup-pixi@v0.9.5 + with: + pixi-version: ${{ steps.pixi-version.outputs.version }} + cache: ${{ inputs.cache }} + cache-write: ${{ inputs.cache-write }} + run-install: ${{ inputs.run-install }} + environments: ${{ inputs.environments }} + frozen: ${{ inputs.frozen }} + activate-environment: ${{ inputs.activate-environment }} + + - name: Install QUEENS in workspace + if: ${{ inputs.install-editable != 'false' }} + shell: bash + run: | + pixi run --locked -e "${{ inputs.activate-environment }}" install-editable + + - name: Mark repo as safe for git + shell: bash + run: | + git config --global --add safe.directory "${GITHUB_WORKSPACE}" + + - name: Ensure rsync is available + if: ${{ inputs.ensure-rsync != 'false' }} + shell: bash + run: | + if command -v rsync >/dev/null 2>&1; then + rsync --version + elif [ "${RUNNER_OS}" = "Linux" ]; then + sudo apt-get update + sudo apt-get install -y rsync + rsync --version + elif [ "${RUNNER_OS}" = "macOS" ]; then + brew install rsync + rsync --version + else + echo "Unsupported runner OS for rsync setup: ${RUNNER_OS}" + exit 1 + fi diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..2d0f59c3c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +--- +version: 2 +updates: + - package-ecosystem: github-actions + directories: + - / + - /.github/actions/setup-queens-pixi + schedule: + interval: monthly + groups: + github-actions: + patterns: + - "*" + cooldown: + default-days: 7 diff --git a/.github/workflows/build_documentation.yml b/.github/workflows/build_documentation.yml index 021482be7..cf07b2f8c 100644 --- a/.github/workflows/build_documentation.yml +++ b/.github/workflows/build_documentation.yml @@ -1,7 +1,6 @@ -# yamllint disable -name: build_documentation +name: Build documentation -on: +"on": pull_request: push: branches: @@ -15,34 +14,27 @@ permissions: jobs: build-documentation: + name: Build documentation runs-on: ubuntu-latest container: image: ghcr.io/4c-multiphysics/4c-minimal:main options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 defaults: run: - shell: bash -l {0} + shell: bash -l -eo pipefail {0} steps: - - uses: actions/checkout@v4 - - name: Mark repo as safe for git - run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" - - name: Install rsync - run: | - sudo apt-get update - sudo apt-get install -y rsync + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev - name: Create links to 4C run: | ln -s /home/user/4C/bin/ config/4C_build - - name: Create Python environment - id: environment - uses: ./.github/actions/create_python_environment - - name: Add tutorial dependencies - env: - PYTHON_PACKAGE_MANAGER: ${{steps.environment.outputs.ppm}} + - name: Register Jupyter kernel run: | - $PYTHON_PACKAGE_MANAGER activate queens - pip install -e .[tutorial] python -m ipykernel install --user --name queens --display-name "Python (queens)" - name: Install xvfb run: | @@ -50,21 +42,20 @@ jobs: apt-get install -y xvfb - name: Sphinx build env: - PYTHON_PACKAGE_MANAGER: ${{steps.environment.outputs.ppm}} PYTHONPATH: ${{ github.workspace }} run: | - set -euxo pipefail - $PYTHON_PACKAGE_MANAGER activate queens + set -x sphinx-apidoc -o doc/source src/ -fMT cd doc xvfb-run -a sphinx-build -b html -d build/doctrees source build/html -W - name: Upload html - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: doc/build/html retention-days: 1 deploy-documentation: + name: Deploy documentation needs: build-documentation if: ${{github.ref == 'refs/heads/main'}} environment: @@ -74,4 +65,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml new file mode 100644 index 000000000..e22702eef --- /dev/null +++ b/.github/workflows/code_quality.yml @@ -0,0 +1,213 @@ +name: Code quality + +"on": + schedule: + - cron: "0 1 * * *" + pull_request: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +env: + # Set TEST_TIMING_OPTION if local test should be timed. Default is off. + TEST_TIMING_OPTION: "" + +jobs: + run_code_checks: + name: Check code quality + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: >- + all + dev + activate-environment: dev + ensure-rsync: false + - name: Check dependency declaration integrity + run: | + # Validate that the PEP-style dependency declarations in pyproject.toml + # stay aligned with the pixi dependency sections. + python3 tools/dependencies/check_pyproject_dependency_integrity.py \ + --path pyproject.toml \ + --allow-version-mismatch gpflow + - name: Check pixi environment integrity + id: environment_integrity + run: | + base_ref="main" + pyproject_diff_file="$(mktemp)" + git fetch --no-tags --depth=1 origin "${base_ref}" + + echo "::group::Check if dependency declarations changed..." + pyproject_changed=false + # The diff helper returns: + # 0 if dependency-related declarations are unchanged, + # 1 if there is a relevant dependency diff, + # >1 if the diff command itself failed. + if python3 tools/dependencies/diff_pyproject_dependency_declarations.py \ + --base-ref "origin/${base_ref}" \ + --head-ref HEAD \ + > "${pyproject_diff_file}"; then + pyproject_changed=false + else + # $? is the exit status of the last command. + # when arriving here, the diff command found a diff (exit status 1) or + # the diff command itself failed (exit status >1). + pyproject_check_status=$? + if [ "${pyproject_check_status}" -eq 1 ]; then + pyproject_changed=true + else + echo "Failed to compare dependency-related pyproject.toml sections." + exit "${pyproject_check_status}" + fi + fi + echo "Pyproject.toml dependency sections changed compared to ${base_ref}:" \ + "${pyproject_changed}" + echo "::endgroup::" + + echo "::group::Check if pixi.lock would be updated by pixi lock..." + # Detect any change (modified, deleted, untracked, etc.) + if [ -n "$(git status --porcelain -- pixi.lock)" ]; then + echo "Restoring pixi.lock from HEAD..." + git restore --source=HEAD --staged --worktree pixi.lock 2>/dev/null + fi + lock_update_possible=false + # deactivate exit on error to allow `pixi lock --check --dry-run` to fail + set +e + # `pixi lock --check --dry-run` exits non-zero when the current pyproject.toml + # would produce a different pixi.lock without writing the lockfile to disk. + pixi lock --check --dry-run + exit_code_pixi_lock_check=$? + # reactivate exit on error + set -e + echo "exit code: $exit_code_pixi_lock_check" + if [ $exit_code_pixi_lock_check -ne 0 ]; then + lock_update_possible=true + fi + echo "pixi.lock would be updated by pixi lock: ${lock_update_possible}" + echo "::endgroup::" + + { + echo "pyproject_changed=${pyproject_changed}" + echo "lock_update_possible=${lock_update_possible}" + echo "compare_ref=${base_ref}" + } >> "$GITHUB_OUTPUT" + + + # ---- Write rich Markdown to Step Summary ---- + { + echo "### Pixi Environment Integrity" + echo "" + echo "- dependency-relevant \`pyproject.toml\` changes:" + echo " - compare ref: \`${base_ref}\`" + echo " - changed: ${pyproject_changed}" + echo "- \`pixi.lock\` would change if refreshed: ${lock_update_possible}" + + if [ "${pyproject_changed}" = "true" ]; then + echo "" + echo "
" + echo "Dependency diff" + echo "" + echo '```diff' + cat "${pyproject_diff_file}" + echo '```' + echo "
" + fi + } >> "$GITHUB_STEP_SUMMARY" + + + # ---- Write clean, readable logs ---- + echo "::group::Summary Pixi Environment Integrity" + echo "----------------------------------------" + echo "pyproject changes vs ${base_ref}: ${pyproject_changed}" + echo "pixi.lock update possible: ${lock_update_possible}" + + if [ "${pyproject_changed}" = "true" ]; then + echo "::group::Dependency diff" + cat "${pyproject_diff_file}" + echo "::endgroup::" + fi + echo "::endgroup::" + + echo "::group::Do integrity check..." + # Only fail if the dependency declarations changed and the lockfile is + # stale. A stale lockfile without dependency declaration changes is + # reported in the summary but does not block the workflow here. + if [ "${pyproject_changed}" = "true" ] && [ "${lock_update_possible}" = "true" ]; then + echo "pyproject.toml dependency sections changed compared to main" + echo "AND pixi.lock would be updated by pixi lock." + echo "Please regenerate and commit pixi.lock for this change." + exit 1 + else + echo "Pixi environment integrity is OK." + fi + echo "::endgroup::" + + - name: Check compatibility of licenses of dependencies + run: | + pip-licenses --python=.pixi/envs/all/bin/python + + - name: Run basic pre-commit checks + run: | + pre-commit run trailing-whitespace --all-files + pre-commit run end-of-file-fixer --all-files + pre-commit run check-added-large-files --all-files + + - name: Create a licenserc file + run: | + python .gitlab/pipeline_utils/create_licenserc.py \ + --template_file ".gitlab/pipeline_utils/.licenserc_template.yaml" \ + --text_file "license_header.tmpl" \ + --output_file ".licenserc.yaml" \ + --placeholder "license_header" + + echo "Created an rc file for the license header check." + + - name: Check license headers + uses: apache/skywalking-eyes/header@v0.8.0 + + - name: Run ruff + run: | + ruff check + + - name: Check conventional commit messages + uses: webiny/action-conventional-commits@v1.4.2 + + - name: Run isort + run: | + isort --check-only src/* tests + + - name: Run black + run: | + black --check src/* tests + + - name: Run yamllint + run: | + yamllint -f=colored . + + - name: Run pylint + run: | + echo "Run pylint on src:" + pylint --rcfile=.pylintrc --ignore=integration_tests src/ tests/ + + echo + echo "Run pylint on integration tests:" + pylint --rcfile=.pylintrc --disable=duplicate-code tests/integration_tests/ + + - name: Run mypy + run: | + mypy . + + - name: Run nbstripout + run: | + find . -path './.pixi' -prune -o -name '*.ipynb' -exec nbstripout --verify {} + diff --git a/.github/workflows/local_testsuite.yml b/.github/workflows/local_testsuite.yml new file mode 100644 index 000000000..36c9d048f --- /dev/null +++ b/.github/workflows/local_testsuite.yml @@ -0,0 +1,207 @@ +name: Testsuite + +"on": + schedule: + - cron: "0 1 * * *" + pull_request: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +env: + # Set TEST_TIMING_OPTION if local test should be timed. Default is off. + TEST_TIMING_OPTION: "" + +jobs: + run_tests_core: + name: core tests (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + - os: macos-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev + - name: Run pytest for unit tests and integration tests + uses: ./.github/actions/run-pytest-suite + with: + test-suite-name: core.${{ runner.os }} + markers: "unit_tests or integration_tests" + + run_tests_tutorials: + name: tutorial tests (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + - os: macos-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev + - name: Run pytest for tutorial tests + uses: ./.github/actions/run-pytest-suite + with: + test-suite-name: tutorials.${{ runner.os }} + markers: tutorial_tests + + run_tests_fourc: + name: 4C integration tests (ubuntu-latest) + runs-on: ubuntu-latest + container: + image: ghcr.io/4c-multiphysics/4c-minimal:main + options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 + defaults: + run: + shell: bash -l -eo pipefail {0} + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev + - name: Create links to 4C + run: | + ln -s /home/user/4C/bin/ config/4C_build + - name: Run pytest for 4C integration tests + uses: ./.github/actions/run-pytest-suite + with: + test-suite-name: fourc.${{ runner.os }} + markers: integration_tests_fourc + + run_tests_tutorials_fourc: + name: 4C tutorial tests (ubuntu-latest) + runs-on: ubuntu-latest + container: + image: ghcr.io/4c-multiphysics/4c-minimal:main + options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 + defaults: + run: + shell: bash -l -eo pipefail {0} + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev + - name: Create links to 4C + run: | + ln -s /home/user/4C/bin/ config/4C_build + - name: Run pytest for 4C tutorial tests + uses: ./.github/actions/run-pytest-suite + with: + test-suite-name: tutorials_fourc.${{ runner.os }} + markers: tutorial_tests_fourc + + report_test_results: + name: report test results + if: always() + runs-on: ubuntu-latest + needs: + - run_tests_core + - run_tests_tutorials + - run_tests_fourc + - run_tests_tutorials_fourc + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v6 + - uses: ./.github/actions/setup-queens-pixi + with: + cache: true + cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + environments: dev + activate-environment: dev + ensure-rsync: false + - name: Download raw core test reports from Ubuntu + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_core.Linux + path: reports/core-ubuntu + - name: Download raw core test reports from macOS + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_core.macOS + path: reports/core-macos + - name: Download raw tutorial test reports from Ubuntu + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_tutorials.Linux + path: reports/tutorials-ubuntu + - name: Download raw tutorial test reports from macOS + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_tutorials.macOS + path: reports/tutorials-macos + - name: Download raw 4C test reports + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_fourc.Linux + path: reports/fourc-ubuntu + - name: Download raw 4C tutorial test reports + uses: actions/download-artifact@v8 + with: + name: raw_test_reports_tutorials_fourc.Linux + path: reports/tutorials-fourc-ubuntu + - name: Combine Ubuntu coverage data and build reports + run: | + cp reports/core-ubuntu/.coverage.core.Linux .coverage.core.Linux + cp reports/tutorials-ubuntu/.coverage.tutorials.Linux .coverage.tutorials.Linux + cp reports/fourc-ubuntu/.coverage.fourc.Linux .coverage.fourc.Linux + cp \ + reports/tutorials-fourc-ubuntu/.coverage.tutorials_fourc.Linux \ + .coverage.tutorials_fourc.Linux + + coverage combine \ + .coverage.core.Linux \ + .coverage.tutorials.Linux \ + .coverage.fourc.Linux \ + .coverage.tutorials_fourc.Linux + coverage html -d html_coverage_report + coverage xml -o xml_coverage_report.xml + coverage report + + python .github/xml_summaries_to_md.py \ + xml_coverage_report.xml \ + reports/core-ubuntu/test_junit_core.Linux.xml \ + reports/core-macos/test_junit_core.macOS.xml \ + reports/tutorials-ubuntu/test_junit_tutorials.Linux.xml \ + reports/tutorials-macos/test_junit_tutorials.macOS.xml \ + reports/fourc-ubuntu/test_junit_fourc.Linux.xml \ + reports/tutorials-fourc-ubuntu/test_junit_tutorials_fourc.Linux.xml \ + >> "$GITHUB_STEP_SUMMARY" + - name: Upload combined coverage report + uses: actions/upload-pages-artifact@v5 + with: + name: html-coverage-report + path: html_coverage_report/ + retention-days: 7 diff --git a/.github/workflows/test_pypi_build.yml b/.github/workflows/test_pypi_build.yml new file mode 100644 index 000000000..91bf34e6f --- /dev/null +++ b/.github/workflows/test_pypi_build.yml @@ -0,0 +1,70 @@ +name: Test PyPI build + +"on": + schedule: + - cron: "0 1 * * *" + pull_request: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +jobs: + test_pypi_build: + name: >- + PyPI build test + (${{ matrix.os }}, ${{ matrix.install_target }}, ${{ matrix.requiredness }}) + runs-on: ${{ matrix.os }} + continue-on-error: ${{ matrix.allow_failure }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + install_target: base + extra_selector: "" + allow_failure: false + requiredness: required + - os: ubuntu-latest + install_target: all + extra_selector: "[all]" + allow_failure: false + requiredness: required + - os: macos-latest + install_target: base + extra_selector: "" + allow_failure: true + requiredness: optional + - os: macos-latest + install_target: all + extra_selector: "[all]" + allow_failure: true + requiredness: optional + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + - name: Build wheel and sdist + run: | + python -m pip install --upgrade pip build + python -m build + - name: Install built wheel in clean virtual environment + run: | + python -m venv .venv-pypi-smoke + source .venv-pypi-smoke/bin/activate + python -m pip install --upgrade pip + wheel_path="$(find dist -maxdepth 1 -type f -name '*.whl' | head -n 1)" + python -m pip install "${wheel_path}${{ matrix.extra_selector }}" + python -m pip install pytest pytest-mock mock + - name: Run pure PyPI smoke checks + run: | + source .venv-pypi-smoke/bin/activate + python -c "import queens" + pytest -v -m "unit_tests" tests/unit_tests/ diff --git a/.github/workflows/tests_local.yml b/.github/workflows/tests_local.yml deleted file mode 100644 index a72dd4ad8..000000000 --- a/.github/workflows/tests_local.yml +++ /dev/null @@ -1,115 +0,0 @@ -# yamllint disable -name: tests_local - -on: - schedule: - - cron: "0 1 * * *" - pull_request: - push: - branches: - - main - workflow_dispatch: - -env: - # Set TEST_TIMING_OPTION if local test should be timed. Default is off. - TEST_TIMING_OPTION: "" - -jobs: - run_tests: - runs-on: ubuntu-latest - container: - image: ghcr.io/4c-multiphysics/4c-minimal:main - options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 - defaults: - run: - shell: bash -l {0} - steps: - - uses: actions/checkout@v4 - - name: Install rsync - run: | - sudo apt-get update - sudo apt-get install -y rsync - - name: Create links to 4C - run: | - ln -s /home/user/4C/bin/ config/4C_build - - name: Create Python environment - id: environment - uses: ./.github/actions/create_python_environment - - name: Get Python package manager - run: echo "PYTHON_PACKAGE_MANAGER=${{steps.environment.outputs.ppm}}" >> $GITHUB_ENV - - name: Code checks - run: | - $PYTHON_PACKAGE_MANAGER activate queens - - echo "::group::Run isort..." - isort --check-only src/* tests - echo "::endgroup::" - - echo "::group::Run black..." - black --check src/* tests - echo "::endgroup::" - - echo "::group::Run pylint on src..." - pylint --rcfile=.pylintrc --ignore=integration_tests src/ tests/ - echo "::endgroup::" - - echo "::group::Run pylint on integration tests..." - pylint --rcfile=.pylintrc --disable=duplicate-code tests/integration_tests/ - echo "::endgroup::" - - echo "::group::Run ruff..." - ruff check - echo "::endgroup::" - - echo "::group::Run nbstripout..." - find . -name '*.ipynb' -exec nbstripout --verify {} + - echo "::endgroup::" - - # echo "::group::Create code quality report..." - # pylint src/ tests --rcfile=.pylintrc --output-format=json:pylint_warnings.json --fail-under 0 - # python .gitlab/pipeline_utils/code_quality_creator.py pylint_warnings.json - # echo "::endgroup::" - - echo "::group::Check compatibility with licenses of dependencies..." - liccheck -r requirements.txt - echo "::endgroup::" - - echo "::group::Create an rc file for the license header check..." - python .gitlab/pipeline_utils/create_licenserc.py --template_file ".gitlab/pipeline_utils/.licenserc_template.yaml" --text_file "license_header.tmpl" --output_file ".licenserc.yaml" --placeholder "license_header" - echo "::endgroup::" - - echo "::group::Check type hinting with mypy..." - mypy . - echo "::endgroup::" - - name: Check license headers - uses: apache/skywalking-eyes/header@v0.4.0 - - name: Check conventional commit messages - uses: webiny/action-conventional-commits@v1.3.0 - - name: Run pytest - run: | - $PYTHON_PACKAGE_MANAGER activate queens - pytest -v -m "unit_tests or integration_tests or integration_tests_fourc" --cov --cov-report=term --cov-report=html:html_coverage_report --cov-report=xml:xml_coverage_report.xml $TEST_TIMING_OPTION --color=yes -o junit_logging=all --junitxml=test_junit.xml - python .github/xml_summaries_to_md.py test_junit.xml xml_coverage_report.xml >> $GITHUB_STEP_SUMMARY - - name: Add tutorial dependencies - env: - PYTHON_PACKAGE_MANAGER: ${{steps.environment.outputs.ppm}} - run: | - $PYTHON_PACKAGE_MANAGER activate queens - pip install -e .[tutorial] - - name: Run pytest for tutorials - run: | - $PYTHON_PACKAGE_MANAGER activate queens - pytest -v -m "tutorial_tests" - - name: Upload coverage report - uses: actions/upload-pages-artifact@v3 - with: - name: html-coverage-report - path: html_coverage_report/ - retention-days: 7 - - name: Publish junit pytest report - uses: mikepenz/action-junit-report@v5 - if: success() || failure() # always run even if the previous step fails - with: - report_paths: "test_junit.xml" - annotate_only: true - job_summary: false diff --git a/.github/workflows/update_dependencies.yml b/.github/workflows/update_dependencies.yml new file mode 100644 index 000000000..5d80098a2 --- /dev/null +++ b/.github/workflows/update_dependencies.yml @@ -0,0 +1,121 @@ +name: Update Dependencies + +"on": + workflow_dispatch: + schedule: + - cron: "0 5 1 * *" + +permissions: + contents: read + +jobs: + update-pixi: + name: Update Dependencies + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - name: Create GitHub App token + id: update_dependencies_token + uses: actions/create-github-app-token@v3 + with: + client-id: ${{ vars.UPDATE_DEPENDENCIES_APP_CLIENT_ID }} + private-key: ${{ secrets.UPDATE_DEPENDENCIES_APP_PRIVATE_KEY }} + permission-contents: write + permission-pull-requests: write + - uses: actions/checkout@v6 + - name: Find latest Pixi release + id: pixi_release + env: + GH_TOKEN: ${{ github.token }} + run: | + latest_version="$( + gh api \ + -H "Accept: application/vnd.github+json" \ + --paginate \ + "/repos/prefix-dev/pixi/releases" | + jq -rs ' + [ + .[][] + | select(.draft | not) + | select(.prerelease | not) + | .tag_name as $tag + | select($tag | test("^v[0-9]+\\.[0-9]+\\.[0-9]+$")) + | ($tag | capture( + "^v(?[0-9]+)\\.(?[0-9]+)\\.(?[0-9]+)$" + )) as $version + | { + tag: $tag, + major: ($version.major | tonumber), + minor: ($version.minor | tonumber), + patch: ($version.patch | tonumber) + } + ] + | sort_by(.major, .minor, .patch) + | last + | .tag + ' + )" + + if [ -z "${latest_version}" ] || [ "${latest_version}" = "null" ]; then + echo "No stable Pixi release tag matching vMAJOR.MINOR.PATCH found." + exit 1 + fi + + current_version="$(tr -d '[:space:]' < .pixi-version)" + echo "current_version=${current_version}" >> "$GITHUB_OUTPUT" + echo "latest_version=${latest_version}" >> "$GITHUB_OUTPUT" + + if [ "${current_version}" = "${latest_version}" ]; then + echo "version_changed=false" >> "$GITHUB_OUTPUT" + echo "Pixi is already up to date: ${current_version}" + else + echo "version_changed=true" >> "$GITHUB_OUTPUT" + echo "Pixi update available: ${current_version} -> ${latest_version}" + fi + - name: Update Pixi version file + if: ${{ steps.pixi_release.outputs.version_changed == 'true' }} + run: | + printf '%s\n' "${{ steps.pixi_release.outputs.latest_version }}" > .pixi-version + - name: Set up Pixi + uses: ./.github/actions/setup-queens-pixi + with: + install-editable: false + ensure-rsync: false + - name: Update Pixi lockfile + run: | + pixi update --json | pixi exec pixi-diff-to-markdown > pixi_lock_update.md + - name: Write pull request body + env: + CURRENT_PIXI_VERSION: ${{ steps.pixi_release.outputs.current_version }} + LATEST_PIXI_VERSION: ${{ steps.pixi_release.outputs.latest_version }} + VERSION_CHANGED: ${{ steps.pixi_release.outputs.version_changed }} + run: | + { + if [ "${VERSION_CHANGED}" = "false" ]; then + echo "Pixi is already up to date at \`${CURRENT_PIXI_VERSION}\`." + else + echo "Update Pixi from \`${CURRENT_PIXI_VERSION}\` to" \ + "\`${LATEST_PIXI_VERSION}\`." + echo "" + echo "Release: https://github.com/prefix-dev/pixi/releases/tag/${LATEST_PIXI_VERSION}" + fi + + echo "" + cat pixi_lock_update.md + } > pixi_update.md + - name: Create pull request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ steps.update_dependencies_token.outputs.token }} + commit-message: "build: update dependencies" + title: Update dependencies + body-path: pixi_update.md + branch: update-dependencies + base: main + labels: pixi + delete-branch: true + add-paths: | + .pixi-version + pixi.lock diff --git a/.github/xml_summaries_to_md.py b/.github/xml_summaries_to_md.py index bf0001bb9..49fc6e1f5 100644 --- a/.github/xml_summaries_to_md.py +++ b/.github/xml_summaries_to_md.py @@ -12,35 +12,176 @@ # should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, # see . # -"""Generate a md test summary from the xml test reports.""" +"""Generate a markdown test summary from XML test reports.""" import re import sys import xml.etree.ElementTree as ET -from copy import copy +from dataclasses import dataclass from pathlib import Path +MAX_SLOW_TESTS = 50 -def xml_to_dict(xml_element, root=True): - """Xml to dict converter. +JUNIT_REPORT_PATTERN = re.compile( + r"test_junit_(?Ptutorials_fourc|tutorials|fourc|core)_(?P[^.]+)\.xml$" +) +GROUP_LABELS = { + "core": "Core tests", + "tutorials": "Tutorial tests", + "fourc": "4C integration tests", + "tutorials_fourc": "4C tutorial tests", +} +RUNNER_LABELS = { + "Linux": "Ubuntu", + "macOS": "macOS", +} + + +@dataclass +class TestCase: + """Single JUnit testcase entry.""" + + group: str + classname: str + name: str + status: str + time: float + + +@dataclass +class TestReport: + """Aggregated JUnit report for one workflow test group.""" + + group: str + tests: int + passed: int + skipped: int + failures: int + errors: int + time: float + cases: list[TestCase] + + +def _xml_root(path): + """Read an XML file and return its root element.""" + return ET.fromstring(Path(path).read_text(encoding="utf-8")) + + +def _split_xml_paths(paths): + """Split input XML paths into JUnit reports and one coverage report. Args: - xml_element (ET): ElementTree object. - root (bool, optional): Is root object. Defaults to True. + paths (list): Input XML paths. Returns: - dict: data as dictionary + tuple: JUnit paths and coverage path. """ - if root: - return {xml_element.tag: xml_to_dict(xml_element, False)} - dictionary = copy(xml_element.attrib) - if xml_element.text: - dictionary["_text"] = xml_element.text - for x in xml_element.findall("./*"): - if x.tag not in dictionary: - dictionary[x.tag] = [] - dictionary[x.tag].append(xml_to_dict(x, False)) - return dictionary + junit_paths = [] + coverage_paths = [] + for path in paths: + root = _xml_root(path) + if root.tag == "coverage": + coverage_paths.append(path) + elif root.tag in {"testsuite", "testsuites"}: + junit_paths.append(path) + else: + raise ValueError(f"Unknown XML report type {root.tag!r} in {path}.") + + if not coverage_paths: + raise ValueError("No coverage XML report was provided.") + if len(coverage_paths) > 1: + raise ValueError("Expected exactly one coverage XML report.") + if not junit_paths: + raise ValueError("No JUnit XML reports were provided.") + + return junit_paths, coverage_paths[0] + + +def _iter_testsuites(root): + """Yield all testsuite elements from a JUnit XML root.""" + if root.tag == "testsuite": + yield root + return + + yield from root.findall(".//testsuite") + + +def _workflow_group_from_path(path): + """Infer workflow test group label from a JUnit XML file name.""" + match = JUNIT_REPORT_PATTERN.fullmatch(Path(path).name) + if match is None: + return Path(path).stem.replace("_", " ") + + group = GROUP_LABELS[match.group("group")] + runner = RUNNER_LABELS.get(match.group("runner"), match.group("runner")) + return f"{group} ({runner})" + + +def _testcase_status(testcase): + """Return the status of a JUnit testcase element.""" + if testcase.find("error") is not None: + return "error" + if testcase.find("failure") is not None: + return "failed" + if testcase.find("skipped") is not None: + return "skipped" + return "passed" + + +def _shorten_classname(classname): + """Shorten pytest class names for display.""" + prefixes = ( + "tests.unit_tests.", + "tests.integration_tests.", + "tests.tutorial_tests.", + "tests.benchmarks.", + ) + for prefix in prefixes: + if classname.startswith(prefix): + return classname[len(prefix) :] + return classname + + +def _format_test_name(name): + """Highlight pytest parametrization values in test names.""" + return re.sub(r"\[(.*?)\]", r"[**\1**]", name) + + +def _parse_junit_report(path): + """Parse one JUnit XML report into a TestReport.""" + root = _xml_root(path) + group = _workflow_group_from_path(path) + suites = list(_iter_testsuites(root)) + cases = [] + + for suite in suites: + for testcase in suite.findall("testcase"): + cases.append( + TestCase( + group=group, + classname=_shorten_classname(testcase.get("classname", "")), + name=_format_test_name(testcase.get("name", "")), + status=_testcase_status(testcase), + time=float(testcase.get("time", 0.0)), + ) + ) + + passed = sum(testcase.status == "passed" for testcase in cases) + skipped = sum(testcase.status == "skipped" for testcase in cases) + failures = sum(testcase.status == "failed" for testcase in cases) + errors = sum(testcase.status == "error" for testcase in cases) + runtime = sum(float(suite.get("time", 0.0)) for suite in suites) + + return TestReport( + group=group, + tests=len(cases), + passed=passed, + skipped=skipped, + failures=failures, + errors=errors, + time=runtime, + cases=cases, + ) def create_md_table(data_list, header): @@ -54,8 +195,12 @@ def create_md_table(data_list, header): str: table string """ - def add_seperators(row): - """Add markdown table seperators. + def markdown_cell(value): + """Format a value as markdown table cell.""" + return str(value).replace("|", r"\|").replace("\n", "
") + + def add_separators(row): + """Add markdown table separators. Args: row (list): List of row data. @@ -63,16 +208,19 @@ def add_seperators(row): Returns: str: single row for markdown table """ - return "|" + "|".join([str(s) for s in row]) + "|" + return "|" + "|".join([markdown_cell(s) for s in row]) + "|" + + if not data_list: + return "_No entries._" - table = [add_seperators(header)] - table.append(add_seperators(["--"] * len(header))) - table.extend([add_seperators(k) for k in data_list]) + table = [add_separators(header)] + table.append(add_separators(["--"] * len(header))) + table.extend([add_separators(k) for k in data_list]) return "\n".join(table) -def collapsable(full_text, summary): - """Create collapsable section. +def collapsible(full_text, summary): + """Create collapsible section. Args: full_text (str): Full text. @@ -81,86 +229,140 @@ def collapsable(full_text, summary): Returns: str: collapse section """ - return f"
\n{summary}\n\n{full_text}\n\n
" "" + return f"
\n{summary}\n\n{full_text}\n\n
" + + +def collapsable(full_text, summary): + """Create collapsible section. + + Keep the old misspelled function name for compatibility. + """ + return collapsible(full_text, summary) + + +def _format_time(seconds): + """Format a time value for markdown output.""" + return f"{seconds:.3f}" -def generate_md_summary(path_to_junit_xml, path_to_coverage_xml): +def _format_test_count(count): + """Format a test count with the correct singular or plural label.""" + return f"{count} test" if count == 1 else f"{count} tests" + + +def _report_summary(report): + """Create a compact text summary for one grouped report.""" + failed = report.failures + report.errors + status_summary = f"{report.passed} passed" + if report.skipped: + status_summary += f", {report.skipped} skipped" + if failed: + status_summary += f", {failed} failed or errored" + return f"{_format_test_count(report.tests)} took {int(report.time)}s ({status_summary})." + + +def _overview_rows(reports): + """Create the workflow group overview table rows.""" + return [ + [ + report.group, + report.tests, + report.passed, + report.skipped, + report.failures, + report.errors, + _format_time(report.time), + ] + for report in reports + ] + + +def _case_rows(cases): + """Create markdown table rows for testcase entries.""" + return [ + [ + testcase.group, + testcase.classname, + testcase.name, + testcase.status, + _format_time(testcase.time), + ] + for testcase in cases + ] + + +def generate_md_summary(*paths): """Generate markdown summary. Args: - path_to_junit_xml (str): Path to junit xml file. - path_to_coverage_xml (str): Path to coverage xml file. + paths (str): Paths to JUnit XML files and one coverage XML file. The + order is flexible; report types are detected from the XML root tag. Returns: str: pytest summary. """ - root = ET.fromstring(Path(path_to_junit_xml).read_text(encoding="utf-8")) - junit_report = xml_to_dict(root) - - root = ET.fromstring(Path(path_to_coverage_xml).read_text(encoding="utf-8")) - coverage_summary = xml_to_dict(root) - - testing_time = junit_report["testsuites"]["testsuite"][0]["time"] - total_number_of_tests = junit_report["testsuites"]["testsuite"][0]["tests"] - unit_tests = [] - integration_tests = [] - failed = [] - for k in junit_report["testsuites"]["testsuite"][0]["testcase"]: - k.pop("system-out") - k.pop("system-err") - k["time"] = float(k["time"]) - k["name"] = re.sub(r"\[(.*?)\]", r"[**\1**]", k["name"]) - - if k.pop("failure", False): - failed.append(list(k.values())) - if k["classname"].startswith("tests.unit_tests"): - k["classname"] = k["classname"][len("tests.unit_tests.") :] - unit_tests.append(list(k.values())) - elif k["classname"].startswith("tests.integration_tests"): - k["classname"] = k["classname"][len("tests.integration_tests.") :] - integration_tests.append(list(k.values())) + flattened_paths = [] + for path in paths: + if isinstance(path, (list, tuple)): + flattened_paths.extend(path) else: - raise ValueError(f"Unknown test type {k['classname']}.") + flattened_paths.append(path) - integration_tests = sorted(integration_tests, key=lambda x: -x[-1]) - unit_tests = sorted(unit_tests, key=lambda x: -x[-1]) + junit_paths, coverage_path = _split_xml_paths(flattened_paths) + reports = [_parse_junit_report(path) for path in junit_paths] + coverage_root = _xml_root(coverage_path) - text = "# :blue_heart: Pytest summary\n" + total_number_of_tests = sum(report.tests for report in reports) + testing_time = sum(report.time for report in reports) + failed_cases = [ + testcase + for report in reports + for testcase in report.cases + if testcase.status in {"failed", "error"} + ] - text += f"\n### {total_number_of_tests} tests took {int(float(testing_time))}s.\n" + text = "# Pytest summary\n" - text += "\n## :umbrella: Coverage \n\n" - text += f'\n - by line rate **{int(float(coverage_summary["coverage"]["line-rate"]) * 100)}%**' text += ( - f'\n - by branch rate **{int(float(coverage_summary["coverage"]["branch-rate"]) * 100)}%**' + f"\n### {_format_test_count(total_number_of_tests)} took {int(testing_time)}s " + f"across {len(reports)} workflow report(s).\n" ) - text += "\n\n## :bullettrain_side: Integration tests\n\n" - text += collapsable( - "\n > only showing the top 50 slowest tests\n\n" - + create_md_table(integration_tests[:50], header=["Test Path", "Name", "Time (s)"]), - f"{len(integration_tests)} integration tests took " - f"{int(sum((k[-1] for k in integration_tests)))}s.", - ) + text += "\n## Coverage\n\n" + text += f'\n - by line rate **{int(float(coverage_root.get("line-rate", 0.0)) * 100)}%**' + text += f'\n - by branch rate **{int(float(coverage_root.get("branch-rate", 0.0)) * 100)}%**' - text += "\n\n## :speedboat: Unit tests\n\n" - text += collapsable( - "\n > only showing the top 50 slowest tests\n\n" - + create_md_table(unit_tests[:50], header=["Test Path", "Name", "Time (s)"]), - f"{len(unit_tests)} unit tests took {int(sum((k[-1] for k in unit_tests)))}s.", + text += "\n\n## Workflow Groups\n\n" + text += create_md_table( + _overview_rows(reports), + header=["Group", "Tests", "Passed", "Skipped", "Failures", "Errors", "Time (s)"], ) - text += "\n\n" - if failed: - text += "\n\n## :worried: Failed tests\n\n" - text += f"\n{len(failed)} test(s) failed.\n\n" - text += create_md_table(failed, header=["Test Path", "Name", "Time (s)"]) + for report in reports: + slowest_cases = sorted(report.cases, key=lambda testcase: -testcase.time)[:MAX_SLOW_TESTS] + text += f"\n\n## {report.group}\n\n" + text += collapsible( + f"\n > only showing the top {MAX_SLOW_TESTS} slowest tests\n\n" + + create_md_table( + _case_rows(slowest_cases), + header=["Group", "Test Path", "Name", "Status", "Time (s)"], + ), + _report_summary(report), + ) + + if failed_cases: + text += "\n\n## Failed Tests\n\n" + text += f"\n{_format_test_count(len(failed_cases))} failed or errored.\n\n" + text += create_md_table( + _case_rows(failed_cases), + header=["Group", "Test Path", "Name", "Status", "Time (s)"], + ) return text if __name__ == "__main__": try: - print(generate_md_summary(sys.argv[1], sys.argv[2])) - except: # pylint: disable=bare-except - print("Could not generate the summary :sob:") + print(generate_md_summary(*sys.argv[1:])) + except Exception as error: # pylint: disable=broad-except + print(f"Could not generate the summary: {error}") diff --git a/.gitignore b/.gitignore index 6fb2b5617..70ffdfb07 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,6 @@ venv.bak/ # best editor ever files *.swp +# pixi environments +.pixi/* +!.pixi/config.toml diff --git a/.gitlab/.gitlab-ci.yml b/.gitlab/.gitlab-ci.yml index 7c73eae49..e3459a070 100644 --- a/.gitlab/.gitlab-ci.yml +++ b/.gitlab/.gitlab-ci.yml @@ -2,27 +2,35 @@ --- #--------------------------------------------------------------------------------------------------- variables: + GIT_STRATEGY: clone + GIT_CHECKOUT: "true" + GIT_CLEAN_FLAGS: -ffdx LNM_TESTS: value: "1" description: "Run cluster tests at LNM" IMCS_TESTS: value: "1" description: "Run cluster tests at IMCS" + BUILD_4C: + value: "1" + description: "Build 4C in CI. Set to 0 to check for an existing remote 4C executable" + REMOTE_BUILD_DIR: + value: "/home/queens/builds/queens-$CI_PIPELINE_ID" LNM_REMOTE_PYTHON: - value: "/home/queens/miniforge3/envs/queens-$CI_PIPELINE_ID/bin/python" + value: "$REMOTE_BUILD_DIR/.pixi/envs/dev/bin/python" description: "Python path on LNM clusters" LNM_REMOTE_ADDRESS: value: "thought" description: "Hostname of LNM cluster" IMCS_REMOTE_PYTHON: - value: "/home/queens/miniforge3/envs/queens-$CI_PIPELINE_ID/bin/python" + value: "$REMOTE_BUILD_DIR/.pixi/envs/dev/bin/python" description: "Python path on IMCS clusters" IMCS_REMOTE_ADDRESS: value: "charon.bauv.unibw-muenchen.de" description: "Hostname of IMCS cluster" - PYTHON_PACKAGE_MANAGER: - value: "mamba" - description: "Python package manager to create the python environments" + PIXI_ENVIRONMENT: + value: "dev" + description: "Pixi workspace environment used in CI jobs" #--------------------------------------------------------------------------------------------------- # Define stages #--------------------------------------------------------------------------------------------------- @@ -42,62 +50,70 @@ workflow: #--------------------------------------------------------------------------------------------------- # Define platform specific settings #--------------------------------------------------------------------------------------------------- -.ubuntu_settings: +.check_pixi_available: before_script: - - $PYTHON_PACKAGE_MANAGER activate queens-$CI_PIPELINE_ID - # This ensures that the correct queens source is used - - pip install -e .[develop] - - echo Queens source for testing is $(pip list | grep -o '/.*') + - | + export PIXI_VERSION="$(tr -d '[:space:]' < .pixi-version)" + export PATH="$HOME/.pixi/bin:$PATH" + if ! command -v pixi >/dev/null 2>&1; then + curl -fsSL https://pixi.sh/install.sh | PIXI_VERSION="$PIXI_VERSION" PIXI_HOME="$HOME/.pixi" bash + fi + pixi --version #--------------------------------------------------------------------------------------------------- # Jobs of stage: build #--------------------------------------------------------------------------------------------------- -.build_conda_env: +.build_pixi_env: + extends: + - .check_pixi_available stage: build - before_script: - - 'echo "Using python environment manager: `$PYTHON_PACKAGE_MANAGER --version`"' script: - - $PYTHON_PACKAGE_MANAGER env create -f environment.yml -n queens-$CI_PIPELINE_ID - - $PYTHON_PACKAGE_MANAGER activate queens-$CI_PIPELINE_ID - - pip install -e .[develop] - - $PYTHON_PACKAGE_MANAGER env export > pipeline_conda_environment.yml + - pixi install --locked -e "$PIXI_ENVIRONMENT" + - pixi run --locked -e "$PIXI_ENVIRONMENT" install-editable + - pixi list --locked -e "$PIXI_ENVIRONMENT" > pipeline_pixi_environment.txt artifacts: - name: "conda_env-$CI_PIPELINE_ID.yml" + name: "pixi_env-$CI_PIPELINE_ID.txt" paths: - - pipeline_conda_environment.yml + - pipeline_pixi_environment.txt when: always expire_in: 4 weeks -lnm-build_conda_env: +lnm-build_pixi_env: extends: - - .build_conda_env + - .build_pixi_env tags: - lnm-build rules: - if: $LNM_TESTS == "1" -imcs-build_conda_env: +imcs-build_pixi_env: extends: - - .build_conda_env + - .build_pixi_env tags: - imcs-build rules: - if: $IMCS_TESTS == "1" #---------------------------------------------------------------------------------------------- -.build_conda_env_cluster: +.build_pixi_env_cluster: stage: build script: - - ENV_PREFIX=queens-$CI_PIPELINE_ID - - $PYTHON_PACKAGE_MANAGER create -y --prefix ./$ENV_PREFIX python=3.11 cloudpickle fabric - - $PYTHON_PACKAGE_MANAGER activate ./$ENV_PREFIX - - pip install -e . --no-dependencies - - python src/queens/utils/remote_build.py - --host=$REMOTE_ADDRESS --user=queens --remote-python=$REMOTE_PYTHON - --remote-queens-repository=/home/queens/builds/queens-$CI_PIPELINE_ID --package-manager - $PYTHON_PACKAGE_MANAGER + - export PIXI_VERSION="$(tr -d '[:space:]' < .pixi-version)" + - | + ssh queens@$REMOTE_ADDRESS "bash -lc ' + export PATH=\"\$HOME/.pixi/bin:\$PATH\" + if ! command -v pixi >/dev/null 2>&1; then + curl -fsSL https://pixi.sh/install.sh | PIXI_VERSION=\"$PIXI_VERSION\" PIXI_HOME=\"\$HOME/.pixi\" bash + fi + pixi --version + '" + - pixi run --locked -e "$PIXI_ENVIRONMENT" install-editable + - pixi run --locked -e "$PIXI_ENVIRONMENT" python src/queens/utils/remote_build.py + --host=$REMOTE_ADDRESS --user=queens + --remote-queens-repository=$REMOTE_BUILD_DIR + --pixi-environment=$PIXI_ENVIRONMENT -thought-build_conda_env: +thought-build_pixi_env: extends: - - .build_conda_env_cluster + - .build_pixi_env_cluster variables: REMOTE_ADDRESS: $LNM_REMOTE_ADDRESS REMOTE_PYTHON: $LNM_REMOTE_PYTHON @@ -106,9 +122,9 @@ thought-build_conda_env: rules: - if: $LNM_TESTS == "1" -charon-build_conda_env: +charon-build_pixi_env: extends: - - .build_conda_env_cluster + - .build_pixi_env_cluster variables: REMOTE_ADDRESS: $IMCS_REMOTE_ADDRESS REMOTE_PYTHON: $IMCS_REMOTE_PYTHON @@ -154,7 +170,7 @@ thought-build_4C: tags: - lnm-build rules: - - if: $LNM_TESTS == "1" + - if: '$LNM_TESTS == "1" && $BUILD_4C == "1"' charon-build_4C: extends: @@ -169,21 +185,55 @@ charon-build_4C: tags: - imcs-build rules: - - if: $IMCS_TESTS == "1" + - if: '$IMCS_TESTS == "1" && $BUILD_4C == "1"' + +.check_4C: + stage: build + script: + - | + ssh "queens@$REMOTE_ADDRESS" \ + "bash -lc 'if test -f ~/workspace/fourc_build/4C; then \ + ls -l ~/workspace/fourc_build/4C; \ + else \ + echo Missing required 4C executable: ~/workspace/fourc_build/4C >&2; \ + echo Set BUILD_4C to 1 to build it automatically. >&2; \ + exit 1; \ + fi'" + +thought-check_4C: + extends: + - .check_4C + variables: + REMOTE_ADDRESS: $LNM_REMOTE_ADDRESS + tags: + - lnm-build + rules: + - if: '$LNM_TESTS == "1" && $BUILD_4C == "0"' + +charon-check_4C: + extends: + - .check_4C + variables: + REMOTE_ADDRESS: $IMCS_REMOTE_ADDRESS + tags: + - imcs-build + rules: + - if: '$IMCS_TESTS == "1" && $BUILD_4C == "0"' #--------------------------------------------------------------------------------------------------- # Cluster tests #--------------------------------------------------------------------------------------------------- .cluster_tests: extends: - - .ubuntu_settings + - .check_pixi_available stage: tests script: - - pytest tests/integration_tests/cluster/ + - pixi run --locked -e "$PIXI_ENVIRONMENT" install-editable + - pixi run --locked -e "$PIXI_ENVIRONMENT" pytest tests/integration_tests/cluster/ -v -m $CLUSTER_MARKER --no-cov -o log_cli=true --log-cli-level=DEBUG --remote-user=queens --remote-python=$REMOTE_PYTHON - --remote-queens-repository=/home/queens/builds/queens-$CI_PIPELINE_ID + --remote-queens-repository=$REMOTE_BUILD_DIR --color=yes --pipeline-id=$CI_PIPELINE_ID --junitxml=test_junit.xml @@ -203,9 +253,12 @@ lnm-cluster_tests: CLUSTER_MARKER: "lnm_cluster" REMOTE_PYTHON: $LNM_REMOTE_PYTHON needs: - - lnm-build_conda_env - - thought-build_conda_env - - thought-build_4C + - job: lnm-build_pixi_env + - job: thought-build_pixi_env + - job: thought-build_4C + optional: true + - job: thought-check_4C + optional: true tags: - lnm-ubuntu rules: @@ -218,9 +271,12 @@ imcs-cluster_tests: CLUSTER_MARKER: "imcs_cluster" REMOTE_PYTHON: $IMCS_REMOTE_PYTHON needs: - - imcs-build_conda_env - - charon-build_conda_env - - charon-build_4C + - job: imcs-build_pixi_env + - job: charon-build_pixi_env + - job: charon-build_4C + optional: true + - job: charon-check_4C + optional: true tags: - imcs-ubuntu rules: @@ -229,63 +285,42 @@ imcs-cluster_tests: #--------------------------------------------------------------------------------------------------- # Jobs of stage: cleanup #--------------------------------------------------------------------------------------------------- -# Remove conda env on ubuntu runners -.remove_conda_env: +# Remove pixi environment and repository on cluster +.remove_build_dir_cluster: stage: cleanup script: - - $PYTHON_PACKAGE_MANAGER env remove -n queens-$CI_PIPELINE_ID + - ssh queens@$REMOTE_ADDRESS "rm -rf $REMOTE_BUILD_DIR;" when: always - variables: - GIT_STRATEGY: none - -lnm-remove_conda_env: - extends: - - .remove_conda_env - dependencies: - - lnm-build_conda_env - tags: - - lnm-build - rules: - - if: $LNM_TESTS == "1" -imcs-remove_conda_env: +thought-cluster-remove_build_dir: extends: - - .remove_conda_env + - .remove_build_dir_cluster dependencies: - - imcs-build_conda_env - tags: - - imcs-build - rules: - - if: $IMCS_TESTS == "1" - -#--------------------------------------------------------------------------------------------------- -# Remove conda env and repository on cluster -.remove_conda_env_cluster: - stage: cleanup - script: - - ssh queens@$REMOTE_ADDRESS "$PYTHON_PACKAGE_MANAGER env remove -n queens-$CI_PIPELINE_ID; - rm -rf /home/queens/builds/queens-$CI_PIPELINE_ID" - when: always - -thought-cluster-remove_conda_env: - extends: - - .remove_conda_env_cluster - dependencies: - - thought-build_conda_env + - thought-build_pixi_env variables: REMOTE_ADDRESS: $LNM_REMOTE_ADDRESS + needs: + - job: thought-build_pixi_env + - job: lnm-cluster_tests + optional: true + artifacts: false tags: - lnm-build rules: - if: $LNM_TESTS == "1" -charon-cluster-remove_conda_env: +charon-cluster-remove_build_dir: extends: - - .remove_conda_env_cluster + - .remove_build_dir_cluster dependencies: - - charon-build_conda_env + - charon-build_pixi_env variables: REMOTE_ADDRESS: $IMCS_REMOTE_ADDRESS + needs: + - job: charon-build_pixi_env + - job: imcs-cluster_tests + optional: true + artifacts: false tags: - imcs-build rules: diff --git a/.pixi-version b/.pixi-version new file mode 100644 index 000000000..161052e0a --- /dev/null +++ b/.pixi-version @@ -0,0 +1 @@ +v0.68.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 44d4d0ff7..4858588e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,5 @@ default_stages: [pre-commit, pre-merge-commit, pre-push, manual] repos: - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.2 # Ruff version - hooks: - # Run the linter. - # Needs to placed before black, isort, and other formatters - - id: ruff - types_or: [ python, pyi ] - args: [--fix] - repo: local hooks: - id: trailing-whitespace @@ -32,6 +24,20 @@ repos: language: python types: ["python"] pass_filenames: true + - id: check-pyproject-dependency-integrity + name: check pyproject dependency integrity + entry: > + python3 tools/dependencies/check_pyproject_dependency_integrity.py + --allow-version-mismatch gpflow + --path + language: system + files: '^pyproject\.toml$' + pass_filenames: true + - id: ruff-check + name: ruff check + entry: ruff check --fix --force-exclude + language: system + types_or: [ python, pyi, jupyter, pyproject ] - id: docformatter name: docformatter entry: docformatter @@ -64,9 +70,6 @@ repos: name: yamllint entry: yamllint args: - - > # This is needed to lint the jinja templates - -d={extends: default, rules: {braces: {max-spaces-inside: 1} - , brackets: disable, document-start: disable, "line-length": {"max": 100}}} - -f=colored language: python types: ["yaml"] @@ -100,12 +103,11 @@ repos: ^(.gitlab|.github|config|doc|tests|test_utils)/| ^src/(example_simulator_functions|queens_interfaces)/| ^src/queens/(data_processors|drivers|iterators|models)/| - ^src/queens/(schedulers|stochastic_optimizers|variational_distributions|visualization)/| + ^src/queens/(schedulers|stochastic_optimizers|visualization)/| ^src/queens/(main.py|global_settings.py) ).*$ - - repo: https://github.com/kynan/nbstripout - rev: 0.8.1 - hooks: - id: nbstripout name: Strip outputs from Jupyter notebooks + entry: nbstripout + language: system files: \.ipynb$ diff --git a/.pylintrc b/.pylintrc index 66ae321f7..37fbe62e7 100644 --- a/.pylintrc +++ b/.pylintrc @@ -39,7 +39,7 @@ extension-pkg-whitelist= fail-on= # Specify a score threshold under which the program will exit with error. -fail-under=10 +fail-under=10.0 # Interpret the stdin as a python script, whose filename needs to be passed as # the module_or_package argument. @@ -59,10 +59,11 @@ ignore-paths=tutorials # Emacs file locks ignore-patterns=^\.# -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. +# List of module names for which member attributes should not be checked and +# will not be imported (useful for modules/projects where namespaces are +# manipulated during runtime and thus existing member attributes cannot be +# deduced by static analysis). It supports qualified module names, as well as +# Unix pattern matching. ignored-modules=vtk, particles, @@ -88,6 +89,10 @@ load-plugins= # Pickle collected data for later comparisons. persistent=yes +# Resolve imports to .pyi stubs if available. May reduce no-member messages and +# increase not-an-iterable messages. +prefer-stubs=no + # Minimum Python version to use for version dependent checks. Will default to # the version used to run pylint. py-version=3.10 @@ -101,10 +106,6 @@ recursive=no # source root. source-roots= -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no @@ -231,6 +232,11 @@ name-group= # not require a docstring. no-docstring-rgx=^_ +# Regular expression matching correct parameter specification variable names. +# If left empty, parameter specification variable names will be checked with +# the set naming style. +#paramspec-rgx= + # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. # These decorators are taken in consideration only for invalid-name. @@ -244,6 +250,10 @@ property-classes=abc.abstractproperty # variable names will be checked with the set naming style. #typevar-rgx= +# Regular expression matching correct type variable tuple names. If left empty, +# type variable tuple names will be checked with the set naming style. +#typevartuple-rgx= + # Naming style matching correct variable names. variable-naming-style=snake_case @@ -304,6 +314,9 @@ max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 +# Maximum number of positional arguments for function / method. +max-positional-arguments=5 + # Maximum number of public methods for a class (see R0904). max-public-methods=20 @@ -338,7 +351,9 @@ indent-after-paren=4 # tab). indent-string=' ' -# Maximum number of characters on a single line. +# Maximum number of characters on a single line. Pylint's default of 100 is +# based on PEP 8's guidance that teams may choose line lengths up to 99 +# characters. max-line-length=100 # Maximum number of lines in a module. @@ -433,7 +448,17 @@ disable=raw-checker-failed, use-symbolic-message-instead, use-implicit-booleaness-not-comparison-to-string, use-implicit-booleaness-not-comparison-to-zero, - design, + too-many-ancestors, + too-many-instance-attributes, + too-few-public-methods, + too-many-public-methods, + too-many-return-statements, + too-many-branches, + too-many-arguments, + too-many-locals, + too-many-statements, + too-many-boolean-expressions, + too-many-positional-arguments # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -451,6 +476,9 @@ timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests. [MISCELLANEOUS] +# Whether or not to search for fixme's in docstrings. +check-fixme-in-docstring=no + # List of note tags to take in consideration, separated by a comma. notes=FIXME, XXX, @@ -471,6 +499,11 @@ max-nested-blocks=5 # printed. never-returning-functions=sys.exit,argparse.parse_error +# Let 'consider-using-join' be raised when the separator to join on would be +# non-empty (resulting in expected fixes of the type: ``"- " + " - +# ".join(items)``) +suggest-join-with-non-empty-separator=yes + [REPORTS] @@ -485,10 +518,10 @@ evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor # used to format the message information. See doc for all details. msg-template= -# Set the output format. Available formats are: text, parseable, colorized, -# json2 (improved json format), json (old json format) and msvs (visual -# studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. +# Set the output format. Available formats are: 'text', 'parseable', +# 'colorized', 'json2' (improved json format), 'json' (old json format), msvs +# (visual studio) and 'github' (GitHub actions). You can also give a reporter +# class, e.g. mypackage.mymodule.MyReporterClass. #output-format= # Tells whether to display a full report or only the messages. @@ -595,7 +628,7 @@ ignored-classes=optparse.Values, # of finding the hint is based on edit distance. missing-member-hint=yes -# The minimum edit distance a name should have in order to be considered a +# The maximum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 diff --git a/.yamllint b/.yamllint new file mode 100644 index 000000000..a0a0f0019 --- /dev/null +++ b/.yamllint @@ -0,0 +1,15 @@ +--- +extends: default + +ignore: | + .pixi/ + .venv/ + +rules: + # Allow single spaces inside braces for Jinja templates. + braces: + max-spaces-inside: 1 + brackets: disable + document-start: disable + line-length: + max: 100 diff --git a/CITATION.cff b/CITATION.cff index 32d4cf1d2..1abb75926 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -24,6 +24,7 @@ preferred-citation: orcid: "https://orcid.org/0009-0003-2908-2951" - given-names: "Volker" family-names: "Gravemeier" + orcid: "https://orcid.org/0000-0003-0073-3290" - given-names: "Lea J." family-names: "Haeusel" orcid: "https://orcid.org/0009-0007-2462-3033" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2c70452dc..62fa01b87 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,14 +45,12 @@ have to solve them yourself. ### :fishing_pole_and_fish: Pull requests #### 1. Install QUEENS in developer mode -Install QUEENS as described in the [README.md](README.md) and run: +Install QUEENS as described in the [README.md](https://github.com/queens-py/queens/blob/main/README.md). +For contributions, use the Pixi development environment and expose your local clone inside it: -``` -pip install -e .[develop] -``` -or to do a safe develop install use: -``` -pip install -e .[safe_develop] +```bash +pixi install --environment dev +pixi run -e dev install-editable ``` @@ -82,6 +80,53 @@ Like every codebase, QUEENS follows some project-specific coding conventions. Be - If relative paths within the QUEENS source are needed, use the [relative_path_from_queens_source](src/queens/utils/path.py#L24) function. - Decorate the init method of QUEENS objects with the `log_init_args` decorator from [src/queens/utils/logger_settings.py](src/queens/utils/logger_settings.py#L248). This automatically logs the arguments passed to the init. - We only allow disabling pylint warnings for specific lines, not for entire files. If you disable warnings, please use the long pylint description, not just the code. + +##### Changing dependencies +QUEENS declares dependencies in `pyproject.toml` and locks the Pixi environments in `pixi.lock`. +For a short overview of the available environments, see the +[requirements FAQ](doc/source/faqs/requirements.md). This section describes how to add, remove, or +update dependencies. + +When changing dependencies, keep the PEP-style dependency declarations and the Pixi declarations in +sync: +- Runtime dependencies belong in `[project].dependencies` and the matching + `[tool.pixi.feature.base]` dependency section. +- Optional runtime dependencies belong in `[project.optional-dependencies]` and a matching + `[tool.pixi.feature.]` section. +- Development-only tools belong in `[dependency-groups].dev` and the matching + `[tool.pixi.feature.dev]` dependency section. +- In Pixi sections, use `dependencies` for Conda packages and `pypi-dependencies` for packages that + must be installed from PyPI or a Git source. +- Do not add test, linting, formatting, documentation, or release tooling to the base runtime + dependencies unless it is actually needed by QUEENS at runtime. + +After editing `pyproject.toml`, run the dependency integrity check. The same check is installed as a +pre-commit hook and also runs in CI: +```bash +pixi run -e dev pre-commit run check-pyproject-dependency-integrity --files pyproject.toml +``` + +If dependency declarations changed, refresh the lockfile and commit it together with +`pyproject.toml`: +```bash +pixi lock +git add pyproject.toml pixi.lock +``` + +The CI pipeline checks this as well: if dependency-relevant sections in `pyproject.toml` changed and +`pixi lock --check --dry-run` would update `pixi.lock`, the code quality job fails. Before opening +or updating a pull request, it is useful to verify the lockfile locally: +```bash +pixi lock --check --dry-run +``` + +Finally, reinstall or update the affected Pixi environment and run a focused test or smoke check: +```bash +pixi install --environment dev +pixi run -e dev install-editable +pixi run -e dev pytest +``` + ##### Commit messages Please provide meaningful commit messages based on the [Conventional Commits guidelines](https://www.conventionalcommits.org/en/v1.0.0/). diff --git a/README.md b/README.md index 789777edb..c17508927 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@
-[![tests-local-main](https://github.com/queens-py/queens/actions/workflows/tests_local.yml/badge.svg?branch=main)](https://github.com/queens-py/queens/actions/workflows/tests_local.yml?query=branch:main) +[![tests-local-main](https://github.com/queens-py/queens/actions/workflows/local_testsuite.yml/badge.svg?branch=main)](https://github.com/queens-py/queens/actions/workflows/local_testsuite.yml?query=branch:main) [![build-documentation-main](https://github.com/queens-py/queens/actions/workflows/build_documentation.yml/badge.svg?branch=main)](https://github.com/queens-py/queens/actions/workflows/build_documentation.yml?query=branch:main)
@@ -51,22 +51,49 @@ QUEENS (**Q**uantification of **U**ncertain **E**ffects in **En**gineering **S** ## :rocket: Getting started ->**Prerequisites**: Unix system and environment management system (we recommend [miniforge](https://conda-forge.org/download/)) +>**Prerequisites**: Python 3.12 or newer. For development, use [Pixi](https://pixi.sh/latest/). - +### Easy installation -Clone the QUEENS repository to your local machine. Navigate to its base directory, then: +Clone the QUEENS repository and install it from the source checkout with: ```bash -conda env create -conda activate queens -pip install -e . +pip install . ``` +We recommend using some form of environment management instead of installing into your system Python. +For more details, see [the QUEENS documentation](https://queens-py.github.io/queens/introduction.html#installation). -**Note**: This installs QUEENS without any fixed dependency versions. In most cases this is no problem and gives you more freedom to install additional packages within your environment. Should there be a problem you can play it safe with fixed versions via +Optional runtime extras can be installed with: ```bash -pip install -e .[safe] +pip install ".[tutorials]" +pip install ".[fourc]" +pip install ".[all]" ``` +### Recommended installation +We recommend a modern project-based workflow based on [Pixi](https://pixi.sh/latest/) especially for development. +After cloning the repository, installing with Pixi is as easy as: +```bash +pixi install +pixi run install-editable +``` +The default Pixi environment contains the core QUEENS dependencies. Use `all` for runtime +extras without development tools. For named Pixi environments, run +`pixi run -e install-editable` once for each environment you want to use. + +### Development installation +For development, we recommend using [Pixi](https://pixi.sh/latest/) together with the `dev` environment. +`dev` contains the full contributor setup, including development tools, tutorials, and the +4C interface dependencies. +Clone the repository and install with: +```bash +pixi install --environment dev +pixi run -e dev install-editable +``` +Useful development commands then look like: +```bash +pixi run -e dev pytest +pixi run -e dev pre-commit run --all-files +``` ## :crown: Workflow example diff --git a/dev-requirements.in b/dev-requirements.in deleted file mode 100644 index 014cafade..000000000 --- a/dev-requirements.in +++ /dev/null @@ -1,26 +0,0 @@ -# This file contains all the requirements for QUEENS (production runs). - -# Do not fix the version of a package if not strictly necessary. We use pip-tools in order to create a requirements.txt file where the version of the different packages are fixed to the latest stable version w.r.t. QUEENS. From time to time pip-tools is used to upgrade to the newer available versions. - -# Development -pylint>=2.16 -pylint-exit -isort>=5.0 -pre-commit -pre-commit-hooks>=4.4.0 -liccheck -licenseheaders -sphinx -nbsphinx -pydata-sphinx-theme -pandoc -pip-tools -commitizen>=3.12.0 -docformatter>=1.5.1 -yamllint>=1.19.0 -ruff -nbstripout -myst-parser -testbook -ipykernel -mypy diff --git a/dev-requirements.txt b/dev-requirements.txt deleted file mode 100644 index e95ba2c2c..000000000 --- a/dev-requirements.txt +++ /dev/null @@ -1,380 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --constraint=requirements.txt --output-file=dev-requirements.txt dev-requirements.in -# -accessible-pygments==0.0.5 - # via pydata-sphinx-theme -alabaster==1.0.0 - # via sphinx -argcomplete==3.5.1 - # via commitizen -astroid==3.3.5 - # via pylint -asttokens==3.0.0 - # via stack-data -attrs==24.2.0 - # via - # jsonschema - # referencing -babel==2.16.0 - # via - # pydata-sphinx-theme - # sphinx -beautifulsoup4==4.12.3 - # via - # nbconvert - # pydata-sphinx-theme -bleach==6.1.0 - # via nbconvert -build==1.2.2.post1 - # via pip-tools -certifi==2024.8.30 - # via - # -c requirements.txt - # requests -cfgv==3.4.0 - # via pre-commit -charset-normalizer==3.4.0 - # via - # -c requirements.txt - # commitizen - # docformatter - # requests -click==8.1.7 - # via - # -c requirements.txt - # pip-tools -colorama==0.4.6 - # via commitizen -comm==0.2.3 - # via ipykernel -commitizen==3.30.0 - # via -r dev-requirements.in -debugpy==1.8.16 - # via ipykernel -decli==0.6.2 - # via commitizen -decorator==5.1.1 - # via - # -c requirements.txt - # ipython -defusedxml==0.7.1 - # via nbconvert -dill==0.3.9 - # via - # -c requirements.txt - # pylint -distlib==0.3.9 - # via virtualenv -docformatter==1.7.5 - # via -r dev-requirements.in -docutils==0.21.2 - # via - # myst-parser - # nbsphinx - # pydata-sphinx-theme - # sphinx -executing==2.2.0 - # via stack-data -fastjsonschema==2.20.0 - # via nbformat -filelock==3.16.1 - # via - # -c requirements.txt - # virtualenv -identify==2.6.1 - # via pre-commit -idna==3.10 - # via - # -c requirements.txt - # requests -imagesize==1.4.1 - # via sphinx -ipykernel==6.30.1 - # via -r dev-requirements.in -ipython==8.18.0 - # via ipykernel -isort==5.13.2 - # via - # -r dev-requirements.in - # pylint -jedi==0.19.2 - # via ipython -jinja2==3.1.4 - # via - # -c requirements.txt - # commitizen - # myst-parser - # nbconvert - # nbsphinx - # sphinx -jsonschema==4.23.0 - # via nbformat -jsonschema-specifications==2024.10.1 - # via jsonschema -jupyter-client==8.6.3 - # via - # ipykernel - # nbclient -jupyter-core==5.7.2 - # via - # ipykernel - # jupyter-client - # nbclient - # nbconvert - # nbformat -jupyterlab-pygments==0.3.0 - # via nbconvert -liccheck==0.9.2 - # via -r dev-requirements.in -licenseheaders==0.8.8 - # via -r dev-requirements.in -markdown-it-py==3.0.0 - # via - # -c requirements.txt - # mdit-py-plugins - # myst-parser -markupsafe==3.0.2 - # via - # -c requirements.txt - # jinja2 - # nbconvert -matplotlib-inline==0.1.7 - # via - # ipykernel - # ipython -mccabe==0.7.0 - # via pylint -mdit-py-plugins==0.4.2 - # via myst-parser -mdurl==0.1.2 - # via - # -c requirements.txt - # markdown-it-py -mistune==3.0.2 - # via nbconvert -mypy==1.18.2 - # via -r dev-requirements.in -mypy-extensions==1.0.0 - # via - # -c requirements.txt - # mypy -myst-parser==4.0.0 - # via -r dev-requirements.in -nbclient==0.10.0 - # via - # nbconvert - # testbook -nbconvert==7.16.4 - # via nbsphinx -nbformat==5.10.4 - # via - # nbclient - # nbconvert - # nbsphinx - # nbstripout - # testbook -nbsphinx==0.9.5 - # via -r dev-requirements.in -nbstripout==0.8.1 - # via -r dev-requirements.in -nest-asyncio==1.6.0 - # via ipykernel -nodeenv==1.9.1 - # via pre-commit -packaging==24.1 - # via - # -c requirements.txt - # build - # commitizen - # ipykernel - # nbconvert - # sphinx -pandoc==2.4 - # via -r dev-requirements.in -pandocfilters==1.5.1 - # via nbconvert -parso==0.8.4 - # via jedi -pathspec==0.12.1 - # via - # -c requirements.txt - # mypy - # yamllint -pexpect==4.9.0 - # via ipython -pip-tools==7.4.1 - # via -r dev-requirements.in -platformdirs==4.3.6 - # via - # -c requirements.txt - # jupyter-core - # pylint - # virtualenv -plumbum==1.9.0 - # via pandoc -ply==3.11 - # via pandoc -pre-commit==4.0.1 - # via -r dev-requirements.in -pre-commit-hooks==5.0.0 - # via -r dev-requirements.in -prompt-toolkit==3.0.36 - # via - # ipython - # questionary -psutil==6.1.0 - # via - # -c requirements.txt - # ipykernel -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.3 - # via stack-data -pydata-sphinx-theme==0.16.0 - # via -r dev-requirements.in -pygments==2.18.0 - # via - # -c requirements.txt - # accessible-pygments - # ipython - # nbconvert - # pydata-sphinx-theme - # sphinx -pylint==3.3.1 - # via -r dev-requirements.in -pylint-exit==1.2.0 - # via -r dev-requirements.in -pyproject-hooks==1.2.0 - # via - # build - # pip-tools -python-dateutil==2.9.0.post0 - # via - # -c requirements.txt - # jupyter-client -pyyaml==6.0.2 - # via - # -c requirements.txt - # commitizen - # myst-parser - # pre-commit - # yamllint -pyzmq==26.2.0 - # via - # ipykernel - # jupyter-client -questionary==2.0.1 - # via commitizen -referencing==0.35.1 - # via - # jsonschema - # jsonschema-specifications -regex==2024.11.6 - # via licenseheaders -requests==2.32.3 - # via - # -c requirements.txt - # sphinx -rpds-py==0.20.0 - # via - # jsonschema - # referencing -ruamel-yaml==0.18.6 - # via pre-commit-hooks -ruamel-yaml-clib==0.2.12 - # via ruamel-yaml -ruff==0.9.2 - # via -r dev-requirements.in -semantic-version==2.10.0 - # via liccheck -six==1.16.0 - # via - # -c requirements.txt - # bleach - # python-dateutil -snowballstemmer==2.2.0 - # via sphinx -soupsieve==2.6 - # via beautifulsoup4 -sphinx==8.1.3 - # via - # -r dev-requirements.in - # myst-parser - # nbsphinx - # pydata-sphinx-theme -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -stack-data==0.6.3 - # via ipython -termcolor==2.5.0 - # via - # -c requirements.txt - # commitizen -testbook==0.4.2 - # via -r dev-requirements.in -tinycss2==1.4.0 - # via nbconvert -toml==0.10.2 - # via liccheck -tomlkit==0.13.2 - # via - # commitizen - # pylint -tornado==6.4.1 - # via - # -c requirements.txt - # ipykernel - # jupyter-client -traitlets==5.14.3 - # via - # ipykernel - # ipython - # jupyter-client - # jupyter-core - # matplotlib-inline - # nbclient - # nbconvert - # nbformat - # nbsphinx -typing-extensions==4.12.2 - # via - # -c requirements.txt - # mypy - # pydata-sphinx-theme -untokenize==0.1.1 - # via docformatter -urllib3==2.2.3 - # via - # -c requirements.txt - # requests -virtualenv==20.27.1 - # via pre-commit -wcwidth==0.2.13 - # via prompt-toolkit -webencodings==0.5.1 - # via - # bleach - # tinycss2 -wheel==0.44.0 - # via - # -c requirements.txt - # pip-tools -yamllint==1.35.1 - # via -r dev-requirements.in - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/doc/README.md b/doc/README.md index 56089b1ac..b1bb68260 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,31 +1,35 @@ # :book: HTML documentation -We use [Sphinx](https://www.sphinx-doc.org/en/master/#) to generate the [QUEENS documentation](https://queens-py.github.io/queens). It automatically builds the html documentation from the docstrings. +We use [Sphinx](https://www.sphinx-doc.org/en/master/#) to generate the [QUEENS documentation](https://queens-py.github.io/queens). +It automatically builds the html documentation from the docstrings. We believe that documentation is essential and therefore welcome any improvements :blush: ## :woman_teacher: Build the documentation -To build the documentation, you first need to set up a QUEENS environment as described in the [README.md](../README.md). -In this Python environment, you also need to install packages for QUEENS development and tutorials and register the environment as a Jupyter kernel: +To build the documentation, first set up the QUEENS development environment as described in the +[README](../README.md). + +Next, register the environment as a Jupyter kernel such that the tutorial notbooks can be run while +building the documentation: ```bash -pip install -e .[safe_develop,tutorial] -python -m ipykernel install --user --name queens --display-name "Python (queens)" +pixi run -e dev python -m ipykernel install --user --name queens --display-name "Python (queens)" ``` -When building the documentation on your machine for the first time or after adding new modules or classes to QUEENS, one needs to first rebuild the `autodoc index` by running: +When building the documentation on your machine for the first time or after adding new modules or +classes to QUEENS, one needs to first rebuild the `autodoc index` by running: ```bash -cd -sphinx-apidoc -o doc/source src/ -fMT +cd +pixi run -e dev sphinx-apidoc -o doc/source src/ -fMT ``` To actually build the html-documentation, navigate into the doc folder and run the make command: ```bash cd doc -sphinx-build -b html -d build/doctrees source build/html -W +pixi run -e dev sphinx-build -b html -d build/doctrees source build/html -W ``` You can now view the documentation in your favorite browser by opening `build/html/index.html`. diff --git a/doc/source/_ext/create_documentation_files.py b/doc/source/_ext/create_documentation_files.py index 667e82820..8f2280d3f 100644 --- a/doc/source/_ext/create_documentation_files.py +++ b/doc/source/_ext/create_documentation_files.py @@ -24,7 +24,7 @@ import requests from queens.utils.injector import inject -from queens.utils.path import relative_path_from_root +from test_utils.path import relative_path_from_root sys.path.insert(1, str(relative_path_from_root("test_utils").resolve())) from get_queens_example_from_readme import ( # pylint: disable=import-error, wrong-import-position,wrong-import-order diff --git a/doc/source/_ext/templates/introduction.md.j2 b/doc/source/_ext/templates/introduction.md.j2 index 91cc48686..e89524f13 100644 --- a/doc/source/_ext/templates/introduction.md.j2 +++ b/doc/source/_ext/templates/introduction.md.j2 @@ -26,14 +26,69 @@ {{ extract_from_markdown_by_marker("installation", readme_path) }} -For development, install the additional required packages via: -{{ extract_from_markdown_by_marker("installation_develop", contributing_path) }} +### User-managed environments -> Note: We recommend using conda/mamba environments and installing performance-critical packages (e.g., numpy, scipy, ...) using `conda install .` The reason for this is the choice of BLAS library (linear algebra packages). Conda (depending on the channel) installs numpy and the [mkl](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-mkl-and-third-party-applications-how-to-use-them-together.html) library from Intel, in contrast to pip which defaults back to the linear algebra package installed on the system. According to certain benchmarks ([here](http://markus-beuckelmann.de/blog/boosting-numpy-blas.html) or [here](https://medium.com/analytics-vidhya/why-conda-install-instead-of-pip-install-ba4c6826a0ae)), the mkl library is able to outperform other linear algebra libraries, especially on Intel devices. Particularly for use cases where linear algebra operations dominate the computational costs, the benefit can be huge. +QUEENS should be installed into an isolated Python environment rather than into your system Python. +The examples below use different environment managers, but the idea is always the same: +1. Create an environment with Python 3.12 or newer. +2. Activate that environment. +3. Check that `python` points to the environment and has the expected version. +4. Install QUEENS from the repository root with `python -m pip install .`. + +#### `venv` + +Use `venv` if you already have Python 3.12 installed on your system: + +```bash +git clone https://github.com/queens-py/queens.git +cd queens +python3.12 -m venv .venv +source .venv/bin/activate +python --version +python -m pip install --upgrade pip +python -m pip install . +``` + +After activation, `python --version` should report Python 3.12 or newer. If `python3.12` is not +available, install Python 3.12 first with your system package manager or another Python installer. + +#### `uv venv` + +If you use [uv](https://docs.astral.sh/uv/), let uv install and select Python 3.12: + +```bash +git clone https://github.com/queens-py/queens.git +cd queens +uv python install 3.12 +uv venv --python 3.12 +source .venv/bin/activate +python --version +python -m pip install . +``` + +#### Conda + +Conda-style environment managers can create an environment with the required Python version directly: + +```bash +git clone https://github.com/queens-py/queens.git +cd queens +conda create -n queens python=3.12 +conda activate queens +python --version +python -m pip install . +``` + +The same pattern also applies to compatible tools such as Mamba or Micromamba. + +For development, prefer the locked Pixi environments shown above because they keep dependency +resolution and editable installs aligned with CI. + +### Testing installation To test for a successful installation, run the test suite: ``` -pytest -n +pixi run -e dev pytest ``` Consult the [documentation of QUEENS tests](testing) for more details on testing. diff --git a/doc/source/conf.py b/doc/source/conf.py index 002427a3f..f4f6294dd 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -153,6 +153,11 @@ # Warn about all references where the target cannot be found nitpicky = True +# Ignore TypeVar references used for generic type annotations. +nitpick_ignore = [ + ("py:obj", "queens.variational_distributions._variational_distribution.V"), +] + # Suppress specific warnings suppress_warnings = ["misc.copy_overwrite", "ref.attr", "ref.class", "ref.func"] diff --git a/doc/source/faqs/requirements.md b/doc/source/faqs/requirements.md index 4d7be5161..a24ae8e76 100644 --- a/doc/source/faqs/requirements.md +++ b/doc/source/faqs/requirements.md @@ -2,6 +2,19 @@ ## What are the requirements for QUEENS? -Currently, QUEENS is only tested on UNIX systems. Besides Python, QUEENS requires [rsync](https://rsync.samba.org/) in order to copy simulation files. +Currently, QUEENS is only tested on UNIX systems (Ubuntu and macOS on arm64). Besides Python 3.12 +or newer, QUEENS requires [rsync](https://rsync.samba.org/) in order to copy simulation files. -The Python dependencies for QUEENS can be found in the `requirements.txt` file. There are a lot of them and we are working on reducing them, or at least making them optional. +QUEENS declares its Python dependencies in `pyproject.toml`. +For development and CI-like reproducibility, dependencies are managed with Pixi. The Pixi +environments are declared in `pyproject.toml` and locked in `pixi.lock`: + +- `default`: core QUEENS dependencies +- `all`: runtime extras without development tools +- `dev`: full contributor setup, including development tools, tutorials, and 4C support + +For installation information see the [README.md](https://github.com/queens-py/queens/blob/main/README.md). + +## Changing the requirements +For instructions on adding, removing, or updating dependencies, see the +[contributing guide](../contributing.md). diff --git a/environment.yml b/environment.yml deleted file mode 100644 index e3d344481..000000000 --- a/environment.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: queens -channels: - - conda-forge -# We want to have a reproducible setup, so we don't want default channels, -# which may be different for different users. All required channels should -# be listed explicitly here. - - nodefaults -dependencies: - - python==3.11 -# to ensure that performance optimized backends are used, -# the following packages are installed from conda -# for example BLAS libraries like Intel MKL for numpy - - cython==3.0.11 - - numba==0.60.0 - - numpy==1.26.4 - - pandas==2.2.3 - - scikit-learn==1.5.2 - - scipy==1.14.1 - - libopenblas==0.3.28 -# required for jupyter notebook integration into the sphinx documentation - - pandoc -# required because newer versions have deprecated the pkg_resources module, which is needed for -# liccheck==0.9.2, gpflow==2.9.2 - - setuptools<82 -# Only install pip-tools via pip itself since -# all other pip dependencies should be managed -# via pip-tools in the requirements.in files - - pip - - pip: - - pip-tools diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 000000000..abd507dca --- /dev/null +++ b/pixi.lock @@ -0,0 +1,16376 @@ +version: 7 +platforms: +- name: linux-64 +- name: osx-arm64 +environments: + all: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/nodefaults/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.306-mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.11.0-6_hcf00494_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dm-tree-0.1.10-py312hecca40a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-hc65338a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.1.1-gpl_hee00b0e_901.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hee1de02_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.3.0-h96af755_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.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/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gymnasium-1.2.3-np2py312hcdd156d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.9.2-cpu_py312hc81e8bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-hf42df4d_1.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.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hd24cca6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdovi-3.3.2-ha23c83e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.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/libegl-devel-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/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.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/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.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.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_hdba1596_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_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/libogg-1.3.5-hd0c01bc_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/libopengl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.0.0-h78e8023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.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/libplacebo-7.360.1-h9eeb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-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.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.19.1-cpu_ha812d39_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.19.1-cpu_h0a5eddc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.10.0-cpu_mkl_h7058990_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.16.0-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.15.2-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_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.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.5-h4922eb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py312h7424e68_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mesalib-26.0.3-h8cca3c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2025.3.1-h0e700b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2025.3.1-ha770c72_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.7.1-py312h4307cf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.4-np2py312h0f77346_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.19-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py312hd1dde6f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpoly-1.3.9-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.11.1-threadpool_h77e0eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-cpu-threadpool-3.11.1-threadpool_h3c4d5c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onemkl-license-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.19.1-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py312h8ecdadd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_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/proj-9.8.1-he0df7b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_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/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.38.3-py312hc487a0d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.38.3-np2py312h0f77346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.10.0-cpu_mkl_py312_hca44ed5_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.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.11.0-pl5321h16c4a6b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.8-hdeec2a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2026.2-h718be3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312h4eba8b5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.19.1-cpu_py312h3336143_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.19.1-cpu_py312h9edca52_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.09-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/viskores-1.1.1-cpu_hc82bd48_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-9.6.1-py312h244374b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.6.1-py312hb8f95c7_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.6.1-py312hf1e11e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + - 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.6-hb03c661_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.47-hb03c661_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.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.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-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_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-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_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-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-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.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_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/yarl-1.23.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - 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-3_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_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/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meshio-5.3.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/noarch/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_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/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-fem-12.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/7c/45/7c7a8bcbfe68595c6ad82612dae409bf8c2f7dbad7cb0a30ad0637ce828f/jsonschema_rs-0.46.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/af/cb/87da89ae11d0de562928a7e8ca40d5daee55049408019d5d1b918af6800b/rapidyaml-0.12.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f8/cb/91d8f07f08e86f03e0e9b5ba9db350d751119c9ba27eff4c418e4f27ee9c/fourcipp-1.103.0-py3-none-any.whl + 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.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_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/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_osx-arm64-22.1.5-h7e67a1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.5-h707e725_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meshio-5.3.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/noarch/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/numpoly-1.2.14-pyhd8ed1ab_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/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-fem-12.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.13.5-py312h9f8c436_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.5.0-py312h87c4bb7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py312h6ef9ec0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.307-accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.11.0-7_h55bc449_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py312hf57c059_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.5-default_hd632d02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.5-default_cfg_hb78b91e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-22.1.5-default_cfg_h76039ee_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cli11-2.6.2-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py312h1238841_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-hb961e35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py312h2bbb03f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.16.2-h3ff7a7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dm-tree-0.1.10-py312h5ac6f9e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.4.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-8.1.1-gpl_h246f3d5_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.62.1-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.7.0-py312h512c567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glew-2.3.0-hf163413_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h37541a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glslang-16.3.0-h7cb4797_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.0-py312he1ee7cc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py312h0c23288_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gymnasium-1.2.3-np2py312hcf3ad39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hdd01ddf_102.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_109.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py312h8d61f43_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.6-h726d253_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.4-hcbd7ca7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h3d1d584_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h0419b56_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_h752f6bc_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.5-default_h6dd9417_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.5-h6dc3340_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdovi-3.3.2-h78f8ca3_4.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/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hcb0d94e_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.11.0-7_hbdd07e9_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.5-h89af1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h7a8d41e_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2026.0.0-hc295da0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.6.1-h1a92334_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libplacebo-7.360.1-h176d363_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.3-hd341ff2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_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.19.1-cpu_he004e32_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.19.1-cpu_h3441331_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtheora-1.1.1-h99b78c6_1006.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.10.0-cpu_generic_hf7cc835_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.15.2-ha759d40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvulkan-loader-1.4.341.0-h3feff0a_0.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/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.5-hb545844_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py312h7ca588d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py312h2b25a0d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py312hf3defc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mesalib-26.0.3-h6616f17_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py312h60fbb24_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.7.1-py312h43af8aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.19-py312hb3ab3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311h8d5b1ca_107.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py312h2d3d6e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.6.0-hb5b2745_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.13-hf7f56bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.19.1-py312h766f71e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py312h6510ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py312h4e908a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.8.1-ha88f16d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.3.1-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py312h857ab9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_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/osx-arm64/pugixml-1.15-hd3d436d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py312h21b41d0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py312h6831925_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-2.38.3-py312ha7b44dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-base-2.38.3-np2py312h60fbb24_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.10.0-cpu_generic_py312_h2470ad0_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.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/qt6-main-6.11.1-pl5321h01fc3ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py312he5ca3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py312h0f234b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.4.8-h6fa9c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shaderc-2026.2-hf31e910_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/spirv-tools-2026.1-h4ddebb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.6-py312ha11c99a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-4.0.1-h0cb729a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-2023.0.0-he0260a5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-devel-2023.0.0-h7f394f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h9536bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.19.1-cpu_py312hc65d1cb_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.19.1-cpu_py312h66a5cad_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-4.09-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/viskores-1.1.1-cpu_h841489f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.6.1-py312hee49c5b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-base-9.6.1-py312h12f95e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-io-ffmpeg-9.6.1-py312h199f87a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.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/yarl-1.23.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/44/ca/2ecd4529be078797bda8d662d1ecb67b1bb884ee7531a4b1646162d21658/jsonschema_rs-0.46.4-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/90/d6/42d441eeceac1d8fc7d2a7480654db661282dd1f94deef344c5421ba0c3c/rapidyaml-0.12.1-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/cb/91d8f07f08e86f03e0e9b5ba9db350d751119c9ba27eff4c418e4f27ee9c/fourcipp-1.103.0-py3-none-any.whl + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/nodefaults/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.306-mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.11.0-6_hcf00494_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dm-tree-0.1.10-py312hecca40a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-hc65338a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.1.1-gpl_hee00b0e_901.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hee1de02_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.3.0-h96af755_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.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/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gymnasium-1.2.3-np2py312hcdd156d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.9.2-cpu_py312hc81e8bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-hf42df4d_1.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.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hd24cca6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdovi-3.3.2-ha23c83e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.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/libegl-devel-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/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.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/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.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.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_hdba1596_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_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/libogg-1.3.5-hd0c01bc_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/libopengl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.0.0-h78e8023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.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/libplacebo-7.360.1-h9eeb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-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.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.19.1-cpu_ha812d39_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.19.1-cpu_h0a5eddc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.10.0-cpu_mkl_h7058990_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.16.0-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.15.2-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_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.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.5-h4922eb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py312h7424e68_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mesalib-26.0.3-h8cca3c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2025.3.1-h0e700b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2025.3.1-ha770c72_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.7.1-py312h4307cf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.4-np2py312h0f77346_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.19-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py312hd1dde6f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpoly-1.3.9-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.11.1-threadpool_h77e0eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-cpu-threadpool-3.11.1-threadpool_h3c4d5c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onemkl-license-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.19.1-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py312h8ecdadd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_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/proj-9.8.1-he0df7b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_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/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.38.3-py312hc487a0d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.38.3-np2py312h0f77346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.10.0-cpu_mkl_py312_hca44ed5_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.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.11.0-pl5321h16c4a6b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.8-hdeec2a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2026.2-h718be3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312h4eba8b5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.19.1-cpu_py312h3336143_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.19.1-cpu_py312h9edca52_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.09-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/viskores-1.1.1-cpu_hc82bd48_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-9.6.1-py312h244374b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.6.1-py312hb8f95c7_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.6.1-py312hf1e11e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + - 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.6-hb03c661_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.47-hb03c661_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.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.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-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_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-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_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-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-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.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_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/yarl-1.23.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_x86_64-microarch-level-1-3_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_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/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/noarch/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_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/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_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/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_osx-arm64-22.1.5-h7e67a1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.5-h707e725_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/noarch/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/numpoly-1.2.14-pyhd8ed1ab_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/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.13.5-py312h9f8c436_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.5.0-py312h87c4bb7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py312h6ef9ec0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.307-accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.11.0-7_h55bc449_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.5-default_hd632d02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.5-default_cfg_hb78b91e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-22.1.5-default_cfg_h76039ee_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cli11-2.6.2-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py312h1238841_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-hb961e35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py312h2bbb03f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.16.2-h3ff7a7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dm-tree-0.1.10-py312h5ac6f9e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.4.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-8.1.1-gpl_h246f3d5_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.62.1-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.7.0-py312h512c567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glew-2.3.0-hf163413_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h37541a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glslang-16.3.0-h7cb4797_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.0-py312he1ee7cc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py312h0c23288_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gymnasium-1.2.3-np2py312hcf3ad39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hdd01ddf_102.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_109.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py312h8d61f43_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.6-h726d253_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.4-hcbd7ca7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h3d1d584_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h0419b56_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_h752f6bc_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.5-default_h6dd9417_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.5-h6dc3340_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdovi-3.3.2-h78f8ca3_4.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/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hcb0d94e_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.11.0-7_hbdd07e9_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.5-h89af1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h7a8d41e_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2026.0.0-hc295da0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.6.1-h1a92334_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libplacebo-7.360.1-h176d363_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.3-hd341ff2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_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.19.1-cpu_he004e32_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.19.1-cpu_h3441331_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtheora-1.1.1-h99b78c6_1006.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.10.0-cpu_generic_hf7cc835_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.15.2-ha759d40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvulkan-loader-1.4.341.0-h3feff0a_0.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/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.5-hb545844_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py312h7ca588d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py312h2b25a0d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py312hf3defc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mesalib-26.0.3-h6616f17_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py312h60fbb24_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.7.1-py312h43af8aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.19-py312hb3ab3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py312h2d3d6e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.6.0-hb5b2745_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.13-hf7f56bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.19.1-py312h766f71e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py312h6510ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py312h4e908a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.8.1-ha88f16d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.3.1-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py312h857ab9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_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/osx-arm64/pugixml-1.15-hd3d436d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py312h21b41d0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py312h6831925_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-2.38.3-py312ha7b44dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-base-2.38.3-np2py312h60fbb24_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.10.0-cpu_generic_py312_h2470ad0_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.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/qt6-main-6.11.1-pl5321h01fc3ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py312he5ca3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py312h0f234b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.4.8-h6fa9c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shaderc-2026.2-hf31e910_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/spirv-tools-2026.1-h4ddebb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.6-py312ha11c99a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-4.0.1-h0cb729a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-2023.0.0-he0260a5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-devel-2023.0.0-h7f394f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h9536bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.19.1-cpu_py312hc65d1cb_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.19.1-cpu_py312h66a5cad_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-4.09-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/viskores-1.1.1-cpu_h841489f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.6.1-py312hee49c5b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-base-9.6.1-py312h12f95e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-io-ffmpeg-9.6.1-py312h199f87a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.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/yarl-1.23.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + dev: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/nodefaults/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/astroid-4.0.4-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.306-mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.11.0-6_hcf00494_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/commitizen-4.15.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dm-tree-0.1.10-py312hecca40a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-hc65338a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.1.1-gpl_hee00b0e_901.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hee1de02_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.3.0-h96af755_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.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/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gymnasium-1.2.3-np2py312hcdd156d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.9.2-cpu_py312hc81e8bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-hf42df4d_1.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.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hd24cca6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdovi-3.3.2-ha23c83e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.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/libegl-devel-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/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.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/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.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/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.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.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_hdba1596_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_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/libogg-1.3.5-hd0c01bc_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/libopengl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.0.0-hd85de46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.0.0-hb56ce9e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.0.0-hd41364c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.0.0-h7a07914_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.0.0-h78e8023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.0.0-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.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/libplacebo-7.360.1-h9eeb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-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.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.19.1-cpu_ha812d39_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.19.1-cpu_h0a5eddc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.10.0-cpu_mkl_h7058990_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.16.0-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.15.2-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_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.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.5-h4922eb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py312h7424e68_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mesalib-26.0.3-h8cca3c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2025.3.1-h0e700b2_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2025.3.1-ha770c72_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.7.1-py312h4307cf8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.4-np2py312h0f77346_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.19-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.20.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py312hd1dde6f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpoly-1.3.9-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.11.1-threadpool_h77e0eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-cpu-threadpool-3.11.1-threadpool_h3c4d5c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onemkl-license-2025.3.1-hf2ce2f3_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.19.1-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py312h8ecdadd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_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/proj-9.8.1-he0df7b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_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/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.38.3-py312hc487a0d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.38.3-np2py312h0f77346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.11.0-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytokens-0.4.1-py312h5253ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.10.0-cpu_mkl_py312_hca44ed5_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_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.11.0-pl5321h16c4a6b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py312h5253ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.12-h994f30f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.8-hdeec2a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2026.2-h718be3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312h4eba8b5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.19.1-cpu_py312h3336143_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.19.1-cpu_py312h9edca52_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.09-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/viskores-1.1.1-cpu_hc82bd48_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-9.6.1-py312h244374b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.6.1-py312hb8f95c7_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.6.1-py312hf1e11e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + - 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.6-hb03c661_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.47-hb03c661_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.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.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-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_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-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_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-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-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.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_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/yarl-1.23.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - 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-3_x86_64.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.4.0-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/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.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/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/black-26.3.1-pyh866005b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.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/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decli-0.6.3-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_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/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.8-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_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/isort-8.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.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-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_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/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.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/noarch/meshio-5.3.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/myst-parser-5.0.0-pyhd8ed1ab_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/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.17.1-hb502eef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.17.1-h08b4883_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbstripout-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_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/noarch/packaging-26.2-pyhc364b38_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/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_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/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-licenses-5.5.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-hooks-5.0.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prettytable-3.17.0-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/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.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/py-1.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.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.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-codestyle-2.0.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-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/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-fem-12.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.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-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/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/testbook-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-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/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yamllint-1.38.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/9a/e3186e760c57ee5f1c27ea5cea577a0ff9abfca51eefcb4d9a4cd39aff2e/pandoc-2.4.tar.gz + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/45/7c7a8bcbfe68595c6ad82612dae409bf8c2f7dbad7cb0a30ad0637ce828f/jsonschema_rs-0.46.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/94/ed/5d45bbd42d5407250dd46ce1b9c098d612c3a9bb538858d09da2df77c961/pylint_exit-1.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/cb/87da89ae11d0de562928a7e8ca40d5daee55049408019d5d1b918af6800b/rapidyaml-0.12.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/03/99102b3772bdc5d25fc7fe5f5fb862c54bb6e863991f50d02667999942c1/licenseheaders-0.8.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f8/cb/91d8f07f08e86f03e0e9b5ba9db350d751119c9ba27eff4c418e4f27ee9c/fourcipp-1.103.0-py3-none-any.whl + 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.4.0-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/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.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/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/black-26.3.1-pyh866005b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-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/cachetools-6.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.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/noarch/compiler-rt22_osx-arm64-22.1.5-h7e67a1e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decli-0.6.3-pyhd8ed1ab_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/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_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/distributed-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.8-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_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/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.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/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_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/isort-8.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.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-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_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/keras-3.14.1-pyh753f3f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.5-h707e725_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_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/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.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/noarch/meshio-5.3.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.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/myst-parser-5.0.0-pyhd8ed1ab_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/narwhals-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.17.1-hb502eef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.17.1-h08b4883_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbstripout-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/numpoly-1.2.14-pyhd8ed1ab_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/noarch/packaging-26.2-pyhc364b38_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/paramiko-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_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/pip-26.1.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-licenses-5.5.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-hooks-5.0.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prettytable-3.17.0-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/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.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/py-1.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.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.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_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-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-codestyle-2.0.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-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/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_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/pyvista-0.48.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-fem-12.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_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-81.0.0-pyh332efcf_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/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.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-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/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/testbook-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.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/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-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/werkzeug-3.1.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yamllint-1.38.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.13.5-py312h9f8c436_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/astroid-4.0.4-py312h81bd7bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.5.0-py312h87c4bb7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py312h6ef9ec0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.307-accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.11.0-7_h55bc449_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py312hf57c059_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.5-default_hd632d02_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.5-default_cfg_hb78b91e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-22.1.5-default_cfg_h76039ee_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cli11-2.6.2-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/commitizen-4.15.1-py312h81bd7bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.5-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py312h1238841_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-hb961e35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py312h2bbb03f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.16.2-h3ff7a7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py312h6510ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dm-tree-0.1.10-py312h5ac6f9e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.4.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-8.1.1-gpl_h246f3d5_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.62.1-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.7.0-py312h512c567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glew-2.3.0-hf163413_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h37541a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glslang-16.3.0-h7cb4797_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.0-py312he1ee7cc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py312h0c23288_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gymnasium-1.2.3-np2py312hcf3ad39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hdd01ddf_102.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_109.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py312h8d61f43_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.6-h726d253_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.4-hcbd7ca7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h3d1d584_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h0419b56_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_h752f6bc_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.5-default_h8e162e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.5-default_h6dd9417_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.5-h6dc3340_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdovi-3.3.2-h78f8ca3_4.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/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hcb0d94e_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.11.0-7_hbdd07e9_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.5-h89af1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h7a8d41e_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2026.0.0-h3e6d54f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2026.0.0-h2406d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2026.0.0-h85cbfa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2026.0.0-h41365f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2026.0.0-hc295da0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2026.0.0-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.6.1-h1a92334_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libplacebo-7.360.1-h176d363_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.3-hd341ff2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_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.19.1-cpu_he004e32_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.19.1-cpu_h3441331_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtheora-1.1.1-h99b78c6_1006.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.10.0-cpu_generic_hf7cc835_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.15.2-ha759d40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvulkan-loader-1.4.341.0-h3feff0a_0.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/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.5-hb545844_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.5-hd34ed20_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py312h7ca588d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py312h2b25a0d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py312hf3defc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mesalib-26.0.3-h6616f17_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py312h60fbb24_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.7.1-py312h43af8aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.19-py312hb3ab3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.20.2-py312hefc2c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311h8d5b1ca_107.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py312h2d3d6e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.6.0-hb5b2745_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.13-hf7f56bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.19.1-py312h766f71e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py312h6510ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py312h4e908a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.8.1-ha88f16d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.3.1-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py312h857ab9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_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/osx-arm64/pugixml-1.15-hd3d436d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py312h21b41d0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py312h6831925_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-2.38.3-py312ha7b44dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-base-2.38.3-np2py312h60fbb24_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.11.0-py312hb3ab3e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytokens-0.4.1-py312hb3ab3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.10.0-cpu_generic_py312_h2470ad0_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_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/qt6-main-6.11.1-pl5321h01fc3ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py312h6ef9ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py312hb3ab3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py312he5ca3e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py312h0f234b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.4.8-h6fa9c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shaderc-2026.2-hf31e910_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/spirv-tools-2026.1-h4ddebb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.6-py312ha11c99a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-4.0.1-h0cb729a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-2023.0.0-he0260a5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-devel-2023.0.0-h7f394f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h9536bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.19.1-cpu_py312hc65d1cb_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.19.1-cpu_py312h66a5cad_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-4.09-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/viskores-1.1.1-cpu_h841489f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.6.1-py312hee49c5b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-base-9.6.1-py312h12f95e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-io-ffmpeg-9.6.1-py312h199f87a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.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/yarl-1.23.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + - pypi: https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/9a/e3186e760c57ee5f1c27ea5cea577a0ff9abfca51eefcb4d9a4cd39aff2e/pandoc-2.4.tar.gz + - pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + - pypi: https://files.pythonhosted.org/packages/44/ca/2ecd4529be078797bda8d662d1ecb67b1bb884ee7531a4b1646162d21658/jsonschema_rs-0.46.4-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + - pypi: https://files.pythonhosted.org/packages/90/d6/42d441eeceac1d8fc7d2a7480654db661282dd1f94deef344c5421ba0c3c/rapidyaml-0.12.1-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/94/ed/5d45bbd42d5407250dd46ce1b9c098d612c3a9bb538858d09da2df77c961/pylint_exit-1.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/03/99102b3772bdc5d25fc7fe5f5fb862c54bb6e863991f50d02667999942c1/licenseheaders-0.8.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/cb/91d8f07f08e86f03e0e9b5ba9db350d751119c9ba27eff4c418e4f27ee9c/fourcipp-1.103.0-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: c0cddb66070dd6355311f7667ce2acccf70d1013edaa6e97f22859502fefdb22 + md5: 887b70e1d607fba7957aa02f9ee0d939 + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 8244 + timestamp: 1764092331208 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + sha256: 52f4d07b10fe4a1ded570b0708594d2d9075223e1dd94d0c5988eb71f724a5f2 + md5: 68edaee7692efb8bbef5e95375090189 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.4.0 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=14 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 1034187 + timestamp: 1775000054521 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 + md5: dcdc58c15961dbf17a0621312b01f5cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 584660 + timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda + sha256: b08ef033817b5f9f76ce62dfcac7694e7b6b4006420372de22494503decac855 + md5: 346722a0be40f6edc53f12640d301338 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 2706396 + timestamp: 1718551242397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/astroid-4.0.4-py312h7900ff3_0.conda + sha256: 50d706c0700ee47617de6a850cab0bb4a3419c2ed86804c21f449735f09e1c48 + md5: 78bdb6d3da524bdea10ef44e5ec7658d + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/astroid?source=hash-mapping + size: 509570 + timestamp: 1770634488093 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c + md5: 6b889f174df1e0f816276ae69281af4d + depends: + - at-spi2-core >=2.40.0,<2.41.0a0 + - atk-1.0 >=2.36.0 + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.1,<3.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 339899 + timestamp: 1619122953439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + sha256: c4f9b66bd94c40d8f1ce1fad2d8b46534bdefda0c86e3337b28f6c25779f258d + md5: 8cb2fc4cd6cc63f1369cfa318f581cc3 + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.3,<3.0a0 + - xorg-libx11 + - xorg-libxi + - xorg-libxtst + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 658390 + timestamp: 1625848454791 +- conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e + md5: f730d54ba9cd543666d7220c9f7ed563 + depends: + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 355900 + timestamp: 1713896169874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda + sha256: ccbf2cc4bea4aab6e071d67ecc2743197759f6df855787e7a5f57f7973f913a2 + md5: 55eaf7066da1299d217ab32baedc7fa8 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 134427 + timestamp: 1777489423676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + sha256: f21d648349a318f4ae457ea5403d542ba6c0e0343b8642038523dd612b2a5064 + md5: 3c3d02681058c3d206b562b2e3bc337f + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 56230 + timestamp: 1764593147526 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + sha256: 926a5b9de0a586e88669d81de717c8dd3218c51ce55658e8a16af7e7fe87c833 + md5: e36ad70a7e0b48f091ed6902f04c23b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 239605 + timestamp: 1763585595898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + sha256: 1838bdc077b77168416801f4715335b65e9223f83641a2c28644f8acd8f9db0e + md5: f16f498641c9e05b645fe65902df661a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 22278 + timestamp: 1767790836624 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.0-h9b893ba_0.conda + sha256: 9692edaeaf90f7710b7ec49c7ca42961c59344dafa6fadbaec8c283b0606ca68 + md5: 60076118b1579967748f0c9a2912de7c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 59054 + timestamp: 1774479894768 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda + sha256: 38cfc8894db6729770ac18f900296c3f7c20f349a5586a8d8e1a62571fce61d5 + md5: 77f70a9ab785a146dbf66fba00131403 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 225826 + timestamp: 1774488399486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda + sha256: e3e33031d641864128ab11f9b8585ad5beb82fa988fe833bb0767dd01878a371 + md5: 14260392d0b491c537b5e26e9a506fff + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - s2n >=1.7.2,<1.7.3.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 181583 + timestamp: 1777471132287 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-hc1936db_2.conda + sha256: 236ab4138ff4600f95903d2da94125df78577055f6687afa8806db0f6ed2e1a8 + md5: 9120bc47b6f837f3cea90928c3e9a8fa + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 221638 + timestamp: 1777488145895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda + sha256: 4cecb4d595b7cf558087c37b8131cae5204b2c64d75f6b951dc3731d3f872bb8 + md5: 50ae8372984b8b98e056ac8f6b70ab29 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - openssl >=3.5.6,<4.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 152657 + timestamp: 1777824812393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + sha256: 9d62c5029f6f8219368a8665f0a549da572dc777f52413b7d75609cacdbc02cc + md5: c7e3e08b7b1b285524ab9d74162ce40b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 59383 + timestamp: 1764610113765 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + sha256: 09472dd5fa4473cffd44741ee4c1112f2c76d7168d1343de53c2ad283dc1efa6 + md5: f8e1bcc5c7d839c5882e94498791be08 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 101435 + timestamp: 1771063496927 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.38.3-h745e52d_1.conda + sha256: 5616649034662ab7846b78b344891f49b895807cabd83918aebb3439aa9ca405 + md5: 6a65b3595a8933808c03ff065dfb7702 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 412541 + timestamp: 1778019077033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-h41c0014_4.conda + sha256: f17585991350e00084614faaa704166a07fdcf58e80c76003e35111093c6e5e9 + md5: 169a79ea1127077d8dc36dc963ff55ac + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - libcurl >=8.20.0,<9.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3624409 + timestamp: 1778156208464 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + sha256: 321d1070905e467b6bc6f5067b97c1868d7345c272add82b82e08a0224e326f0 + md5: 5492abf806c45298ae642831c670bba0 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.18.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 348729 + timestamp: 1768837519361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + sha256: 2beb6ae8406f946b8963a67e72fe74453e1411c5ae7e992978340de6c512d13c + md5: 68bfb556bdf56d56e9f38da696e752ca + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 250511 + timestamp: 1770344967948 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + sha256: cef75b91bdd5a65c560b501df78905437cc2090a64b4c5ecd7da9e08e9e9af7c + md5: 939d9ce324e51961c7c4c0046733dbb7 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 579825 + timestamp: 1770321459546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + sha256: ef7d1cae36910b21385d0816f8524a84dee1513e0306927e41a6bd32b5b9a0d0 + md5: 6400f73fe5ebe19fe7aca3616f1f1de7 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 150405 + timestamp: 1770240307002 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + sha256: 55aa8ad5217d358e0ccf4a715bd1f9bafef3cd1c2ea4021f0e916f174c20f8e3 + md5: 6d10339800840562b7dad7775f5d2c16 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 302524 + timestamp: 1770384269834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + sha256: a2b08a4e5e549b5f67c38edffd175437e2208547a7e67b5fa5373b67ef419e50 + md5: b31dba71fe091e7201826e57e0f7b261 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd?source=compressed-mapping + size: 239928 + timestamp: 1778594049826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda + sha256: 22020286e3d27eba7c9efef79c1020782885992aea0e7d28d7274c4405001521 + md5: 8fbbd949c452efde5a75b62b22a88938 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 292835 + timestamp: 1762497719397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + sha256: 0a7d405064f53b9d91d92515f1460f7906ee5e8523f3cd8973430e81219f4917 + md5: 8165352fdce2d2025bf884dc0ee85700 + depends: + - ld_impl_linux-64 2.45.1 default_hbd61a6d_102 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 3661455 + timestamp: 1774197460085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.306-mkl.conda + build_number: 6 + sha256: 1b842287b09877ec11062bdcd4cb6bc24fddd1d71b3dea893163207ed2b7c7ad + md5: 51424ae4b1ba5521ee838721d63d4390 + depends: + - blas-devel 3.11.0 6*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18733 + timestamp: 1774503215756 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.11.0-6_hcf00494_mkl.conda + build_number: 6 + sha256: c4d089d892dc277d2f63462d4d5cd8d26f22ced12d862d45c4cc9c0dba10667a + md5: b789b886f2b45c3a9c91935639717808 + depends: + - libblas 3.11.0 6_h5875eb1_mkl + - libcblas 3.11.0 6_hfef963f_mkl + - liblapack 3.11.0 6_h5e43f62_mkl + - liblapacke 3.11.0 6_hdba1596_mkl + - mkl >=2025.3.1,<2026.0a0 + - mkl-devel 2025.3.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18446 + timestamp: 1774503092047 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + sha256: e7af5d1183b06a206192ff440e08db1c4e8b2ca1f8376ee45fb2f3a85d4ee45d + md5: 2c2fae981fd2afd00812c92ac47d023d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 48427 + timestamp: 1733513201413 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + sha256: e511644d691f05eb12ebe1e971fd6dc3ae55a4df5c253b4e1788b789bdf2dfa6 + md5: 8ccf913aaba749a5496c17629d859ed1 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.2.0 hb03c661_1 + - libbrotlidec 1.2.0 hb03c661_1 + - libbrotlienc 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 20103 + timestamp: 1764017231353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94 + md5: af39b9a8711d4a8d437b52c1d78eb6a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.2.0 hb03c661_1 + - libbrotlienc 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 21021 + timestamp: 1764017221344 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + sha256: 49df13a1bb5e388ca0e4e87022260f9501ed4192656d23dc9d9a1b4bf3787918 + md5: 64088dffd7413a2dd557ce837b4cbbdb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.2.0 hb03c661_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 368300 + timestamp: 1764017300621 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260182 + timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 207882 + timestamp: 1765214722852 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a + md5: bb6c4808bfa69d6f7f6b07e5846ced37 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<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: 989514 + timestamp: 1766415934926 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + sha256: 7dafe8173d5f94e46cf9cd597cc8ff476a8357fbbd4433a8b5697b2864845d9c + md5: 648ee28dcd4e07a1940a17da62eccd40 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - 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: 295716 + timestamp: 1761202958833 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + sha256: 02c483817cce596ab0fb79f0f64027a166e20db0c84973e61a08285d53ee463d + md5: 84bf349fad55056ed326fc550671b65c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.21.2 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cftime?source=hash-mapping + size: 426552 + timestamp: 1768510920948 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda + sha256: 1d635e8963e094d95d35148df4b46e495f93bb0750ad5069f4e0e6bbb47ac3bf + md5: 83dae3dfadcfec9b37a9fbff6f7f7378 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 99051 + timestamp: 1772207728613 +- conda: https://conda.anaconda.org/conda-forge/linux-64/commitizen-4.15.1-py312h7900ff3_0.conda + sha256: 97dc6281d5bef4a7f6979f50ea5964eee358183d11675b5c6d22e810829f5682 + md5: 9f1d76f573c5022ca2160e196374f6cc + depends: + - argcomplete <3.7,>=1.12.1 + - charset-normalizer <4,>=2.1.0 + - colorama <1.0,>=0.4.1 + - decli <1.0,>=0.6.0 + - deprecated <2,>=1.2.13 + - jinja2 >=2.10.3 + - packaging >=26 + - prompt-toolkit !=3.0.52 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - pyyaml >=3.8 + - questionary <3.0,>=2.0 + - termcolor <4.0.0,>=1.1.0 + - tomlkit <1.0.0,>=0.8.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/commitizen?source=hash-mapping + size: 226714 + timestamp: 1778095575843 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + sha256: 1a53d0bd9d8197a7dc57f9b154e24d908ade29934e0a450ee6e40294d0a237f9 + md5: 3b482cadfc77f094c8b3016166292dfb + depends: + - gcc_impl_linux-64 >=15.2.0,<15.2.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 31857 + timestamp: 1778269225076 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + sha256: 62447faf7e8eb691e407688c0b4b7c230de40d5ecf95bf301111b4d05c5be473 + md5: 43c2bc96af3ae5ed9e8a10ded942aa50 + depends: + - numpy >=1.25 + - 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/contourpy?source=hash-mapping + size: 320386 + timestamp: 1769155979897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda + sha256: 6ed9b689e92c5e202d834d5a4eeba990ecbfda104ef40ac455f3d006d439a926 + md5: c78de13127e71cb1e581f473ac76f360 + 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: 390409 + timestamp: 1778444934285 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + sha256: 16d3d1e8df34a36430a28f423380fbd93abe5670ca7b52e9f4a64c091fd3ddd9 + md5: c5a8e173200adf567dc2818d8bf1325f + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=2.0 + - libgcc >=14 + - openssl >=3.5.6,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + 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: 1912222 + timestamp: 1777966300032 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + sha256: 7684da83306bb69686c0506fb09aa7074e1a55ade50c3a879e4e5df6eebb1009 + md5: af491aae930edc096b58466c51c4126c + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=13 + - libntlm >=1.8,<2.0a0 + - libstdcxx >=13 + - libxcrypt >=4.4.36 + - openssl >=3.5.5,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + purls: [] + size: 210103 + timestamp: 1771943128249 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + sha256: 75b3d3c9497cded41e029b7a0ce4cc157334bbc864d6701221b59bb76af4396d + md5: 29fd0bdf551881ab3d2801f7deaba528 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - toolz >=0.10.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cytoolz?source=hash-mapping + size: 623770 + timestamp: 1771855837505 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 + md5: 418c6ca5929a611cbd69204907a83995 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 760229 + timestamp: 1685695754230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 + md5: ce96f2f470d39bd96ce03945af92e280 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.86.2,<3.0a0 + - libexpat >=2.7.3,<3.0a0 + license: AFL-2.1 OR GPL-2.0-or-later + purls: [] + size: 447649 + timestamp: 1764536047944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda + sha256: f20121b67149ff80bf951ccae7442756586d8789204cd08ade59397b22bfd098 + md5: ee1b48795ceb07311dd3e665dd4f5f33 + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2858582 + timestamp: 1769744978783 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dm-tree-0.1.10-py312hecca40a_0.conda + sha256: f03671b4e628ffbb8ca85c0756890d911abe16686c71f41ae941e6c743cbda03 + md5: 063b754d00ecebf13abb8fcdb1947e89 + depends: + - __glibc >=2.17,<3.0.a0 + - absl-py >=0.6.1 + - attrs >=18.2.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.21 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - wrapt >=1.11.2 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/dm-tree?source=hash-mapping + size: 135819 + timestamp: 1775827137564 +- conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + sha256: 40cdd1b048444d3235069d75f9c8e1f286db567f6278a93b4f024e5642cfaecc + md5: dbe3ec0f120af456b3477743ffd99b74 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 71809 + timestamp: 1765193127016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-hc65338a_0.conda + sha256: f122c5bb618532eb40124f34dc3d467b9142c4a573c206e3e6a51df671345d6a + md5: fcc98d38ae074ee72ee9152e357bcbf2 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 1311364 + timestamp: 1773744756289 +- conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + sha256: acde70d55f7dbbc043d733427fd6f1ec6ca49db7cbabcf7a656dd29a952b8ad8 + md5: a85c1768af7780d67c6446c17848b76f + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 13265 + timestamp: 1773744756289 +- conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + sha256: a5b51e491fec22bcc1765f5b2c8fff8a97428e9a5a7ee6730095fb9d091b0747 + md5: 057083b06ccf1c2778344b6dabace38b + depends: + - __glibc >=2.17,<3.0.a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libegl-devel + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libgl-devel + - libglx >=1.7.0,<2.0a0 + - libglx-devel + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 411735 + timestamp: 1758743520805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda + sha256: ca4dc1da00a8aaa56c1088e7f45f1859ecea6f75874e67584f1af6e5cf8179f8 + md5: 992e529e407c9d67d50be1d7543fde4c + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat 2.8.0 hecca717_0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 148114 + timestamp: 1777846120303 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.1.1-gpl_hee00b0e_901.conda + sha256: 6af3f45857478c28fa134e23a8ab7a81ce63cdd29aa2d899232eb7d9410b26e7 + md5: 57b938a79ebb6b996505ea79394bd0c9 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 + - aom >=3.9.1,<3.10.0a0 + - bzip2 >=1.0.8,<2.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - gmp >=6.3.0,<7.0a0 + - harfbuzz >=14.2.0 + - lame >=3.100,<3.101.0a0 + - libass >=0.17.4,<0.17.5.0a0 + - libexpat >=2.8.0,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libjxl >=0.11,<1.0a0 + - liblzma >=5.8.3,<6.0a0 + - libopenvino >=2026.0.0,<2026.0.1.0a0 + - libopenvino-auto-batch-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-auto-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-hetero-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-intel-cpu-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-intel-gpu-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-intel-npu-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-ir-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-onnx-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-paddle-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-pytorch-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-tensorflow-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-tensorflow-lite-frontend >=2026.0.0,<2026.0.1.0a0 + - libopus >=1.6.1,<2.0a0 + - libplacebo >=7.360.1,<7.361.0a0 + - librsvg >=2.62.1,<3.0a0 + - libstdcxx >=14 + - libva >=2.23.0,<3.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libvpl >=2.16.0,<2.17.0a0 + - libvpx >=1.15.2,<1.16.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - openh264 >=2.6.0,<2.6.1.0a0 + - openssl >=3.5.6,<4.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - sdl2 >=2.32.56,<3.0a0 + - shaderc >=2026.2,<2026.3.0a0 + - svt-av1 >=4.0.1,<4.0.2.0a0 + - x264 >=1!164.3095,<1!165 + - x265 >=3.5,<3.6.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + constrains: + - __cuda >=12.8 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 12983934 + timestamp: 1777900506207 +- conda: https://conda.anaconda.org/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda + sha256: e5f90c2fd61012d6ad332657a5bf5455620f0db8524f0b005d91e1c2737bad69 + md5: 10a330bfd5345af730b0fc1349d15eaf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1584732 + timestamp: 1761142459651 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda + sha256: d4e92ba7a7b4965341dc0fca57ec72d01d111b53c12d11396473115585a9ead6 + md5: f7d7a4104082b39e3b3473fbd4a38229 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 198107 + timestamp: 1767681153946 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c + md5: 867127763fbe935bab59815b6e0b7b5c + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libuuid >=2.41.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 270705 + timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda + sha256: e81f6e1ddadbc81ce56b158790148835256d2a3d5762016d389daaa06decfeab + md5: 2396fee22e84f69dffc6e23135905ce8 + 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: 2953293 + timestamp: 1776708606358 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b + md5: 8462b5322567212beeb025f3519fb3e2 + depends: + - libfreetype 2.14.3 ha770c72_0 + - libfreetype6 2.14.3 h73754d4_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173839 + timestamp: 1774298173462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + sha256: 858283ff33d4c033f4971bf440cebff217d5552a5222ba994c49be990dacd40d + md5: f9f81ea472684d75b9dd8d0b328cf655 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + size: 61244 + timestamp: 1757438574066 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + sha256: f4e0e6cd241bc24afb2d6d08e5d2ba170fad2475e522bdf297b7271bba268be6 + md5: 63e20cf7b7460019b423fc06abb96c60 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 55037 + timestamp: 1752167383781 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + sha256: 54a0d9ee655ba83b78b7a796f12224b26c24943d8970559ecc47ccd6c2b0fa72 + md5: 18ec2ee87e4f532afa459ce8ea9a6b02 + depends: + - conda-gcc-specs + - gcc_impl_linux-64 15.2.0 he0086c7_19 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 29561 + timestamp: 1778269371353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + sha256: a48400ec4b73369c1c59babe4ad35821b63a88bba0ec40a80cea5f8c53a26b83 + md5: e3be72048d3c4a78b8e27ec48ba06252 + depends: + - binutils_impl_linux-64 >=2.45 + - libgcc >=15.2.0 + - libgcc-devel_linux-64 15.2.0 hcc6f6b0_119 + - libgomp >=15.2.0 + - libsanitizer 15.2.0 h90f66d4_19 + - libstdcxx >=15.2.0 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 81180457 + timestamp: 1778269124617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + sha256: c5594497f0646e9079705b3199dbb2d5b13c48173cf110000fa1c8818e2b3e0c + md5: 7892f39a39ed39591a89a28eba03e987 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.56,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 577414 + timestamp: 1774985848058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- 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/linux-64/gl2ps-1.4.2-h36e74d4_2.conda + sha256: e28a214c71590a09f75f1aaccf5795bbcfb99b00c2d6ef55d34320b4f47485bd + md5: 787c780ff43f9f79d78d01e476b81a7c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 75835 + timestamp: 1773985381918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda + sha256: 535d152ee06e3d3015a5ab410dfea9574e1678e226fa166f859a0b9e1153e597 + md5: 7eefecda1c71c380bfc406d16e78bbee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libglu >=9.0.3,<9.1.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 492673 + timestamp: 1766373546677 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hee1de02_2.conda + sha256: ae41fd5c867bc4e713a8cc1dc06f5b418026fec116cc222abe33e94235c6b241 + md5: e5a459d2bb98edb88de5a44bfad66b9d + depends: + - libglib ==2.88.1 h0d30a3d_2 + - libffi + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: LGPL-2.1-or-later + purls: [] + size: 236955 + timestamp: 1778508800134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.3.0-h96af755_0.conda + sha256: 3c9b6a90937a96ad27d160304cdbe5e9961db613aba2b84ff673429f0c61d48e + md5: d175cb2c14104728ada04883786a309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - spirv-tools >=2026,<2027.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1366082 + timestamp: 1777747028121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c + md5: c94a5994ef49749880a8139cf9afcbe1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 460055 + timestamp: 1718980856608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.conda + sha256: 6fbdd686d04a0d8c48efe92795137d3bba55a4325acd7931978fd8ea5e24684d + md5: fedbe80d864debab03541e1b447fc12a + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=14 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 253171 + timestamp: 1773245116314 +- 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/graphviz-14.1.2-h8b86629_0.conda + sha256: 48d4aae8d2f7dd038b8c2b6a1b68b7bca13fa6b374b78c09fcc0757fa21234a1 + md5: 341fc61cfe8efa5c72d24db56c776f44 + depends: + - __glibc >=2.17,<3.0.a0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.4,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.7.3,<3.0a0 + - libgcc >=14 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.86.3,<3.0a0 + - librsvg >=2.60.0,<3.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + purls: [] + size: 2426455 + timestamp: 1769427102743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + sha256: 43b09e083e0c3141cb118f84924b498b32d86da5f6a458b60e56e65cd5b97c4e + md5: b1995dadc14463d8f914c54cf2061a07 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libgrpc 1.78.1 h1d1128b_0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.12,<5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 875590 + timestamp: 1774020588709 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + sha256: c6bb4f06331bcb0a566d84e0f0fad7af4b9035a03b13e2d5ecfaf13be57e6e10 + md5: bcaea22d85999a4f17918acfab877e61 + depends: + - __glibc >=2.17,<3.0.a0 + - at-spi2-atk >=2.38.0,<3.0a0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.5,<3.0a0 + - glib-tools + - harfbuzz >=13.2.1 + - hicolor-icon-theme + - libcups >=2.3.3,<2.4.0a0 + - libcups >=2.3.3,<3.0a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pango >=1.56.4,<2.0a0 + - wayland >=1.25.0,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxinerama >=1.1.6,<1.2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 5939083 + timestamp: 1774288645605 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b + md5: 4d8df0b0db060d33c9a702ada998a8fe + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 318312 + timestamp: 1686545244763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + sha256: b00817919d7b2d68e3299031c5332855576ae086ac80032aa0a78b7f6f12dae4 + md5: 327876a856b3a45001cfb9a855efa65f + depends: + - gcc 15.2.0 h0dff253_19 + - gxx_impl_linux-64 15.2.0 hda75c37_19 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 28945 + timestamp: 1778269389494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + sha256: 3f5288346b9fe233352443b3c2e31f1fde845e39d3e96475fc05ec2e782af158 + md5: 9d41f3899b512199af0a4bb939b83e21 + depends: + - gcc_impl_linux-64 15.2.0 he0086c7_19 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 16356816 + timestamp: 1778269332159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gymnasium-1.2.3-np2py312hcdd156d_0.conda + sha256: 0397c3bd4866ef9dd493e5c0e3efa1c8ef876275fdfb9251f192aace7c4098b4 + md5: dbda080a441d3753aad7308cd14a6dbc + depends: + - python + - cloudpickle >=1.2.0 + - farama-notifications + - jax-jumpy >=1.0.0 + - typing_extensions >=4.3.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/gymnasium?source=hash-mapping + size: 1126603 + timestamp: 1769938730543 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + sha256: de9ec9b1b01b90f2da2d896a5835a2fd8049859aff0c6331ca4594327ec79a8b + md5: b270340809d19ae40ff9913f277b803a + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=14 + - numpy >=1.23,<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: 1335314 + timestamp: 1775581269364 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + sha256: 232c95b56d16d33d8256026a3b1ad34f7f9a75c179d388854be0fd624ddba9e3 + md5: e194f6a2f498f0c7b1e6498bd0b12645 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=78.3,<79.0a0 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2333599 + timestamp: 1776778392713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 + md5: bd77f8da987968ec3927990495dc22e4 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 756742 + timestamp: 1695661547874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_109.conda + sha256: 9d2ea00599e2874b295baa7e719c79823ed61fec885e25c55e7dad666fb1cf50 + md5: c0ca97fff3fff46f837c69efedf838b1 + depends: + - __glibc >=2.17,<3.0.a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3719822 + timestamp: 1777518369641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + sha256: 6d7e6e1286cb521059fe69696705100a03b006efb914ffe82a2ae97ecbae66b7 + md5: 129e404c5b001f3ef5581316971e3ea0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 17625 + timestamp: 1771539597968 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12723451 + timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda + sha256: bc231d69eb6663db0e09738fb916c5e5507147cf1ac60f364f964004e0b29bab + md5: 10909406c1b0e4b57f9f4f0eb0999af8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 1013714 + timestamp: 1774422680665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.6-hecca717_0.conda + sha256: 7cbd7fda22db70c64af64c9173434a4ede58e4f220bda52a044e469aa94c65cb + md5: aaf7c3db8c7c4533deb5449d3ba1c51f + depends: + - __glibc >=2.17,<3.0.a0 + - intel-gmmlib >=22.10.0,<23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libva >=2.23.0,<3.0a0 + license: MIT + license_family: MIT + purls: [] + size: 8782375 + timestamp: 1776080148587 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.9.2-cpu_py312hc81e8bd_0.conda + sha256: 1ba7ff13d58b9ff56b8cca144c52db12260ac20fa0c664697fb0d576989696d6 + md5: 5aea3e396b0c3e18a6fe0e6d0c65afeb + depends: + - python + - scipy >=1.9 + - ml_dtypes >=0.2.0 + - onednn-cpu-threadpool + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - numpy >=1.23,<3 + - libzlib >=1.3.2,<2.0a0 + - python_abi 3.12.* *_cp312 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - openssl >=3.5.5,<4.0a0 + - onednn >=3.11.1,<4.0a0 + - libre2-11 >=2025.11.5 + - re2 + - libgrpc >=1.78.1,<1.79.0a0 + constrains: + - jax >=0.9.2 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jaxlib?source=hash-mapping + size: 61169713 + timestamp: 1774456652705 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-hf42df4d_1.conda + sha256: ed4b1878be103deb2e4c6d0eea3c9bdddfd7fc3178383927dce7578fb1063520 + md5: 7bdc5e2cc11cb0a0f795bdad9732b0f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LicenseRef-Public-Domain OR MIT + purls: [] + size: 169093 + timestamp: 1733780223643 +- 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.5.0-py312h0a2e395_0.conda + sha256: eec7654c2d68f06590862c6e845cc70987b6d6559222b6f0e619dea4268f5dd5 + md5: cd74a9525dc74bbbf93cf8aa2fa9eb5b + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 77120 + timestamp: 1773067050308 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1386730 + timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + purls: [] + size: 508258 + timestamp: 1664996250081 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 + md5: f92f984b558e6e6204014b16d212b271 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 251086 + timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 + md5: a752488c68f2e7c456bcbd8f16eec275 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 261513 + timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.4-hb700be7_0.conda + sha256: ed1eb569df9bbfcb4b451478eaba03cbd2d26efed88152ad2e4b7b7b2297ef84 + md5: c44c0485271b7b4c92dec39e9f7d096e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 858263 + timestamp: 1777157859593 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239 + md5: 6f7b4302263347698fd24565fbf11310 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1384817 + timestamp: 1770863194876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 + md5: 86f7414544ae606282352fa1e116b41f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 36544 + timestamp: 1769221884824 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h0935d00_1_cpu.conda + build_number: 1 + sha256: d2325979993c71580e571eaa470e0ca33b86acb23c653909fecaef688a1c44b4 + md5: aed984d45692d6211ebf013b62c9fa02 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libgcc >=14 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 6508876 + timestamp: 1778175634414 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_1_cpu.conda + build_number: 1 + sha256: d5e2ca1557393490eb0b921d0dabe6203c685da97c0cf8c5b15c21c2d69b517a + md5: fa76d2ed4b435617a0fe5b8e7b9ae9c1 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-compute 24.0.0 h53684a4_1_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 591773 + timestamp: 1778175876713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_1_cpu.conda + build_number: 1 + sha256: e4ca855698a8005508114a8c197ae7fe48ea37430064253a2055dbb0122f8a39 + md5: 0aac1926c3b2f8c35570af6be677f8ad + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h0935d00_1_cpu + - libgcc >=14 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 2992759 + timestamp: 1778175759450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_1_cpu.conda + build_number: 1 + sha256: 38ce55721b4d2cc776d0e34078ccba63dfd5c141f1f49bb41cd6ae4da10c21e4 + md5: 021214e64486a6ba4df95d64b703f1fb + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-acero 24.0.0 h635bf11_1_cpu + - libarrow-compute 24.0.0 h53684a4_1_cpu + - libgcc >=14 + - libparquet 24.0.0 h7376487_1_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 591861 + timestamp: 1778175957189 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_1_cpu.conda + build_number: 1 + sha256: 9479a863e61e5cc3e3ef395267f23dc1475199f53a96c0d04a168f4b0c97db2a + md5: e3e42803a838c2177759e6aef1363512 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h0935d00_1_cpu + - libarrow-acero 24.0.0 h635bf11_1_cpu + - libarrow-dataset 24.0.0 h635bf11_1_cpu + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501879 + timestamp: 1778175984173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda + sha256: 035eb8b54e03e72e42ef707420f9979c7427776ea99e0f1e3c969f92eb573f19 + md5: d3be7b2870bf7aff45b12ea53165babd + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - fribidi >=1.0.10,<2.0a0 + - libiconv >=1.18,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - harfbuzz >=11.0.1 + license: ISC + purls: [] + size: 152179 + timestamp: 1749328931930 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h5875eb1_mkl.conda + build_number: 6 + sha256: a73ec64c0f60a7733f82a679342bdad88e0230ba8243b12ece13a23aded431f4 + md5: d03e4571f7876dcd4e530f3d07faf333 + depends: + - mkl >=2025.3.1,<2026.0a0 + constrains: + - libcblas 3.11.0 6*_mkl + - liblapack 3.11.0 6*_mkl + - liblapacke 3.11.0 6*_mkl + - blas 2.306 mkl + track_features: + - blas_mkl + - blas_mkl_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18980 + timestamp: 1774503032324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hd24cca6_1.conda + sha256: fef9f2977ac341fd0fd7802bccffff0f220e4896f6fef29040428071d0aa863b + md5: 4dfa9b413062a24e09938fb6f91af821 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 3229874 + timestamp: 1766347309472 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_1.conda + sha256: a46970575b8ec39fe103833ed988bc9d56292146b417aeddb333a94e980053b0 + md5: 5e5227b43bdd65d0028a322b2636d02e + depends: + - libboost 1.90.0 hd24cca6_1 + - libboost-headers 1.90.0 ha770c72_1 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 38562 + timestamp: 1766347475462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_1.conda + sha256: be43ec008a4fd297b5cdccea6c8e05bedd1d40315bdaefe4cc2f75363dab3f73 + md5: a1da1e4c15eb57bb506b33e283107dc5 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 14676487 + timestamp: 1766347330772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e + md5: 72c8fd1af66bd67bf580645b426513ed + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 79965 + timestamp: 1764017188531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b + md5: 366b40a69f0ad6072561c1d09301c886 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 34632 + timestamp: 1764017199083 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d + md5: 4ffbb341c8b616aa2494b6afb26a0c5f + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 298378 + timestamp: 1764017210931 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + sha256: 37c41b1024d0c75da76822e3c079aabaf121618a32fe05e53a897b35a88008fc + md5: 499cd8e2d4358986dbe3b30e8fe1bf6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 124432 + timestamp: 1774333989027 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_hfef963f_mkl.conda + build_number: 6 + sha256: d98a39a8e61af301bf67bf3fb946baff9686864886560cdd48d5259c080c58a5 + md5: 72cf77ee057f87d826f9b98cacd67a59 + depends: + - libblas 3.11.0 6_h5875eb1_mkl + constrains: + - liblapack 3.11.0 6*_mkl + - liblapacke 3.11.0 6*_mkl + - blas 2.306 mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18635 + timestamp: 1774503047304 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + sha256: 7f479f796ba05f22324fb484f53da6f9948395499d7558cc4ff5ec24e91448b1 + md5: af8c5fb71cb5aa4861365af2784fc9ce + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm22 >=22.1.5,<22.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 12827971 + timestamp: 1778479852868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c + md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4518030 + timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb + md5: c3cc2864f82a944bc90a7beb4d3b0e88 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 468706 + timestamp: 1777461492876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 73490 + timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdovi-3.3.2-ha23c83e_4.conda + sha256: d15432f07f654583978712e034d308b103a8b4650f0fdec172b5031a8af2b6c9 + md5: b26a64dfb24fef32d3330e37ce5e4f44 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: [] + size: 311420 + timestamp: 1777838991858 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + purls: [] + size: 310785 + timestamp: 1757212153962 +- 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/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/libegl-devel-1.7.0-ha4b6fd6_2.conda + sha256: f6e7095260305dc05238062142fb8db4b940346329b5b54894a90610afa6749f + md5: b513eb83b3137eca1192c34bf4f013a7 + depends: + - __glibc >=2.17,<3.0.a0 + - libegl 1.7.0 ha4b6fd6_2 + - libgl-devel 1.7.0 ha4b6fd6_2 + - xorg-libx11 + license: LicenseRef-libglvnd + purls: [] + size: 30380 + timestamp: 1731331017249 +- 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/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 + md5: a3b390520c563d78cc58974de95a03e5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.0.* + license: MIT + license_family: MIT + purls: [] + size: 77241 + timestamp: 1777846112704 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + sha256: e755e234236bdda3d265ae82e5b0581d259a9279e3e5b31d745dc43251ad64fb + md5: 47595b9d53054907a00d95e4d47af1d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libogg >=1.3.5,<1.4.0a0 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 424563 + timestamp: 1764526740626 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 + md5: e289f3d17880e44b633ba911d57a321b + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 8049 + timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d + md5: fb16b4b69e3f1dcfe79d80db8fd0c55d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 384575 + timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d + depends: + - libgcc 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27694 + timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + sha256: 245be793e831170504f36213134f4c24eedaf39e634679809fd5391ad214480b + md5: 88c1c66987cd52a712eea89c27104be6 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + purls: [] + size: 177306 + timestamp: 1766331805898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 + depends: + - libgfortran5 15.2.0 h68bc16d_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27655 + timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: 85072b0ad177c966294f129b7c04a2d5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 2483673 + timestamp: 1778269025089 +- 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/libgl-devel-1.7.0-ha4b6fd6_2.conda + sha256: e281356c0975751f478c53e14f3efea6cd1e23c3069406d10708d6c409525260 + md5: 53e7cbb2beb03d69a478631e23e340e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgl 1.7.0 ha4b6fd6_2 + - libglx-devel 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 113911 + timestamp: 1731331012126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 + md5: 17d484ab9c8179c6a6e5b7dbb5065afc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + size: 4754097 + timestamp: 1778508800134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda + sha256: a0105eb88f76073bbb30169312e797ed5449ebb4e964a756104d6e54633d17ef + md5: 8422fcc9e5e172c91e99aef703b3ce65 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=13 + license: SGI-B-2.0 + purls: [] + size: 325262 + timestamp: 1748692137626 +- 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/libglx-devel-1.7.0-ha4b6fd6_2.conda + sha256: 0a930e0148ab6e61089bbcdba25a2e17ee383e7de82e7af10cc5c12c82c580f3 + md5: 27ac5ae872a21375d980bd4a6f99edf3 + depends: + - __glibc >=2.17,<3.0.a0 + - libglx 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-xorgproto + license: LicenseRef-libglvnd + purls: [] + size: 26388 + timestamp: 1731331003255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + sha256: 17ea802cef3942b0a850b8e33b03fc575f79734f3c829cdd6a4e56e2dae60791 + md5: b2baa4ce6a9d9472aaa602b88f8d40ac + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + constrains: + - libgoogle-cloud 3.3.0 *_1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2558266 + timestamp: 1774212240265 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + sha256: 838b6798962039e7f1ed97be85c3a36ceacfd4611bdf76e7cc0b6cd8741edf57 + md5: da94b149c8eea6ceef10d9e408dcfeb3 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 3.3.0 h25dbb67_1 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + size: 779217 + timestamp: 1774212426084 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + sha256: 5bb935188999fd70f67996746fd2dca85ec6204289e11695c316772e19451eb8 + md5: b5fb6d6c83f63d83ef2721dca6ff7091 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7021360 + timestamp: 1774020290672 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + sha256: 5041d295813dfb84652557839825880aae296222ab725972285c5abe3b6e4288 + md5: c197985b58bc813d26b42881f0021c82 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2436378 + timestamp: 1770953868164 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.conda + sha256: 8b70955d5e9a49d08945d4f8e2eab855b2efa5fce9cb9bc5e75d86764e6f2f38 + md5: 3a9428b74c403c71048104d38437b48c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 OR BSD-3-Clause + purls: [] + size: 1435782 + timestamp: 1776989559668 +- 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/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 + md5: 6178c6f2fb254558238ef4e6c56fb782 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 633831 + timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + sha256: 0c8a78c6a42a6e4c6de3a5e82d692f60400d43f4cc80591745f28b37daad9c70 + md5: 850f48943d6b4589800a303f0de6a816 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1846962 + timestamp: 1777065125966 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h5e43f62_mkl.conda + build_number: 6 + sha256: 8715428e721a63880d4e548375a744f177200a5161aec3ebe533f33eaf7ec3a5 + md5: 8b13738802df008211c9ecd08775ca21 + depends: + - libblas 3.11.0 6_h5875eb1_mkl + constrains: + - libcblas 3.11.0 6*_mkl + - liblapacke 3.11.0 6*_mkl + - blas 2.306 mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18634 + timestamp: 1774503062183 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_hdba1596_mkl.conda + build_number: 6 + sha256: 6cfab7df054c7935ed7551ec367332a1134d3b8b0d7060261e2e624c845147cc + md5: 5efff83ae645656f28c826aa192e7651 + depends: + - libblas 3.11.0 6_h5875eb1_mkl + - libcblas 3.11.0 6_hfef963f_mkl + - liblapack 3.11.0 6_h5e43f62_mkl + constrains: + - blas 2.306 mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18668 + timestamp: 1774503077124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.5-hf7376ad_1.conda + sha256: 094198dc5c7fbd85e3719d192d5b77c3f0dccf657dfd9ba0c79e391f11f7ace2 + md5: 6adc0202fa7fcf0a5fce8c31ef2ed866 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 44241856 + timestamp: 1778417624650 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + size: 113478 + timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + sha256: 7858f6a173206bc8a5bdc8e75690483bb66c0dcc3809ac1cb43c561a4723623a + md5: 55c20edec8e90c4703787acaade60808 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - liblzma 5.8.3 hb03c661_0 + license: 0BSD + purls: [] + size: 491429 + timestamp: 1775825511214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_104.conda + sha256: 7deab19f51934a5bfdf8eec10721d91a02c6a27632471527b07ece8f0d2c7a8e + md5: e9e60f617e5545e1a7de60c2d01f8029 + depends: + - __glibc >=2.17,<3.0.a0 + - blosc >=1.21.6,<2.0a0 + - bzip2 >=1.0.8,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzip >=1.11.2,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 862900 + timestamp: 1776686244733 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 2a45e7f8af083626f009645a6481f12d + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 663344 + timestamp: 1773854035739 +- 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/libogg-1.3.5-hd0c01bc_1.conda + sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 + md5: 68e52064ed3897463c0e958ab5c8f91b + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 218500 + timestamp: 1745825989535 +- 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/libopengl-devel-1.7.0-ha4b6fd6_2.conda + sha256: b347798eba61ce8d7a65372cf0cf6066c328e5717ab69ae251c6822e6f664f23 + md5: 75b039b1e51525f4572f828be8441970 + depends: + - __glibc >=2.17,<3.0.a0 + - libopengl 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 15460 + timestamp: 1731331007610 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + sha256: 5126b75e7733de31e261aa275c0a1fd38b25fdfff23e7d7056ebd6ca76d11532 + md5: c360be6f9e0947b64427603e91f9651f + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 ha770c72_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 934274 + timestamp: 1774001192674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + sha256: fec2ba047f7000c213ca7ace5452435197c79fbcb1690da7ce85e99312245984 + md5: cb93c6e226a7bed5557601846555153d + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 396403 + timestamp: 1774001149705 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.0.0-hb56ce9e_1.conda + sha256: a396a2d1aa267f21c98717ac097138b32e41e4c40ae501729bded3801476eeb5 + md5: 9f0596e995efe372c470ff45c93131cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 6582302 + timestamp: 1772727204779 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.0.0-hd85de46_1.conda + sha256: 286de85805dc69ce0bd25367ae2a20c8096ddef35eb2483474eb246dacd5387e + md5: ee41df976413676f794af2785b291b0c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 114431 + timestamp: 1772727230331 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.0.0-hd85de46_1.conda + sha256: 9988ed6339a5eb044ae8d079e2b22f5a310c41e49a0cf716057f30b21ef9cec2 + md5: ca025fa5c42ba94453636a2ae333de6b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 249056 + timestamp: 1772727247597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.0.0-hd41364c_1.conda + sha256: c7db498aeda5b0f36b347f4211b93b66ba108faaf54157a08bae8fa3c3af5f81 + md5: 07a23e96db38f63d9763f666b2db66aa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - pugixml >=1.15,<1.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 211582 + timestamp: 1772727264950 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.0.0-hb56ce9e_1.conda + sha256: 01a28c0bd1f205b3800e7759e30bc8e8a75836e0d5a73a745b4da42837bbb174 + md5: b43b96578573ddbcc8d084ae6e44c964 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 13173323 + timestamp: 1772727282718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.0.0-hb56ce9e_1.conda + sha256: 720b87e1d5f1a10c577e040d4bf425072a978e925c6dfab8b1551bc848007c94 + md5: 26e8e92c90d1a22af6eac8e9507d9b8f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - ocl-icd >=2.3.3,<3.0a0 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 11402462 + timestamp: 1772727323957 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.0.0-hb56ce9e_1.conda + sha256: df7eb2b23a1af38f2cd2281353309f2e2a04da1374ecedc7c6745c2a67ba617c + md5: 01ba8b179ac45b2b37fe2d4225dddcc7 + depends: + - __glibc >=2.17,<3.0.a0 + - level-zero >=1.28.2,<2.0a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1994640 + timestamp: 1772727360780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.0.0-hd41364c_1.conda + sha256: 8e7356b0b80b3f180615e264694d6811d388b210155d419553ff64e42f78ffa0 + md5: aa002c4d343b01cdcc458c95cd071d1b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + - pugixml >=1.15,<1.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 192778 + timestamp: 1772727380069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.0.0-h7a07914_1.conda + sha256: 35a68214201e807bd9a31f94e618cb6a5385198e89eef46dde6c122cff77da58 + md5: 218084544c2e7e78e4b8877ec37b8cdb + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1860687 + timestamp: 1772727397981 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.0.0-h7a07914_1.conda + sha256: cb37b717480207a66443a93d4342cf88210a74c0820fc0edd70e4fc791a64779 + md5: 74915e5e271ef76a89f711eff5959a75 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 684224 + timestamp: 1772727417276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.0.0-hecca717_1.conda + sha256: 086469e5cd8bfde48975fe8641a7d6924e3da00d75dd06c99e03a78df03a0568 + md5: 559ef86008749861a53025f669004f18 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1185558 + timestamp: 1772727435039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.0.0-h78e8023_1.conda + sha256: 3a9a404bc9fd39e7395d49f4bd8facb58a01a31aeceabe8723a9d4f8eb5cc381 + md5: fb20f4234bc0e29af1baa13d35e36785 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1257870 + timestamp: 1772727453738 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.0.0-hecca717_1.conda + sha256: e7cee37c92ed0b62c0458c13937b6ad66319f1879f236a31c3a67391a999f429 + md5: 0f0281435478b981f672a44d0029018c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libopenvino 2026.0.0 hb56ce9e_1 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 456585 + timestamp: 1772727473378 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda + sha256: f1061a26213b9653bbb8372bfa3f291787ca091a9a3060a10df4d5297aad74fd + md5: 2446ac1fe030c2aa6141386c1f5a6aed + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 324993 + timestamp: 1768497114401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_1_cpu.conda + build_number: 1 + sha256: 65d6ba055d872911d30f55b8bf2880ff05f57f2a9cc59447be1dccce07f68109 + md5: 5e60f3c311d00d456f089177bb75ebaf + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h0935d00_1_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1426881 + timestamp: 1778175848424 +- 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/libplacebo-7.360.1-h9eeb4b2_0.conda + sha256: 26cbbd3d7b91801826c779c3f7e87d071856d5cbe3d55b22777ca0d984fb02ed + md5: e6324dfe6c02e0736bb9235f8ef3c8a6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libdovi >=3.3.2,<4.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - lcms2 >=2.19,<3.0a0 + - shaderc >=2026.2,<2026.3.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 549348 + timestamp: 1777835950707 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 + md5: eba48a68a1a2b9d3c0d9511548db85db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 317729 + timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f + md5: 405ec206d230d9d37ad7c2636114cbf4 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.5,<4.0a0 + license: PostgreSQL + purls: [] + size: 2865686 + timestamp: 1772136328077 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + sha256: afbf195443269ae10a940372c1d37cda749355d2bd96ef9587a962abd87f2429 + md5: 11ac478fa72cf12c214199b8a96523f4 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3638698 + timestamp: 1769749419271 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + sha256: 138fc85321a8c0731c1715688b38e2be4fb71db349c9ab25f685315095ae70ff + md5: ced7f10b6cfb4389385556f47c0ad949 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 213122 + timestamp: 1768190028309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + sha256: dc4698b32b2ca3fc0715d7d307476a71622bee0f2f708f9dadec8af21e1047c8 + md5: a4b87f1fbcdbb8ad32e99c2611120f2e + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.5,<3.0a0 + - harfbuzz >=13.1.1 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __glibc >=2.17 + license: LGPL-2.1-or-later + purls: [] + size: 3474421 + timestamp: 1773814909137 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + sha256: 7a58892a52739ce4c0f7109de9e91b4353104748eb04fc6441d88e8af444ba99 + md5: 67eef12ce33f7ff99900c212d7076fc2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + - libstdcxx >=15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 7930689 + timestamp: 1778269054623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + sha256: 57cb5f92110324c04498b96563211a1bca6a74b2918b1e8df578bfed03cc32e4 + md5: 067590f061c9f6ea7e61e3b2112ed6b3 + depends: + - __glibc >=2.17,<3.0.a0 + - lame >=3.100,<3.101.0a0 + - libflac >=1.5.0,<1.6.0a0 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + - libopus >=1.5.2,<2.0a0 + - libstdcxx >=14 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.9,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 355619 + timestamp: 1765181778282 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 + md5: 7af961ef4aa2c1136e11dd43ded245ab + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: ISC + purls: [] + size: 277661 + timestamp: 1772479381288 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d + md5: 7dc38adcbf71e6b38748e919e16e0dce + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + size: 954962 + timestamp: 1777986471789 +- 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/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_19 + constrains: + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 + depends: + - libstdcxx 15.2.0 h934c35e_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27776 + timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + sha256: c5008b602cb5c819f7b52d418b3ed17e1818cbbf6705b189e7ab36bb70cce3d8 + md5: 8ee3cb7f64be0e8c4787f3a4dbe024e6 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.77,<2.78.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + size: 492799 + timestamp: 1773797095649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_cc-2.19.1-cpu_ha812d39_5.conda + sha256: 324ca9745318b6ea5d4b208bfea2ac81005289cd339ddb0dcce850ceca61acbb + md5: 05ebb4d47388230ef273ce047083c991 + depends: + - libml_dtypes-headers >=0.5.1,<0.6 + - libtensorflow_framework ==2.19.1 cpu_h0a5eddc_5 + - libstdcxx >=14 + - libgcc >=14 + - _x86_64-microarch-level >=1 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.6,<4.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - giflib >=5.2.2,<5.3.0a0 + - libzlib >=1.3.2,<2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libcurl >=8.20.0,<9.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - icu >=78.3,<79.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 159026496 + timestamp: 1778107988940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtensorflow_framework-2.19.1-cpu_h0a5eddc_5.conda + sha256: 83cf93ea6c2ce1eb11e1bffd5ac84e4120add4c4005300f07f869a980f7537a8 + md5: cfc4b8f6b8e2df761155fbf67280832c + depends: + - libstdcxx >=14 + - libgcc >=14 + - _x86_64-microarch-level >=1 + - __glibc >=2.17,<3.0.a0 + - openssl >=3.5.6,<4.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - giflib >=5.2.2,<5.3.0a0 + - libzlib >=1.3.2,<2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libcurl >=8.20.0,<9.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - icu >=78.3,<79.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 10327786 + timestamp: 1778107988940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda + sha256: 50c8cd416ac8425e415264de167b41ae8442de22a91098dfdd993ddbf9f13067 + md5: 553281a034e9cf8693c9df49f6c78ea1 + depends: + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.5,<1.4.0a0 + - libvorbis 1.3.* + - libvorbis >=1.3.7,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 328924 + timestamp: 1719667859099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + sha256: af6025aa4a4fc3f4e71334000d2739d927e2f678607b109ec630cc17d716918a + md5: b6e326fbe1e3948da50ec29cee0380db + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 423861 + timestamp: 1777018957474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 + md5: cd5a90476766d53e901500df9215e927 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.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: 435273 + timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.10.0-cpu_mkl_h7058990_103.conda + sha256: 92d93119edc7a058987a72984e07a434f999031fcc7a0c851d28cb87c372128a + md5: 2df90510834746b1f52c5299bc99a81f + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=22.1.0 + - mkl >=2025.3.0,<2026.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch-cpu 2.10.0 + - pytorch-gpu <0.0a0 + - pytorch 2.10.0 cpu_mkl_*_103 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 61645121 + timestamp: 1772260200165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + sha256: 1a1e367c04d66030aa93b4d33905f7f6fbb59cfc292e816fe3e9c1e8b3f4d1e2 + md5: 2c2270f93d6f9073cbf72d821dfc7d72 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.77,<2.78.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + size: 145087 + timestamp: 1773797108513 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a + md5: e179a69edd30d75c0144d7a380b88f28 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 75995 + timestamp: 1757032240102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda + sha256: 3d17b7aa90610afc65356e9e6149aeac0b2df19deda73a51f0a09cf04fd89286 + md5: 56f65185b520e016d29d01657ac02c0d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 154203 + timestamp: 1770566529700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + sha256: 89c84f5b26028a9d0f5c4014330703e7dff73ba0c98f90103e9cef6b43a5323c + md5: d17e3fb595a9f24fa9e149239a33475d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libudev1 >=257.4 + license: LGPL-2.1-or-later + purls: [] + size: 89551 + timestamp: 1748856210075 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 + md5: 1247168fe4a0b8912e3336bccdbf98a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 85969 + timestamp: 1768735071295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40297 + timestamp: 1775052476770 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b + md5: 0f03292cc56bf91a077a134ea8747118 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 895108 + timestamp: 1753948278280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda + sha256: 255c7d00b54e26f19fad9340db080716bced1d8539606e2b8396c57abd40007c + md5: 25813fe38b3e541fc40007592f12bae5 + depends: + - __glibc >=2.17,<3.0.a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libglx >=1.7.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - wayland >=1.24.0,<2.0a0 + - wayland-protocols + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 221308 + timestamp: 1765652453244 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + sha256: ca494c99c7e5ecc1b4cd2f72b5584cef3d4ce631d23511184411abcbb90a21a5 + md5: b4ecbefe517ed0157c37f8182768271c + depends: + - libogg + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 285894 + timestamp: 1753879378005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.16.0-h54a6638_0.conda + sha256: 38850657dd6835613ef16b34895a54bea98bc7639db6a649c886b331635714fc + md5: 9f6b0090c3902b2c763a16f7dace7b6e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - intel-media-driver >=26.1.2,<26.2.0a0 + - libva >=2.23.0,<3.0a0 + license: MIT + license_family: MIT + purls: [] + size: 287992 + timestamp: 1772980546550 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.15.2-hecca717_0.conda + sha256: 8e1119977f235b488ab32d540c018d3fd1eccefc3dd3859921a0ff555d8c10d2 + md5: 10f5008f1c89a40b09711b5a9cdbd229 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1070048 + timestamp: 1762010217363 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda + sha256: a68280d57dfd29e3d53400409a39d67c4b9515097eba733aa6fe00c880620e2b + md5: 31ad065eda3c2d88f8215b1289df9c89 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + constrains: + - libvulkan-headers 1.4.341.0.* + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 199795 + timestamp: 1770077125520 +- 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/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/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.13.1-hca5e8e5_0.conda + sha256: d2195b5fbcb0af1ff7b345efdf89290c279b8d1d74f325ae0ac98148c375863c + md5: 2bca1fbb221d9c3c8e3a155784bbc2e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 837922 + timestamp: 1764794163823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a + md5: e79d2c2f24b027aa8d5ab1b1ba3061e7 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + size: 559775 + timestamp: 1776376739004 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba + md5: 995d8c8bad2a3cc8db14675a153dec2b + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 hca6bf5a_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 46810 + timestamp: 1776376751152 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 + md5: 87e6096ec6d542d1c1f8b33245fe8300 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: MIT + license_family: MIT + purls: [] + size: 245434 + timestamp: 1757963724977 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + sha256: 991e7348b0f650d495fb6d8aa9f8c727bdf52dabf5853c0cc671439b160dce48 + md5: a7b27c075c9b7f459f1c022090697cba + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 109043 + timestamp: 1730442108429 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.5-h4922eb0_1.conda + sha256: dae1fe2195dd1da5a8a565255c738f19c0b71490ddeee5d0fc9c5b037b19107c + md5: f66101d2eb5de2924c10a63bbfa2926e + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - openmp 22.1.5|22.1.5.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 6128130 + timestamp: 1778447746870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py312h7424e68_1.conda + sha256: 27b34a24cc4c872d328b07319ae5ab6673d5c94ec923cde5b1f3ac7f59b95dd0 + md5: 49f23211559c82cf8c5ffac112fe73b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 34127488 + timestamp: 1776076739766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + sha256: e8ae9141c7afcc95555fca7ff5f91d7a84f094536715211e750569fd4bb2caa4 + md5: a669145a2c834895bdf3fcba1f1e5b9c + depends: + - python + - lz4-c + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - lz4-c >=1.10.0,<1.11.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/lz4?source=hash-mapping + size: 44154 + timestamp: 1765026394687 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + sha256: 5f3aad1f3a685ed0b591faad335957dbdb1b73abfd6fc731a0d42718e0653b33 + md5: 93a4752d42b12943a355b682ee43285b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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: 26057 + timestamp: 1772445297924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + sha256: cdd59bb1a52b09979f11c68909d53120b2e749edd1992853a74e1604db19c8b0 + md5: 579c6a324b197594fabc9240bddf2d8b + depends: + - matplotlib-base >=3.10.9,<3.10.10.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: 17831 + timestamp: 1777000588302 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + sha256: c7e133837376e53e6a52719c205a3067c42f05769bc3e8307417f8d817dfc63e + md5: 7d499b5b6d150f133800dc3a582771c7 + 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.14.3 + - libfreetype6 >=2.14.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=hash-mapping + size: 8336056 + timestamp: 1777000573501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mesalib-26.0.3-h8cca3c9_0.conda + sha256: 3e6385e04e5a8f62599a5eb72b9a8c65ac143f0621d57f24688f103276d686eb + md5: 823e4ae1d60e97845773f7358585fc56 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - xorg-libxshmfence >=1.3.3,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - libexpat >=2.7.4,<3.0a0 + - spirv-tools >=2026,<2027.0a0 + - libllvm22 >=22.1.1,<22.2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libdrm >=2.4.125,<2.5.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2964576 + timestamp: 1773867966762 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2025.3.1-h0e700b2_12.conda + sha256: ed9609e4687c64532d829e466eda9fa1a8ae25938144fba3a3a20df804d796fd + md5: 1a4a54fad5e36b8282ec6208dcb9bfb7 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - llvm-openmp >=22.1.4 + - onemkl-license 2025.3.1 hf2ce2f3_12 + - tbb >=2022.3.0 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 125389937 + timestamp: 1778104806895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2025.3.1-ha770c72_12.conda + sha256: 8591a94c590696f68a296a7e5bddc5f302682e150223343435e8a8e41d39fa57 + md5: db484eb7d5c23ca2a3129ddf5943de76 + depends: + - mkl 2025.3.1 h0e700b2_12 + - mkl-include 2025.3.1 hf2ce2f3_12 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 40096 + timestamp: 1778104976625 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2025.3.1-hf2ce2f3_12.conda + sha256: ce12982af07a2a18e4c3189b2d95226cd74f0e7d7e3f31129d50e05f928b956e + md5: c6e7262ad8afd5fe1d64554cfa456060 + depends: + - onemkl-license 2025.3.1 hf2ce2f3_12 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 692947 + timestamp: 1778105007431 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.7.1-py312h4307cf8_0.conda + sha256: e4a60b68d4fbf6030e4a59c9adfa5f35e8a6e3db0ad9ac460717b1892c692919 + md5: 7a21dfd59f3c33ed62c7f47b67032726 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - mkl >=2025.3.1,<2026.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mkl-service?source=hash-mapping + size: 77620 + timestamp: 1778374074379 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.4-np2py312h0f77346_1.conda + sha256: e4d06cb57b23319ecee6c2a488c43c6e91c215cdc47a47eb08316beaf3412951 + md5: 657a00c06d327012fb3002e5600b2976 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 344784 + timestamp: 1771362527782 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + sha256: c1fdeebc9f8e4f51df265efca4ea20c7a13911193cc255db73cccb6e422ae486 + md5: 770d00bf57b5599c4544d61b61d8c6c6 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=14 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 100245 + timestamp: 1774472435333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda + sha256: 8690f550a780f75d9c47f7ffc15f5ff1c149d36ac17208e50eda101ca16611b9 + md5: 85ce2ffa51ab21da5efa4a9edc5946aa + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=14 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 730422 + timestamp: 1773413915171 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + purls: [] + size: 491140 + timestamp: 1730581373280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + sha256: 94068fd39d1a672f8799e3146a18ba4ef553f0fcccefddb3c07fbdabfd73667a + md5: 2e489969e38f0b428c39492619b5e6e5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/msgpack?source=hash-mapping + size: 102525 + timestamp: 1762504116832 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + sha256: 0da7e7f4e69bfd6c98eff92523e93a0eceeaec1c6d503d4a4cd0af816c3fe3dc + md5: 17c77acc59407701b54404cfd3639cac + 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/multidict?source=hash-mapping + size: 100056 + timestamp: 1771611023053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.19-py312h5253ce2_0.conda + sha256: 12e6f7a136ddd7e254d79e18f8815d268967a22e66617b377599fe51dc1269f6 + md5: 7efbcffe0c84f219ae981478106c55f5 + depends: + - python + - dill >=0.4.1 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 368525 + timestamp: 1769086764893 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.20.2-py312h4c3975b_0.conda + sha256: 2c03499b0f267a29321ce198a86285449eca2bb685e883703ef564a2ce641802 + md5: e3174d3f01d539ffd867a85639a8d9b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - mypy_extensions >=1.0.0 + - pathspec >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python-librt >=0.8.0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 22035539 + timestamp: 1776802000447 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause + purls: [] + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_107.conda + noarch: python + sha256: e78690e717e0d7a7ea73ff378f28b6eeaf6341e2ee7123e54b6a64bcf738d80c + md5: ef14eaaa377836b3b18ab8a6b07bf9fa + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.2,<2.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<3 + - libnetcdf >=4.10.0,<4.10.1.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/netcdf4?source=hash-mapping + size: 1093921 + timestamp: 1774640040842 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + sha256: fd2cbd8dfc006c72f45843672664a8e4b99b2f8137654eaae8c3d46dca776f63 + md5: 16c2a0e9c4a166e53632cfca4f68d020 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 136216 + timestamp: 1758194284857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py312hd1dde6f_1.conda + sha256: 6c758c97b06e0bb99e425edce981610b2db9f95c0996f48288a031d847981193 + md5: acd0d3547b3cb443a5ce9124412b6295 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - cudatoolkit >=11.2 + - tbb >=2021.6.0 + - cuda-version >=11.2 + - cuda-python >=11.6 + - libopenblas !=0.3.6 + - scipy >=1.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 5707782 + timestamp: 1778390479325 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpoly-1.3.9-py312h4c3975b_0.conda + sha256: 2c4fea0a720e804d2123fa8dee10e5bcefca90b57261e16dd840c221584340d9 + md5: ffdb995c61931c580daf240d3c9c8af1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + - six + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpoly?source=hash-mapping + size: 248872 + timestamp: 1767373959403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda + sha256: 77f301d5e31c91935aaeebf7d1f408dbd927e04d43a5991de52d26f92b2267f2 + md5: 98f04b59a222970c45c78208aeac8df8 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libblas >=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=compressed-mapping + size: 8756150 + timestamp: 1778655435430 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda + sha256: 2254dae821b286fb57c61895f2b40e3571a070910fdab79a948ff703e1ea807b + md5: 56f8947aa9d5cf37b0b3d43b83f34192 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - opencl-headers >=2024.10.24 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 106742 + timestamp: 1743700382939 +- conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.11.1-threadpool_h77e0eb8_0.conda + sha256: 727b2ab3ed9c07a5dd037b385075d60fa6003ae092ea7096dc6a0f514b512f7f + md5: 3098db15ec2d7215e1799fa14feb18a2 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + track_features: + - onednn-p-0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 12922846 + timestamp: 1773758695054 +- conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-cpu-threadpool-3.11.1-threadpool_h3c4d5c8_0.conda + sha256: 16c52b70ea1645408de246ae09e51b36a9a15343930ba681cf3017e8f2110da5 + md5: 03d6d4b1ca5fff17bda0e937e7810c2c + depends: + - onednn ==3.11.1 threadpool_h77e0eb8_0 + - onednn >=3.11.1,<4.0a0 + track_features: + - onednn-cpu-threadpool-p-0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 10835 + timestamp: 1773758695054 +- conda: https://conda.anaconda.org/conda-forge/linux-64/onemkl-license-2025.3.1-hf2ce2f3_12.conda + sha256: bdc5e2eec18512a21ab330d5b2b3dd8b285410f4076efc5379a2ef193d81b832 + md5: 95321ce2d03500a23a6e80034cbd4804 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 40041 + timestamp: 1778104572837 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda + sha256: 8de2f0cd8a659b01abf86e7fbb8cea4f28ada62fd288429a2bbc040db1b98dd0 + md5: c930c8052d780caa41216af7de472226 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 55754 + timestamp: 1773844383536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda + sha256: 3f231f2747a37a58471c82a9a8a80d92b7fece9f3fce10901a5ac888ce00b747 + md5: b28cf020fd2dead0ca6d113608683842 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 731471 + timestamp: 1739400677213 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d + md5: 11b3379b191f63139e29c0d19dee24cd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 355400 + timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + sha256: 21c4f6c7f41dc9bec2ea2f9c80440d9a4d45a6f2ac13243e658f10dcf1044146 + md5: 680608784722880fbfe1745067570b00 + depends: + - __glibc >=2.17,<3.0.a0 + - cyrus-sasl >=2.1.28,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.6,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + purls: [] + size: 786149 + timestamp: 1775741359582 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb + md5: da1b85b6a87e141f5140bb9924cecab0 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3167099 + timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.19.1-py312hd9148b4_0.conda + sha256: ff6a3f9124d112541f2557e8b40c00dbca9aaf5e254cd16fb485e8ad925c48d6 + md5: 5a9273e06750ca36e478c142813e59a8 + 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: 492574 + timestamp: 1778047684091 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + sha256: a60c2578c8422e0c67206d269767feb4d3e627511558b6866e5daf2231d5214d + md5: 8027fce94fdfdf2e54f9d18cbae496df + depends: + - tzdata + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1468651 + timestamp: 1773230208923 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py312h8ecdadd_0.conda + sha256: 009408dcfdc789b8a1748d6a63fd2134ea2edc8474231ea7beba0ac3ad772a37 + md5: 15c437bfa4cbddd379b95357c9aa4150 + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=compressed-mapping + size: 14872605 + timestamp: 1778602625175 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda + sha256: d46f76ed09396e3bd1dc11030b3d0d222c25ba8d92f3cde08bc6fbd1eec4f9e0 + md5: de8ccf9ffba55bd20ee56301cfc7e6db + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 22364689 + timestamp: 1773933354952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + sha256: 315b52bfa6d1a820f4806f6490d472581438a28e21df175290477caec18972b0 + md5: d53ffc0edc8eabf4253508008493c5bc + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 458036 + timestamp: 1774281947855 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff + md5: 7a3bff861a6583f1889021facefc08b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1222481 + timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda + sha256: fa291f8915114733dc1df9f1627b8c63c517217c1eee1a6ede2ceb5e368cf27a + md5: 9e5609720e31213d4f39afe377f6217e + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - lcms2 >=2.18,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - openjpeg >=2.5.4,<3.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - zlib-ng >=2.3.3,<2.4.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 1039561 + timestamp: 1775060059882 +- 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/linux-64/proj-9.8.1-he0df7b0_0.conda + sha256: dff6f355025b9a510d9093e29fd970fa1091e758b848c9dec814d96ae63a09ba + md5: b23619e5e9009eaa070ead0342034027 + depends: + - sqlite + - libtiff + - libcurl + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libsqlite >=3.53.0,<4.0a0 + - libcurl >=8.19.0,<9.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + purls: [] + size: 3652144 + timestamp: 1775840249166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + sha256: d0ff67d89cf379a9f0367f563320621f0bc3969fe7f5c85e020f437de0927bb4 + md5: 0cf580c1b73146bb9ff1bbdb4d4c8cf9 + 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/propcache?source=hash-mapping + size: 54233 + timestamp: 1744525107433 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + sha256: 53997629b27a2465989f23e3a6212cfcc19f51c474d8f89905bb99859140ee88 + md5: 0aee4f9ff95fc4bc78264a93e2a74adf + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 481654 + timestamp: 1773265949321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda + sha256: d834fd656133c9e4eaf63ffe9a117c7d0917d86d89f7d64073f4e3a0020bd8a7 + md5: dd94c506b119130aef5a9382aed648e7 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 225545 + timestamp: 1769678155334 +- 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/linux-64/pugixml-1.15-h3f63f65_0.conda + sha256: 23c98a5000356e173568dc5c5770b53393879f946f3ace716bbdefac2a8b23d2 + md5: b11a4c6bf6f6f44e5e143f759ffa2087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + purls: [] + size: 118488 + timestamp: 1736601364156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + sha256: 0a0858c59805d627d02bdceee965dd84fde0aceab03a2f984325eec08d822096 + md5: b8ea447fdf62e3597cb8d2fae4eb1a90 + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.16.2,<2.0a0 + - libgcc >=14 + - libglib >=2.86.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.10 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_3 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 750785 + timestamp: 1763148198088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + sha256: ce11f466f0dcfc41bd0ef3719adb396fbffa6b866aac75c9242938fa58e546d5 + md5: f9ced0be11f0d3120336e4171a121c2a + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 26787 + timestamp: 1776927989772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + sha256: cb2c89aeb97a97572869200e37c153098c5877c7be4774f045459976e0f70233 + md5: fe5033add07e3cf4876fd091b5fecf31 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.23,<3 + - apache-arrow-proc * cpu + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5401544 + timestamp: 1776927982900 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda + sha256: cc84dd07811861c800fb3f0df3fb64ea579adcb518a5daac6e1089baabd697d1 + md5: 6e4d8ed581cc576435d366372054ac71 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.4.1 + - libgcc >=14 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1159724 + timestamp: 1772171238138 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_3.conda + sha256: c30432bb07d396600db971a775cd54506c8cb9e3fe494a4df3f169b8c1d15a1e + md5: 3cc6b6c3dce5070ae78f106bb3840e7b + depends: + - python + - qt6-main 6.11.0.* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - qt6-main >=6.11.0,<6.12.0a0 + - libgl >=1.7.0,<2.0a0 + - libxslt >=1.1.43,<2.0a0 + - python_abi 3.12.* *_cp312 + - libegl >=1.7.0,<2.0a0 + - libclang13 >=21.1.8 + - libopengl >=1.7.0,<2.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=hash-mapping + - pkg:pypi/shiboken6?source=hash-mapping + size: 13642640 + timestamp: 1778540462882 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.38.3-py312hc487a0d_0.conda + sha256: 01d6ce3754dfba3221f833498cb8acb06539d1d50242bf01b9a27bc6075f7c40 + md5: 941e257b3ce5a125a96845295f452831 + depends: + - python + - pytensor-base ==2.38.3 np2py312h0f77346_0 + - gxx + - blas * mkl + - mkl-service + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 11731 + timestamp: 1777368340257 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.38.3-np2py312h0f77346_0.conda + sha256: 9c7bbc16e983fb4182e716ab0edbc2bd695a5c4d62490502b86d42102ad3d77b + md5: 5fbd698baa8be761d82d1c0c063b959b + depends: + - python + - setuptools >=59.0.0 + - scipy >=1,<2 + - numpy >=2.0 + - numba >=0.58,<=0.65.1 + - filelock >=3.15 + - etuples + - logical-unification + - minikanren + - cons + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pytensor?source=hash-mapping + size: 2783027 + timestamp: 1777368340257 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + sha256: a44655c1c3e1d43ed8704890a91e12afd68130414ea2c0872e154e5633a13d7e + md5: 7eccb41177e15cc672e1babe9056018e + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.4,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libuuid >=2.41.3,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31608571 + timestamp: 1772730708989 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.11.0-py312h5253ce2_0.conda + sha256: 6aa36a62db36c2aa144640a3fba1cd3c61dd679a979288eae2fd3b9f89ef4eac + md5: 0a73899771633857390eac009995e5f9 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=hash-mapping + size: 157857 + timestamp: 1778511616936 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytokens-0.4.1-py312h5253ce2_1.conda + sha256: 489b60e2f05899e90968dda78284c6f4de3dbd0f448d120b643e0b13204d6a1f + md5: 0f13f49b4b337e03e76e2fda784a3e25 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytokens?source=hash-mapping + size: 279237 + timestamp: 1771613646515 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.10.0-cpu_mkl_py312_hca44ed5_103.conda + sha256: 0ac2511916f1e82e436e432e9e2c08471e58480f95435716f28ec5bd618ee9ce + md5: 4ecb7390be8580b0b2116bbc1fdda486 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - libtorch 2.10.0 cpu_mkl_h7058990_103 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=22.1.0 + - mkl >=2025.3.0,<2026.0a0 + - mpmath <1.4 + - networkx + - numpy >=1.23,<3 + - optree >=0.13.0 + - pybind11 <3.0.2 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.10.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 24291825 + timestamp: 1772260740719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf + md5: 15878599a87992e44c059731771591cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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: 198293 + timestamp: 1770223620706 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + noarch: python + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 + md5: 082985717303dab433c976986c674b35 + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - zeromq >=4.3.5,<4.4.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 211567 + timestamp: 1771716961404 +- 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/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda + sha256: d2cb212a4abd66c13df44771c22ee23c0b013ba1d5dbb5e10e8a13e261a47c6b + md5: c81127acb50fdc7760682495fc9ab088 + depends: + - libxcb + - xcb-util + - xcb-util-wm + - xcb-util-keysyms + - xcb-util-image + - xcb-util-renderutil + - xcb-util-cursor + - libgl-devel + - libegl-devel + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - dbus >=1.16.2,<2.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - libxcb >=1.17.0,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - icu >=78.3,<79.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - wayland >=1.25.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - harfbuzz >=14.1.0 + - libsqlite >=3.53.0,<4.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libtiff >=4.7.1,<4.8.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - libcups >=2.3.3,<2.4.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - xcb-util-cursor >=0.1.6,<0.2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xorg-libsm >=1.2.6,<2.0a0 + - libpq >=18.3,<19.0a0 + - libglib >=2.86.4,<3.0a0 + constrains: + - qt ==6.11.0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 59928585 + timestamp: 1776322501700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + sha256: 3fc684b81631348540e9a42f6768b871dfeab532d3f47d5c341f1f83e2a2b2b2 + md5: 66a715bc01c77d43aca1f9fcb13dde3c + depends: + - libre2-11 2025.11.05 h0dc7533_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 27469 + timestamp: 1768190052132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + sha256: 62f46e85caaba30b459da7dfcf3e5488ca24fd11675c33ce4367163ab191a42c + md5: 3ffc5a3572db8751c2f15bacf6a0e937 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 383750 + timestamp: 1764543174231 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py312h5253ce2_1.conda + sha256: dc520329bdfd356e2f464393f8ad9b8450fd5a269699907b2b8d629300c2c068 + md5: 84aa470567e2211a2f8e5c8491cdd78c + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml-clib?source=hash-mapping + size: 148221 + timestamp: 1766159515069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.12-h994f30f_0.conda + noarch: python + sha256: 98c771464ed93a2733bae460c39cfa9640feb20972d2e651b44e85db296942eb + md5: 3c8f229055ad244fa3a97c6c45b77099 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 9266480 + timestamp: 1778119386343 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda + sha256: 856866fd519b812db3e092aba308248dd87b5c308186fcffe593f309373ae94c + md5: 3f578c7d2b0bb52469340e4060d48d94 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 387306 + timestamp: 1777466173323 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + sha256: 23c643c37fafa14ba3f2b7a407126ea5e732a3655ea8157cf9f977098f863448 + md5: 38decbeae260892040709cafc0514162 + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.3.0 + - threadpoolctl >=3.2.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - _openmp_mutex >=4.5 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9726193 + timestamp: 1765801245538 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + sha256: e3ad577361d67f6c078a6a7a3898bf0617b937d44dc4ccd57aa3336f2b5778dd + md5: 3e38daeb1fb05a95656ff5af089d2e4c + 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.7 + - 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: 17109648 + timestamp: 1771880675810 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + sha256: 987ad072939fdd51c92ea8d3544b286bb240aefda329f9b03a51d9b7e777f9de + md5: cdd138897d94dc07d99afe7113a07bec + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgl >=1.7.0,<2.0a0 + - sdl3 >=3.2.22,<4.0a0 + - libegl >=1.7.0,<2.0a0 + license: Zlib + purls: [] + size: 589145 + timestamp: 1757842881000 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.8-hdeec2a5_0.conda + sha256: bec327fffc08369afe4c1384a5b50cac9b38e7af42ebdf5f89628633bd980dbd + md5: 508bad511e617479f0ad60cc49fba903 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - libgl >=1.7.0,<2.0a0 + - libunwind >=1.8.3,<1.9.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - libegl >=1.7.0,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + - libudev1 >=257.13 + - xorg-libxext >=1.3.7,<2.0a0 + - libusb >=1.0.29,<2.0a0 + - wayland >=1.25.0,<2.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - liburing >=2.14,<2.15.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + - dbus >=1.16.2,<2.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + license: Zlib + purls: [] + size: 2146080 + timestamp: 1777693555942 +- conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2026.2-h718be3e_0.conda + sha256: c6e3280867e54c97996a4fedda0ab72c92d48d1d69258bddf910130df72c169d + md5: 6438976979721e2f60ec47327d8d38df + depends: + - __glibc >=2.17,<3.0.a0 + - glslang >=16,<17.0a0 + - libgcc >=14 + - libstdcxx >=14 + - spirv-tools >=2026,<2027.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 113684 + timestamp: 1777360595361 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + sha256: 57afc2ab5bdb24cf979964018dddbc5dfaee130b415e6863765e45aed2175ee4 + md5: e8a0b4f5e82ecacffaa5e805020473cb + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + license: BSL-1.0 + purls: [] + size: 1951720 + timestamp: 1756274576844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11 + md5: 98b6c9dc80eb87b2519b97bcf7e578dd + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 45829 + timestamp: 1762948049098 +- conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda + sha256: 003180b3a2e0c6490b1f3461cf9e0ed740b1bbf88ee4b73ee177b94bea0dc95d + md5: 8809e0bd5ec279bfe4bb6651c3ed2730 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 2296977 + timestamp: 1770089626195 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 + md5: 8e0b8654ead18e50af552e54b5a08a61 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsqlite 3.53.1 h0c1763c_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing + purls: [] + size: 205399 + timestamp: 1777986477546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + sha256: 0c61eccf3f71b9812da8ced747b1f22bafd6f66f9a64abe06bbe147a03b7322e + md5: 423b8676bd6eed60e97097b33f13ea3f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - 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: 11903737 + timestamp: 1764983555676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + sha256: 4a1d2005153b9454fc21c9bad1b539df189905be49e851ec62a6212c2e045381 + md5: 2a2170a3e5c9a354d09e4be718c43235 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 2619743 + timestamp: 1769664536467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + sha256: 30cb9355c2fefc20ff1a3d6566b9714d5614086a2524c07721fc344eb20515ae + md5: 7073b15f9364ebc118998601ac6ca6a6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libstdcxx >=14 + license: Apache-2.0 + purls: [] + size: 182331 + timestamp: 1778673758649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2023.0.0-hab88423_2.conda + sha256: 47c82725569413b079632f5ad161b3bf2fa877d65dee1ff5c2c70a308a6150b5 + md5: 64a1e69ab772dd965d78be2734212667 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - tbb 2023.0.0 hab88423_2 + purls: [] + size: 1139342 + timestamp: 1778673771784 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.7.0-py312h4eba8b5_4.conda + sha256: 9a3faf2dd703667683feee3cb0ecb9ed035b0a5193b95da3a633ff9da029fea9 + md5: 7d6b10ed9058f6a97cd8007605b61c33 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.4,<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: 3491485 + timestamp: 1764929907168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.19.1-cpu_py312h3336143_5.conda + sha256: 5c8d7fd25ab2dcbd93615aa2050471082c5280e10b3ed23198979cbc822553fe + md5: 50c6712df349db8c7ed5b7ad4fbd202f + depends: + - python + - tensorflow-base ==2.19.1 cpu_py312h9edca52_5 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 48712 + timestamp: 1778107988940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.19.1-cpu_py312h9edca52_5.conda + sha256: 91a713f7af98269e1d23324d7f376de54dc33f75f71b7acc2c7ca1ec5e1e275e + md5: a412cf6cf13a017db097c88aa89cf94a + depends: + - python + - packaging + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - google-pasta >=0.1.1 + - grpcio 1.78.* + - h5py >=3.11 + - ml_dtypes >=0.5.1,<1.0 + - opt_einsum >=2.3.2 + - protobuf >=5.26 + - python-flatbuffers >=24.3.25 + - requests >=2.21.0,<3 + - six >=1.12 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + - tensorboard >=2.19,<2.20 + - keras >=3.5 + - libtensorflow_framework ==2.19.1 cpu_h0a5eddc_5 + - libtensorflow_cc ==2.19.1 cpu_ha812d39_5 + - _x86_64-microarch-level >=1 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 325310955 + timestamp: 1778107988940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3301196 + timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + sha256: 4629b1c9139858fb08bb357df917ffc12e4d284c57ff389806bb3ae476ef4e0a + md5: 2b37798adbc54fd9e591d24679d2133a + 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=hash-mapping + size: 859665 + timestamp: 1774358032165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 + md5: 55fd03988b1b1bc6faabbfb5b481ecd7 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 14882 + timestamp: 1769438717830 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + sha256: 895bbfe9ee25c98c922799de901387d842d7c01cae45c346879865c6a907f229 + md5: 0b6c506ec1f272b685240e70a29261b8 + 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/unicodedata2?source=hash-mapping + size: 410641 + timestamp: 1770909099497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.09-ha770c72_0.conda + sha256: 18f84366d84b83bb4b2a6e0ac4487a5b4ee33c531faa2d822027fddf8225eed5 + md5: 99884244028fe76046e3914f90d4ad05 + license: BSL-1.0 + purls: [] + size: 14226 + timestamp: 1767012219987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/viskores-1.1.1-cpu_hc82bd48_0.conda + sha256: 2ebe8d6ae8c302ca5bf4aec532cd75ebfb00240db1c14dad9a91bace65aa083d + md5: 24676eb7fd23ea3d8d69417f5f1224e0 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - hdf5 >=1.14.6,<1.14.7.0a0 + - mesalib >=26.0.3,<26.1.0a0 + - glew >=2.3.0,<2.4.0a0 + - zfp >=1.0.1,<2.0a0 + track_features: + - viskores-p-0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 25058279 + timestamp: 1777494673829 +- conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-9.6.1-py312h244374b_4.conda + sha256: 964d33bf2d534bfd5e450c962cc1f11edb6c93b433adb55324e0afe3dc6d546c + md5: ac787c9c5e55a50c6f13500380d665d7 + depends: + - vtk-base >=9.6.1,<9.6.2.0a0 + - vtk-io-ffmpeg >=9.6.1,<9.6.2.0a0 + - libgl-devel + - libopengl-devel + - libboost-devel + - liblzma-devel + - tbb-devel + - eigen + - expat + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 28284 + timestamp: 1778024918008 +- conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.6.1-py312hb8f95c7_4.conda + sha256: a662c9e086c2d40aecc900d93e1b2a22ba193fe15c262f6001da3015a8ce3f8e + md5: 0910787812203a454f4a48bce5a6f331 + depends: + - python + - utfcpp + - nlohmann_json + - cli11 + - numpy + - wslink + - matplotlib-base >=2.0.0 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - tbb >=2022.3.0 + - fmt >=12.1.0,<12.2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - proj >=9.8.1,<9.9.0a0 + - libglu >=9.0.3,<9.1.0a0 + - libexpat >=2.8.0,<3.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - python_abi 3.12.* *_cp312 + - libogg >=1.3.5,<1.4.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - liblzma >=5.8.3,<6.0a0 + - gl2ps >=1.4.2,<1.4.3.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - viskores >=1.1.1,<1.2.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - libglvnd >=1.7.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - libopengl >=1.7.0,<2.0a0 + - eigen-abi >=5.0.1.80,<5.0.1.81.0a0 + - jsoncpp >=1.9.6,<1.9.7.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - pugixml >=1.15,<1.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libpng >=1.6.58,<1.7.0a0 + - qt6-main >=6.11.0,<6.12.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - libglx >=1.7.0,<2.0a0 + - libtheora >=1.1.1,<1.2.0a0 + constrains: + - libboost-headers >=1.90.0,<1.91.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/vtk?source=hash-mapping + size: 85627117 + timestamp: 1778024918008 +- conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.6.1-py312hf1e11e2_4.conda + sha256: 69282c87aa5ab3eb97ca11191c3301179f98dbd0f0dabbb5ecea2686c106960d + md5: 4bc0f0442ff379021ef74528871b7765 + depends: + - vtk-base ==9.6.1 py312hb8f95c7_4 + - ffmpeg + - ffmpeg >=8.1.1,<9.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112851 + timestamp: 1778024918008 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb + md5: 996583ea9c796e5b915f7d7580b51ea6 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.4,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 334139 + timestamp: 1773959575393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda + sha256: 5bf21e14a364018a36869a16d9f706fb662c6cb6da3066100ba6822a70f93d2d + md5: 7f2ef073d94036f8b16b6ee7d3562a88 + 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=hash-mapping + size: 87514 + timestamp: 1772794814485 +- conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + sha256: 175315eb3d6ea1f64a6ce470be00fa2ee59980108f246d3072ab8b977cb048a5 + md5: 6c99772d483f566d59e25037fea2c4b1 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 897548 + timestamp: 1660323080555 +- conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + sha256: 76c7405bcf2af639971150f342550484efac18219c0203c5ee2e38b8956fe2a0 + md5: e7f6ed84d4623d52ee581325c1587a6b + depends: + - libgcc-ng >=10.3.0 + - libstdcxx-ng >=10.3.0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 3357188 + timestamp: 1646609687141 +- 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.6-hb03c661_0.conda + sha256: c2be9cae786fdb2df7c2387d2db31b285cf90ab3bfabda8fa75a596c3d20fc67 + md5: 4d1fc190b99912ed557a8236e958c559 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.13 + - libxcb >=1.17.0,<2.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: 20829 + timestamp: 1763366954390 +- 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.47-hb03c661_0.conda + sha256: 19c2bb14bec84b0e995b56b752369775c75f1589314b43733948bb5f471a6915 + md5: b56e0c8432b56decafae7e78c5f29ba5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 399291 + timestamp: 1772021302485 +- 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.13-he1eb515_0.conda + sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 + md5: 861fb6ccbc677bb9a9fb2468430b9c6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 839652 + timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b + md5: b2895afaf55bf96a8c8282a2e47a5de0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 15321 + timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a + md5: f2ba4192d38b6cef2bb2c25029071d90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 14415 + timestamp: 1770044404696 +- 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-hb03c661_1.conda + sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 + md5: 1dafce8548e38671bea82e3f5c6ce22f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 20591 + timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f + md5: 34e54f03dfea3e7a2dcf1453a85f1085 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50326 + timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20071 + timestamp: 1759282564045 +- 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-libxinerama-1.1.6-hecca717_0.conda + sha256: 3a9da41aac6dca9d3ff1b53ee18b9d314de88add76bafad9ca2287a494abcd86 + md5: 93f5d4b5c17c8540479ad65f206fea51 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 14818 + timestamp: 1769432261050 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 + md5: e192019153591938acf7322b6459d36e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 30456 + timestamp: 1769445263457 +- 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-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + 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: 14412 + timestamp: 1727899730073 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda + sha256: c0830fe9fa78d609cd9021f797307e7e0715ef5122be3f784765dad1b4d8a193 + md5: 9a809ce9f65460195777f2f2116bae02 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 12302 + timestamp: 1734168591429 +- 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.7-hb03c661_0.conda + sha256: 64db17baaf36fa03ed8fae105e2e671a7383e22df4077486646f7dbf12842c9f + md5: 665d152b9c6e78da404086088077c844 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 18701 + timestamp: 1769434732453 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + sha256: 7a8c64938428c2bfd016359f9cb3c44f94acc256c6167dbdade9f2a1f5ca7a36 + md5: aa8d21be4b461ce612d8f5fb791decae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 570010 + timestamp: 1766154256151 +- 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/linux-64/yarl-1.23.0-py312h8a5da7c_0.conda + sha256: 5d991a8f418675338528ea8097e55143ad833807a110c4251879040351e0d4af + md5: 4b403cb52e72211c489a884b29290c2c + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=14 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=hash-mapping + size: 147028 + timestamp: 1772409590700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 + md5: 755b096086851e1193f3b10347415d7c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 311150 + timestamp: 1772476812121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda + sha256: 5fabe6cccbafc1193038862b0b0d784df3dae84bc48f12cac268479935f9c8b7 + md5: 6a0eb48e58684cca4d7acc8b7a0fd3c7 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 277694 + timestamp: 1766549572069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 + md5: c2a01a08fc991620a74b32420e97868a + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib 1.3.2 h25fd6f3_2 + license: Zlib + license_family: Other + purls: [] + size: 95931 + timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f + md5: 2aadb0d17215603a82a2a6b0afd9a4cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Zlib + license_family: Other + purls: [] + size: 122618 + timestamp: 1770167931827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 +- 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-3_x86_64.conda + build_number: 3 + sha256: 5f9029eaa78eb13a5499b7a2b012a47a18136b2d41bad99bb7b1796d1fc2b179 + md5: 225cb2e9b9512730a92f83696b8fbab8 + depends: + - __archspec 1.* x86_64 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 9818 + timestamp: 1764034326319 +- conda: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.4.0-pyhd8ed1ab_0.conda + sha256: 0e5e34179a52e0f3aa3c92904bd326de1d1cd74c6fe3bd98f8b8b6889491c7e4 + md5: a46362fa67f5138d526715107be0ee32 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/absl-py?source=hash-mapping + size: 109955 + timestamp: 1769637168641 +- 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/adwaita-icon-theme-49.0-unix_0.conda + sha256: a362b4f5c96a0bf4def96be1a77317e2730af38915eb9bec85e2a92836501ed7 + md5: b3f0179590f3c0637b7eb5309898f79e + depends: + - __unix + - hicolor-icon-theme + - librsvg + license: LGPL-3.0-or-later OR CC-BY-SA-3.0 + license_family: LGPL + purls: [] + size: 631452 + timestamp: 1758743294412 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + sha256: 7842ddc678e77868ba7b92a726b437575b23aaec293bca0d40826f1026d90e27 + md5: 18fd895e0e775622906cdabfc3cf0fb4 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/aiohappyeyeballs?source=hash-mapping + size: 19750 + timestamp: 1741775303303 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 + md5: 421a865222cd0c9d83ff08bc78bf3a61 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + - typing_extensions >=4.2 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aiosignal?source=hash-mapping + size: 13688 + timestamp: 1751626573984 +- 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/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/argcomplete-3.6.3-pyhd8ed1ab_0.conda + sha256: a2a1879c53b7a8438c898d20fa5f6274e4b1c30161f93b7818236e9df6adffde + md5: 8f37c8fb7116a18da04e52fa9e2c8df9 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/argcomplete?source=hash-mapping + size: 42386 + timestamp: 1760975036972 +- conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.23.4-pyhcf101f3_0.conda + sha256: d4e638ca192077e0dd7f60d33ae416f34d1d2b1f032e775eaeb38f07556b79ed + md5: f64907fda280c6f731d240572ca7956c + depends: + - python >=3.10 + - setuptools >=60.0.0 + - matplotlib-base >=3.8 + - numpy >=1.26.0 + - scipy >=1.11.0 + - packaging + - pandas >=2.1.0 + - xarray >=2023.7.0 + - h5netcdf >=1.0.2 + - typing_extensions >=4.1.0 + - xarray-einstats >=0.3 + - h5py + - platformdirs + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/arviz?source=hash-mapping + size: 1499441 + timestamp: 1770281563537 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010 + md5: 9673a61a297b00016442e022d689faa6 + depends: + - python >=3.10 + constrains: + - astroid >=2,<5 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28797 + timestamp: 1763410017955 +- 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/attrs-26.1.0-pyhcf101f3_0.conda + sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab + md5: c6b0543676ecb1fb2d7643941fe375f2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=hash-mapping + size: 64927 + timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python + constrains: + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + size: 7684321 + timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 + md5: 5267bef8efea4127aacd1f4e1f149b6e + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4?source=hash-mapping + size: 90399 + timestamp: 1764520638652 +- conda: https://conda.anaconda.org/conda-forge/noarch/black-26.3.1-pyh866005b_0.conda + sha256: 671b78df3fd288e4c99762d9a1b0391b70be2c7a46df564d6e6b3862db2ec799 + md5: c7e43448266209d766a229cada982884 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.11 + - pytokens >=0.4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 171751 + timestamp: 1773315364851 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46 + md5: 7c5ebdc286220e8021bf55e6384acd67 + depends: + - python >=3.10 + - webencodings + - python + constrains: + - tinycss2 >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/bleach?source=hash-mapping + size: 142008 + timestamp: 1770719370680 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + sha256: 7c07a865e5e4cca233cc4e0eb3f0f5ff6c90776461687b4fb0b1764133e1fd61 + md5: f11a319b9700b203aa14c295858782b6 + depends: + - bleach ==6.3.0 pyhcf101f3_1 + - tinycss2 + license: Apache-2.0 AND MIT + purls: [] + size: 4409 + timestamp: 1770719370682 +- conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + sha256: 96a6486d4fe27c02c1092a40096dfd82043929b3a7da156a49b28d851159c551 + md5: b9a6da57e94cd12bd71e7ab0713ef052 + depends: + - contourpy >=1.2 + - jinja2 >=2.9 + - narwhals >=1.13 + - numpy >=1.16 + - packaging >=16.8 + - pillow >=7.1.0 + - python >=3.10 + - pyyaml >=3.10 + - tornado >=6.2 + - xyzservices >=2021.09.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/bokeh?source=hash-mapping + size: 4240579 + timestamp: 1773302678722 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d + md5: e18ad67cf881dcadee8b8d9e2f8e5f73 + depends: + - __unix + license: ISC + purls: [] + size: 131039 + timestamp: 1776865545798 +- 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/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda + sha256: 040e2feb74c5d85881d727a7ac5d707eccf9e6499e6a1608ddea8bb9e59c5ed1 + md5: 9e5f8e2fe9770c4730163d2e289adb53 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cachetools?source=hash-mapping + size: 17249 + timestamp: 1769721401289 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878 + md5: 929471569c93acefb30282a22060dcd5 + depends: + - python >=3.10 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 135656 + timestamp: 1776866680878 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 + md5: 381bd45fb7aa032691f3063aff47e3a1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 13589 + timestamp: 1763607964133 +- conda: https://conda.anaconda.org/conda-forge/noarch/chaospy-4.3.20-pyhd8ed1ab_0.conda + sha256: 0a09fb5406c43999d27cb68f9f37f823fbca55ec1bbf0d8c346b735e7d4ac2fa + md5: 4f08e6bbb4eac520612a4389f0ef3eca + depends: + - numpoly >=1.2.12 + - numpy >=1.20 + - python >=3.7 + - scikit-learn + - scipy + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/chaospy?source=hash-mapping + size: 169175 + timestamp: 1751416459328 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 + md5: a9167b9571f3baa9d448faa2139d1089 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 58872 + timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/check_shapes-1.1.1-pyhd8ed1ab_0.conda + sha256: f54c06b3ef10b17816e615dab872ef92f62111f48a8573f82b17c5ec6919f786 + md5: 9e4cb25398b53b36c5ae1d862d38d780 + depends: + - dropstackframe >=0.1.0 + - lark >=1.1.0 + - python >=3.7 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/check-shapes?source=hash-mapping + size: 37043 + timestamp: 1719415287108 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + sha256: 37a5d8b10ea3516e2c42f870c9c351b9f7b31ff48c66d83490039f417e1e5228 + md5: 2266262ce8a425ecb6523d765f79b303 + depends: + - __unix + - python + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 100048 + timestamp: 1777219902525 +- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + sha256: 4c287c2721d8a34c94928be8fe0e9a85754e90189dd4384a31b1806856b50a67 + md5: 61b8078a0905b12529abc622406cb62c + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cloudpickle?source=hash-mapping + size: 27353 + timestamp: 1765303462831 +- 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/noarch/compiler-rt22_osx-arm64-22.1.5-h7e67a1e_1.conda + sha256: 8fd9c06368cf109359b5790dd52bb2c567649eea4ac803003e8bc10e49e8ef24 + md5: 6b4aa1f07476cdefbd872f38df71b3e2 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 10867797 + timestamp: 1778193575528 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.5-hce30654_1.conda + sha256: b8d2ac6246cef588054a267979ce67298faa695830341bf17a1f8e8b466bc9d2 + md5: 55b5854d13383c8ab1e467dba3cd5373 + depends: + - compiler-rt22_osx-arm64 22.1.5 h7e67a1e_1 + constrains: + - clang 22.1.5 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 16629 + timestamp: 1778193616082 +- conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.7-pyhd8ed1ab_2.conda + sha256: 2edb605f79d96a2e05bc86bd153c6f03239981f68b25e129429640ebaf316d3b + md5: 31b1db820db9a562fb374ed9339d844c + depends: + - logical-unification >=0.4.0 + - python >=3.9 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/cons?source=hash-mapping + size: 14816 + timestamp: 1752393486187 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + noarch: generic + sha256: d3e9bbd7340199527f28bbacf947702368f31de60c433a16446767d3c6aaf6fe + md5: f54c1ffb8ecedb85a8b7fcde3a187212 + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 46463 + timestamp: 1772728929620 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 + md5: 4c2a8fef270f6c69591889b93f9f55c1 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + size: 14778 + timestamp: 1764466758386 +- conda: https://conda.anaconda.org/conda-forge/noarch/cyclopts-4.11.2-pyhcf101f3_0.conda + sha256: a8c8c87add7547efc02b3b4273ca03b65b2c757afd63dab0c04b322da8985782 + md5: 94238d5e6b8a19177d39e21663de27c9 + depends: + - python >=3.10 + - attrs >=23.1.0 + - rich >=13.6.0 + - docstring_parser >=0.15,<4.0 + - rich-rst >=1.3.1,<2.0.0 + - typing_extensions >=4.8.0 + - tomli >=2.0.0 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/cyclopts?source=hash-mapping + size: 171294 + timestamp: 1777904956128 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda + sha256: fe59c26dc20a47aa56fc38a2326f2a62403f3eed366837c1a0fba166a220d2b7 + md5: f9761ef056ba0ccef16e01cfceee62c2 + depends: + - python >=3.10 + - dask-core >=2026.3.0,<2026.3.1.0a0 + - distributed >=2026.3.0,<2026.3.1.0a0 + - cytoolz >=0.11.2 + - lz4 >=4.3.2 + - numpy >=1.26 + - pandas >=2.0 + - bokeh >=3.1.0 + - jinja2 >=2.10.3 + - pyarrow >=16.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 11383 + timestamp: 1773913283482 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + sha256: 5497e56b12b8a07921668f6469d725be9826ffe5ae8a2f6f71d26369400b41ca + md5: 809f4cde7c853f437becc43415a2ecdf + depends: + - python >=3.10 + - click >=8.1 + - cloudpickle >=3.0.0 + - fsspec >=2021.9.0 + - packaging >=20.0 + - partd >=1.4.0 + - pyyaml >=5.3.1 + - toolz >=0.12.0 + - importlib-metadata >=4.13.0 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dask?source=hash-mapping + size: 1066502 + timestamp: 1773823162829 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda + sha256: 18a2b682c3d9b978e2ce37d1bfec87f72b54ed6415753833831c095ec61b2668 + md5: a201de7d36907f2355426e019168d337 + depends: + - dask-core >=2022.02.0 + - distributed >=2022.02.0 + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dask-jobqueue?source=hash-mapping + size: 40446 + timestamp: 1724342296802 +- conda: https://conda.anaconda.org/conda-forge/noarch/decli-0.6.3-pyhd8ed1ab_0.conda + sha256: fea36c409534882d6dc724312833db2a6ecf7adc268a2fa7fc0c5cc66b554dab + md5: be08df21a103c765f7f38fcc5b4df4b4 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/decli?source=hash-mapping + size: 14182 + timestamp: 1748864502223 +- 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/deprecated-1.3.1-pyhd8ed1ab_1.conda + sha256: 7d57a7b8266043ffb99d092ebc25e89a0a2490bed4146b9432c83c2c476fa94d + md5: 5498feb783ab29db6ca8845f68fa0f03 + depends: + - python >=3.10 + - wrapt <3,>=1.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/deprecated?source=hash-mapping + size: 15896 + timestamp: 1768934186726 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + sha256: 1ef84c0cc4efd0c2d58c3cb365945edbd9ee42a1c54514d1ccba4b641005f757 + md5: 080a808fce955026bf82107d955d32da + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 95462 + timestamp: 1768863743943 +- 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=hash-mapping + size: 275642 + timestamp: 1752823081585 +- conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.3.0-pyhc364b38_0.conda + sha256: 49cbb318f7a1797b9f17c135c9b5c48ba2086570a58c99054d3b40bf13a5b815 + md5: 8efb90a27e3b948514a428cb99f3fc70 + depends: + - python >=3.10 + - click >=8.0 + - cloudpickle >=3.0.0 + - cytoolz >=0.12.0 + - dask-core >=2026.3.0,<2026.3.1.0a0 + - jinja2 >=2.10.3 + - locket >=1.0.0 + - msgpack-python >=1.0.2 + - packaging >=20.0 + - psutil >=5.8.0 + - pyyaml >=5.4.1 + - sortedcontainers >=2.0.5 + - tblib >=1.6.0 + - toolz >=0.12.0 + - tornado >=6.2.0 + - urllib3 >=1.26.5 + - zict >=3.0.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/distributed?source=hash-mapping + size: 845608 + timestamp: 1773858577032 +- conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.8-pyhc364b38_0.conda + sha256: 3e57149faca76593a869d91242dd166a9cc816cb7f01e3b39bda90e44407818e + md5: 2207be19c7b2f72e46e9d4049cb4cabc + depends: + - charset-normalizer >=3.0.0 + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/docformatter?source=hash-mapping + size: 41556 + timestamp: 1777489364203 +- conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + sha256: 0994f88d4257dbfcbf67f10c886d84a531e13e6d36dee3a77ddcca6ffc37d7ca + md5: b0c7c29a60c82d57c5b4c4c38f0642c8 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/docstring-parser?source=compressed-mapping + size: 23903 + timestamp: 1778609891474 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e + md5: d6bd3cd217e62bbd7efe67ff224cd667 + depends: + - python >=3.10 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + size: 438002 + timestamp: 1766092633160 +- conda: https://conda.anaconda.org/conda-forge/noarch/dropstackframe-0.1.1-pyhd8ed1ab_0.conda + sha256: 3091e233ae1c89a3ae6bf9846b5bd8f54f619e545f4ca8222b4a7062118a8108 + md5: aead49e0c1fde7995f1e0355d7728961 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/dropstackframe?source=hash-mapping + size: 10109 + timestamp: 1723593107359 +- conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.10-pyhd8ed1ab_1.conda + sha256: 92b79c5f79eefcee3dc604a96f5546f52bb65329eea043ccb541b692956c8fb5 + md5: 315e9d823f7763da48e072e59bfd0e8e + depends: + - cons + - multipledispatch + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/etuples?source=hash-mapping + size: 18084 + timestamp: 1752608449672 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab + depends: + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21333 + timestamp: 1763918099466 +- conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + sha256: 1acc6a420efc5b64c384c1f35f49129966f8a12c93b4bb2bdc30079e5dc9d8a8 + md5: a57b4be42619213a94f31d2c69c5dda7 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/execnet?source=hash-mapping + size: 39499 + timestamp: 1762974150770 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/executing?source=hash-mapping + size: 30753 + timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + sha256: 2b40cedb829d5edef303b2cc182847b5f1a1a24454bc0cfd59a56552c6e058d9 + md5: 4117dc2692ae84eb9da51d7d7820c45c + depends: + - decorator >=5 + - deprecated >=1.2 + - invoke >=2.0,<3.0 + - paramiko >=2.4 + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/fabric?source=hash-mapping + size: 55825 + timestamp: 1775457354890 +- conda: https://conda.anaconda.org/conda-forge/noarch/farama-notifications-0.0.4-pyhd8ed1ab_0.conda + sha256: 8df190d75bac104c6c2317b13397eed9adfa6889b12405b0288ca2ca86855c06 + md5: 61f63fcf1c2deddeae7a85a516d46c94 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/farama-notifications?source=hash-mapping + size: 8406 + timestamp: 1684258265351 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda + sha256: 6b471a18372bbd52bdf32fc965f71de3bc1b5219418b8e6b3875a67a7b08c483 + md5: 8fa8358d022a3a9bd101384a808044c6 + depends: + - python >=3.10 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 34211 + timestamp: 1776621506566 +- 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/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-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda + sha256: 079701b4ff3b317a1a158cabd48cf2b856b8b8d3ef44f152809d9acf20cc8e10 + md5: 2c11aa96ea85ced419de710c1c3a78ff + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + size: 149694 + timestamp: 1777547807038 +- conda: https://conda.anaconda.org/conda-forge/noarch/gast-0.7.0-pyhd8ed1ab_0.conda + sha256: 587a0e2606026716760af58e5d7c15ea02a848bd076a324946798be29d0229db + md5: 377a825d91b5d6fcc0e6cdb98bbe9799 + depends: + - python >=3.10 + constrains: + - pythran >=0.12.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/gast?source=hash-mapping + size: 27047 + timestamp: 1764507196904 +- 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/noarch/gpflow-2.9.2-pyhd8ed1ab_0.conda + sha256: 4942d8a6524fe72f92bc5db8c1f04bdf8c1ddc345c10589015f7c79172c5f413 + md5: 5a415839ee9fe473f91c861d21799e8f + depends: + - check_shapes >=1.0.0 + - deprecated + - lark >=1.1.0 + - multipledispatch >=0.6 + - numpy + - packaging + - python >=3.7 + - scipy + - setuptools >=41.0.0 + - tabulate + - tensorflow >=2.4.0 + - tensorflow-probability >=0.12.0 + - typing-extensions + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/gpflow?source=hash-mapping + size: 144728 + timestamp: 1719418935367 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + sha256: 5bf081c0f21a57fc84b5000d53f043d63638b77dcc2137f87511a4581838c9f6 + md5: ca7f9ba8762d3e360e47917a10e23760 + depends: + - h5py + - numpy + - packaging + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5netcdf?source=hash-mapping + size: 57732 + timestamp: 1769241877548 +- 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/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/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 + md5: 84a3233b709a289a4ddd7a2fd27dd988 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 79757 + timestamp: 1776455344188 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda + sha256: 9ab620e6f64bb67737bd7bc1ad6f480770124e304c6710617aba7fe60b089f48 + md5: fb7130c190f9b4ec91219840a05ba3ac + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 59038 + timestamp: 1776947141407 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + sha256: 5a047f9eac290e679b4e6f6f4cbfcc5acdfbf031a4f06824d4ddb590cdbb850b + md5: 92617c2ba2847cca7a6ed813b6f4ab79 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/imagesize?source=hash-mapping + size: 15729 + timestamp: 1773752188889 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 + md5: 080594bf4493e6bae2607e65390c520a + depends: + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 34387 + timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda + sha256: 09f2b26f8c727fd2138fd4846b91708c32d5684120b59d5c8d38472c0eefbf33 + md5: 12e7a110add59a05b337484568a83a4d + depends: + - importlib-metadata ==8.8.0 pyhcf101f3_0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 21425 + timestamp: 1773931568510 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 13387 + timestamp: 1760831448842 +- conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + md5: 3a804714ed59be1969ffca10f703ec2a + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/invoke?source=hash-mapping + size: 132825 + timestamp: 1760146119847 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh5552912_1.conda + sha256: 5c1f3e874adaf603449f2b135d48f168c5d510088c78c229bda0431268b43b27 + md5: 4b53d436f3fbc02ce3eeaf8ae9bebe01 + depends: + - appnope + - __osx + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.8.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 132260 + timestamp: 1770566135697 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda + sha256: b77ed58eb235e5ad80e742b03caeed4bbc2a2ef064cb9a2deee3b75dfae91b2a + md5: 8b267f517b81c13594ed68d646fd5dcb + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.8.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 133644 + timestamp: 1770566133040 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.13.0-pyh53cf698_0.conda + sha256: a0af49948a1842dfd15a0b0b2fd56c94ddbd07e07a6c8b4bc70d43015eafaff0 + md5: 73e9657cd19605740d21efb14d8d0cb9 + depends: + - __unix + - decorator >=5.1.0 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 + - pygments >=2.14.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - pexpect >4.6 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 651632 + timestamp: 1777038396606 +- 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/isort-8.0.1-pyhd8ed1ab_0.conda + sha256: cc5c2b513143ea9675ba5b3570182f7568fd1029b299ee3bc58424dcce8c5539 + md5: 98cdd8615792e90da1023bc546f806d9 + depends: + - importlib-metadata >=4.6.0 + - python >=3.10,<4.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/isort?source=hash-mapping + size: 72146 + timestamp: 1772278531671 +- conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda + sha256: 12880c60e459ebb79456965792d4392cff0cb488de7de463b2d098f96f1b9430 + md5: dd0988318fb84ee03d41376109fbe851 + depends: + - importlib-metadata >=4.6 + - jaxlib >=0.9.2,<=0.9.2 + - ml_dtypes >=0.5.0 + - numpy >=2.0 + - opt_einsum + - python >=3.11 + - scipy >=1.13 + constrains: + - cudnn >=9.8,<10.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jax?source=hash-mapping + size: 2038954 + timestamp: 1775680194539 +- conda: https://conda.anaconda.org/conda-forge/noarch/jax-jumpy-1.0.0-pyhd8ed1ab_1.conda + sha256: c414b2be28e7d963e55c962caad1a25833d2e415a3d7a16e4f9da9e187dd37b3 + md5: d15bad1eca61880b5e465c4038d7c3f4 + depends: + - numpy >=1.18.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jax-jumpy?source=hash-mapping + size: 20757 + timestamp: 1734210042598 +- 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/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d + depends: + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 120685 + timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + sha256: 301539229d7be6420c084490b8145583291123f0ce6b92f56be5948a2c83a379 + md5: 615de2a4d97af50c350e5cf160149e77 + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/joblib?source=hash-mapping + size: 226448 + timestamp: 1765794135253 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 + md5: ada41c863af263cc4c5fcbaff7c3e4dc + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.10 + - referencing >=0.28.4 + - rpds-py >=0.25.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=hash-mapping + size: 82356 + timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 + md5: 439cd0f567d697b20a8f45cb70a1005a + depends: + - python >=3.10 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications?source=hash-mapping + size: 19236 + timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3 + md5: 8a3d6d0523f66cf004e563a50d9392b3 + depends: + - jupyter_core >=5.1 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyzmq >=25.0 + - tornado >=6.4.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 112785 + timestamp: 1767954655912 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 65503 + timestamp: 1760643864586 +- 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/keras-3.14.1-pyh753f3f9_0.conda + sha256: 13141e166f73e8688c441f548a743175d0bfb0590c450e7406493eca7121958a + md5: b3d345d389695c26f9f8e06607c7491f + depends: + - absl-py + - h5py + - ml_dtypes + - namex + - numpy + - optree + - packaging + - python >=3.11 + - rich + constrains: + - pytorch >=2.6.0 + - jax >=0.5.0 + - tensorflow >=2.18.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/keras?source=hash-mapping + size: 938226 + timestamp: 1778246365721 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1278712 + timestamp: 1765578681495 +- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 + md5: 9b965c999135d43a3d0f7bd7d024e26a + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/lark?source=hash-mapping + size: 94312 + timestamp: 1761596921009 +- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.5-h707e725_1.conda + sha256: aebe5d9d45bb61b64834e39cd86865ea043149af37fec698b4adff341ef08a74 + md5: ddbf7b15609299629cf5e859c1d33953 + depends: + - __unix + constrains: + - gxx_linux-64 >=14 + - clangxx >=19 + - gxx_osx-64 >=14 + - libcxx-devel 22.1.5 + - gxx_osx-arm64 >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 1176462 + timestamp: 1778191549544 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + sha256: 38a557eba305468ac1f90ac85e50d8defd76141cb0b8a43b2fc1aca71dd5d5f2 + md5: 683fcb168e1df9a21fa80d5aa2d9330b + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3095909 + timestamp: 1778268932148 +- conda: https://conda.anaconda.org/conda-forge/noarch/libml_dtypes-headers-0.5.4-h707e725_0.conda + sha256: 37e3fe66ec86b8fff9db741a1e6fcc19874646702aaa74c97bf26852ffbd0276 + md5: 597a39bc0946262b29644366059cd109 + depends: + - __unix + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 23946 + timestamp: 1764082185215 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + sha256: a2385f3611d5cd25378f9cf2367183320731709c067ddd08d43330d3170f15b8 + md5: bcfe7eae40158c3e355d2f9d3ed41230 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 20765069 + timestamp: 1778268963689 +- conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 + md5: 91e27ef3d05cc772ce627e51cff111c4 + depends: + - python >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/locket?source=hash-mapping + size: 8250 + timestamp: 1650660473123 +- conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.7-pyhd8ed1ab_0.conda + sha256: 5a3995f2b6c47d0b4842f3842490920e2dbf074854667d8649dd5abe81914a54 + md5: f2815c465aa44db830f0b31b7e6baaff + depends: + - multipledispatch + - python >=3.10 + - toolz + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/logical-unification?source=hash-mapping + size: 18830 + timestamp: 1761054211310 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda + sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b + md5: ba0a9221ce1063f31692c07370d062f3 + depends: + - importlib-metadata >=4.4 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markdown?source=hash-mapping + size: 85893 + timestamp: 1770694658918 +- 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=hash-mapping + size: 64736 + timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 + md5: 9acc1c385be401d533ff70ef5b50dae6 + depends: + - python >=3.10 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/matplotlib-inline?source=hash-mapping + size: 15725 + timestamp: 1778264403247 +- conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + sha256: 9b0037171dad0100f0296699a11ae7d355237b55f42f9094aebc0f41512d96a1 + md5: 827064ddfe0de2917fb29f1da4f8f533 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mccabe?source=hash-mapping + size: 12934 + timestamp: 1733216573915 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda + sha256: 123cc004e2946879708cdb6a9eff24acbbb054990d6131bb94bca7a374ebebfc + md5: 1997a083ef0b4c9331f9191564be275e + depends: + - markdown-it-py >=2.0.0,<5.0.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdit-py-plugins?source=hash-mapping + size: 43805 + timestamp: 1754946862113 +- 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/meshio-5.3.5-pyhd8ed1ab_0.conda + sha256: 8818467a7490dea7876e1c6d112af7c0e326a5a54cd829a384a493a152d8596a + md5: 2ea6ce24274096bf2df6c8c50f373d5b + depends: + - h5py + - importlib_metadata + - netcdf4 + - numpy + - python >=3.7 + - rich + license: MIT + license_family: MIT + purls: + - pkg:pypi/meshio?source=hash-mapping + size: 383105 + timestamp: 1706720749456 +- conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.5-pyhd8ed1ab_1.conda + sha256: aced546f3dbc7f8710182b1f1ec30d2aaec2f4f9b48513d7d95fb2004ee775f6 + md5: ef7868bd5e40d31a8a41312e91ec6a9c + depends: + - cons >=0.4.0 + - etuples >=0.3.1 + - logical-unification >=0.4.1 + - multipledispatch + - python >=3.10 + - toolz + - typing_extensions + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/minikanren?source=hash-mapping + size: 27317 + timestamp: 1755897118661 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.1-pyhcf101f3_0.conda + sha256: b52dc6c78fbbe7a3008535cb8bfd87d70d8053e9250bbe16e387470a9df07070 + md5: b97e84d1553b4a1c765b87fff83453ad + depends: + - python >=3.10 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mistune?source=hash-mapping + size: 74567 + timestamp: 1777824616382 +- conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.2.0-pyhd8ed1ab_0.conda + sha256: ecf2c7b886193c7a4c583faab3deedaa897008dc2e2259ea2733a6ab78143ce2 + md5: 1353e330df2cc41271afac3b0f88db28 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/mock?source=hash-mapping + size: 34346 + timestamp: 1741074069714 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda + sha256: 7d7aa3fcd6f42b76bd711182f3776a02bef09a68c5f117d66b712a6d81368692 + md5: 3585aa87c43ab15b167b574cd73b057b + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 439705 + timestamp: 1733302781386 +- conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + sha256: c6216a21154373b340c64f321f22fec51db4ee6156c2e642fa58368103ac5d09 + md5: 121a57fce7fff0857ec70fa03200962f + depends: + - python >=3.6 + - six + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multipledispatch?source=hash-mapping + size: 17254 + timestamp: 1721907640382 +- 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/myst-parser-5.0.0-pyhd8ed1ab_0.conda + sha256: f352d594d968acd31052c5f894ae70718be56481ffa9c304fdfcbe78ddf66eb1 + md5: a65e2c3c764766f0b28a3ac5052502a6 + depends: + - docutils >=0.20,<0.23 + - jinja2 + - markdown-it-py >=4.0.0,<4.1.0 + - mdit-py-plugins >=0.5,<0.6 + - python >=3.11 + - pyyaml + - sphinx >=8,<10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/myst-parser?source=hash-mapping + size: 73535 + timestamp: 1768942892170 +- 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/narwhals-2.21.0-pyhcf101f3_0.conda + sha256: 41e391ec624b67586e1d2d5ae1651f88b283fa0b68cce998c281e69e2e5d7573 + md5: d2ec42db1d2fcd69003c8b069fb4301c + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/narwhals?source=hash-mapping + size: 285016 + timestamp: 1778254540766 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b + md5: 00f5b8dafa842e0c27c1cd7296aa4875 + 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: 28473 + timestamp: 1766485646962 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.17.1-hb502eef_0.conda + sha256: 6b6d96cca8e9dd34e0735b59534831e1f8206b7366c79c71e08da6ee55c50683 + md5: 02669c36935d23e5258c5dd1a5e601ab + depends: + - nbconvert-core ==7.17.1 pyhcf101f3_0 + - nbconvert-pandoc ==7.17.1 h08b4883_0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5364 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + sha256: ab2ac79c5892c5434d50b3542d96645bdaa06d025b6e03734be29200de248ac2 + md5: 2bce0d047658a91b99441390b9b27045 + 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.10 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.17.1 *_0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbconvert?source=hash-mapping + size: 202229 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.17.1-h08b4883_0.conda + sha256: b576268b5b3da13b703a15d28d218fd1b552511726253575025930091e6206ae + md5: f635af333701d2ed89d70ba9adb8e2ee + depends: + - nbconvert-core ==7.17.1 pyhcf101f3_0 + - pandoc + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5840 + timestamp: 1775615493260 +- 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/noarch/nbsphinx-0.9.8-pyhd8ed1ab_0.conda + sha256: 4cc750523756e61751c9a07d7e8b0dc265190ca8218f815e5e24779872748f9e + md5: c46b9814fb20a07bc294318c3eca5aed + depends: + - docutils + - jinja2 + - nbconvert + - nbformat + - python >=3.6 + - sphinx + - traitlets + license: MIT + license_family: MIT + purls: + - pkg:pypi/nbsphinx?source=hash-mapping + size: 35023 + timestamp: 1764354193797 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbstripout-0.9.1-pyhd8ed1ab_0.conda + sha256: e5029a1ca06d5f02c9366ec8686f64c942d77f297bfa90a0a8215083d85a7a01 + md5: 948b10290b9f4ebbb26de6da5c6b7c51 + depends: + - nbformat + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nbstripout?source=hash-mapping + size: 24331 + timestamp: 1771778886946 +- 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/noarch/networkx-3.6.1-pyhcf101f3_0.conda + sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 + md5: a2c1eeadae7a309daed9d62c96012a2b + depends: + - python >=3.11 + - python + constrains: + - numpy >=1.25 + - scipy >=1.11.2 + - matplotlib-base >=3.8 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx?source=hash-mapping + size: 1587439 + timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee + md5: eb52d14a901e23c39e9e7b4a1a5c015f + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 40866 + timestamp: 1766261270149 +- conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b + md5: 9a66894dfd07c4510beb6b3f9672ccc0 + constrains: + - mkl <0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3843 + timestamp: 1582593857545 +- conda: https://conda.anaconda.org/conda-forge/noarch/numpoly-1.2.14-pyhd8ed1ab_0.conda + sha256: 46c6860a4ab51de9f0e87c2973b41e9162a26effc1770f64718f777421699b04 + md5: 755ce6ebdf765eeb2170d99e45f50b8d + depends: + - numpy + - python >=3.5 + - setuptools + - six + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpoly?source=hash-mapping + size: 77871 + timestamp: 1728351111178 +- 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/noarch/packaging-26.2-pyhc364b38_0.conda + sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 + md5: 4c06a92e74452cfa53623a81592e8934 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 91574 + timestamp: 1777103621679 +- 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/paramiko-5.0.0-pyhd8ed1ab_0.conda + sha256: 1b64a1b91b57c2a4c42a9e73b9a544e22fcdac55a953d2c09644b184edde7c3f + md5: e7fa4da3b74ededb2fa7ab4171f63d21 + depends: + - bcrypt >=3.2 + - cryptography >=3.3 + - invoke >=2.0 + - pynacl >=1.5 + - python >=3.10 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/paramiko?source=hash-mapping + size: 152584 + timestamp: 1778365181112 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e + md5: 39894c952938276405a1bd30e4ce2caf + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/parso?source=hash-mapping + size: 82472 + timestamp: 1777722955579 +- conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + sha256: 472fc587c63ec4f6eba0cc0b06008a6371e0a08a5986de3cf4e8024a47b4fe6c + md5: 0badf9c54e24cecfb0ad2f99d680c163 + depends: + - locket + - python >=3.9 + - toolz + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/partd?source=hash-mapping + size: 20884 + timestamp: 1715026639309 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathos-0.3.5-pyhcf101f3_0.conda + sha256: 981d6961cfceaa0cec7c4f4b61e482f076bd7726b5a60edf82fe14d0a3297027 + md5: 695df55c5f29f186b33fcc32b7723930 + depends: + - dill >=0.4.1 + - multiprocess >=0.70.19 + - pox >=0.3.7 + - ppft >=1.7.8 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pathos?source=hash-mapping + size: 55743 + timestamp: 1769180435982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 56559 + timestamp: 1777271601895 +- conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + sha256: 9678f4745e6b82b36fab9657a19665081862268cb079cf9acf878ab2c4fadee9 + md5: 8678577a52161cc4e1c93fcc18e8a646 + depends: + - numpy >=1.4.0 + - python >=3.10 + - python + license: BSD-2-Clause AND PSF-2.0 + purls: + - pkg:pypi/patsy?source=hash-mapping + size: 193450 + timestamp: 1760998269054 +- 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/pip-26.1.1-pyh8b19718_0.conda + sha256: 1bd94ef1ae08fd811ef3b26857e46ba460c7430bf1f3ccd94a4d6614fd619bd5 + md5: 35870d32aed92041d31cbb15e822dca3 + depends: + - python >=3.10,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1201616 + timestamp: 1777924080196 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-licenses-5.5.1-pyhc364b38_0.conda + sha256: 6ab47c2e333b9ae698c62af8cb9399ac82b0c9f454ab1bd1e66517ae2311132d + md5: e0f3fd9e93475fe22d8d688efdf9db40 + depends: + - python >=3.11 + - prettytable >=3.12.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip-licenses?source=hash-mapping + size: 28389 + timestamp: 1774533372159 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 + md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 25862 + timestamp: 1775741140609 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 + md5: 3e9427ee186846052e81fadde8ebe96a + depends: + - narwhals >=1.15.1 + - packaging + - python >=3.10 + constrains: + - ipywidgets >=7.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/plotly?source=hash-mapping + size: 5251872 + timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 25877 + timestamp: 1764896838868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + sha256: 081e52c4612830bf1fd4a9c78eebaf335d1385d74ddfd328b1b2f26b983848eb + md5: dd4b6337bf8886855db6905b336db3c8 + depends: + - packaging >=20.0 + - platformdirs >=2.5.0 + - python >=3.10 + - requests >=2.19.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pooch?source=hash-mapping + size: 56833 + timestamp: 1769816568869 +- conda: https://conda.anaconda.org/conda-forge/noarch/pox-0.3.7-pyhcf101f3_0.conda + sha256: 15e0135a1cc1edf09b143d094b951c4f48e71f98cfe7ae09c0a9d2ff23990ab7 + md5: 318742fc0a09220302170733a21206c2 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pox?source=hash-mapping + size: 28265 + timestamp: 1768998241130 +- conda: https://conda.anaconda.org/conda-forge/noarch/ppft-1.7.8-pyhcf101f3_1.conda + sha256: b3c908eb1452e0cc314d5b8f10a2f684c6f6c8ab3d6fa7ce7434a6690db8e8f6 + md5: 5ac5ee1ebf1061beaec5f5dbb39f5980 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ppft?source=hash-mapping + size: 35537 + timestamp: 1769007436649 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + sha256: 716960bf0a9eb334458a26b3bdcb17b8d0786062138a4f48c7f335c8418c5d0b + md5: 7859736b4f8ebe6c8481bf48d91c9a1e + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.10 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 201606 + timestamp: 1776858157327 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-hooks-5.0.0-pyhd8ed1ab_2.conda + sha256: b3c0e650280e660268c5c3a609c1d008fab598c41eb310f5c6993590889625e7 + md5: f41a1e00c55bc911fcc9cab2a88b4a66 + depends: + - python >=3.9 + - ruamel.yaml >=0.15 + - tomli >=1.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit-hooks?source=hash-mapping + size: 34986 + timestamp: 1734603755600 +- conda: https://conda.anaconda.org/conda-forge/noarch/prettytable-3.17.0-pyhd8ed1ab_0.conda + sha256: a1cc667bd683f26c319ccab257cd3e17b33f34ef90ff4f548a811a342358c952 + md5: 9a12c482f559d39f3ed9550ba9e0eeb0 + depends: + - python >=3.10 + - wcwidth + constrains: + - ptable >=9999 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prettytable?source=hash-mapping + size: 35808 + timestamp: 1763199361018 +- 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/noarch/prompt_toolkit-3.0.51-hd8ed1ab_0.conda + sha256: 936189f0373836c1c77cd2d6e71ba1e583e2d3920bf6d015e96ee2d729b5e543 + md5: 1e61ab85dd7c60e5e73d853ea035dc29 + depends: + - prompt-toolkit >=3.0.51,<3.0.52.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7182 + timestamp: 1744724189376 +- 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/py-1.11.0-pyhd8ed1ab_1.conda + sha256: f2660eb121032dcbe1f3f5d53a120625698ca6602f32a2aba131bb1023286722 + md5: 9eb1496f8aa577322f293ee0c72983fd + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/apipkg?source=hash-mapping + - pkg:pypi/iniconfig?source=hash-mapping + - pkg:pypi/py?source=hash-mapping + size: 80791 + timestamp: 1734003519402 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda + sha256: 2558727093f13d4c30e124724566d16badd7de532fd8ee7483628977117d02be + md5: 70ece62498c769280f791e836ac53fff + depends: + - python >=3.8 + - pybind11-global ==3.0.1 *_0 + - python + constrains: + - pybind11-abi ==11 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pybind11?source=hash-mapping + size: 232875 + timestamp: 1755953378112 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1 + md5: f0599959a2447c1e544e216bddf393fa + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14671 + timestamp: 1752769938071 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda + sha256: f11a5903879fe3a24e0d28329cb2b1945127e85a4cdb444b45545cf079f99e2d + md5: fe10b422ce8b5af5dab3740e4084c3f9 + depends: + - python >=3.8 + - __unix + - python + constrains: + - pybind11-abi ==11 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pybind11-global?source=hash-mapping + size: 228871 + timestamp: 1755953338243 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + sha256: 1950f71ff44e64163e176b1ca34812afc1a104075c3190de50597e1623eb7d53 + md5: 85815c6a22905c080111ec8d56741454 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycodestyle?source=hash-mapping + size: 35182 + timestamp: 1750616054854 +- 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.17.1-pyhcf101f3_0.conda + sha256: 71161705133df512054177ad03f394e073c39e369dda52fda8e8e0a5371df8c2 + md5: 620cee61c85cf6a407f80e8d502796ec + depends: + - accessible-pygments + - babel + - beautifulsoup4 + - docutils !=0.17.0 + - pygments >=2.7 + - python >=3.10 + - sphinx >=7.0 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pydata-sphinx-theme?source=hash-mapping + size: 1657335 + timestamp: 1776777605561 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydoe-0.9.9-pyhd8ed1ab_0.conda + sha256: a3c4d48de24b3d172ed07de6fa9a44b444d9e0c6c579ca7b96000e03c75adafc + md5: 7b9e66e6ff28c17f5891c08b1ee30dd1 + depends: + - numpy >=2.2.6 + - python >=3.11 + - scipy >=1.15.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pydoe?source=hash-mapping + size: 58860 + timestamp: 1775519304555 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 893031 + timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 + md5: 7d9916ed19ecda71f0b00963365252a7 + depends: + - astroid >=4.0.2,<=4.1.dev0 + - colorama >=0.4.5 + - isort >=5,!=5.13,<9 + - mccabe >=0.6,<0.8 + - platformdirs >=2.2 + - python >=3.10 + - tomli >=1.1 + - tomlkit >=0.10.1 + - dill >=0.3.7 + - python + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/pylint?source=hash-mapping + size: 391910 + timestamp: 1771619020969 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.28.5-h73fd4fa_0.conda + sha256: c3d89e9d2189f74062295e79fd5661115126ecccdd8a042b6ce4476ec9abf6ac + md5: e736c8f9de5defbd75dd8892b065f3cb + depends: + - pymc-base ==5.28.5 pyhc364b38_0 + - pytensor + - python-graphviz + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 10397 + timestamp: 1777723530496 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.28.5-pyhc364b38_0.conda + sha256: 964b13ae62872e1fe0b26049cdc68cc00643de5c1cff48e40b3d8d928e33871b + md5: 1e1c9cc051ccf06acae004447519daba + depends: + - python >=3.11 + - arviz >=0.13.0,<1.0 + - cachetools >=4.2.1,<7 + - cloudpickle + - numpy >=1.25.0 + - pandas >=0.24.0 + - pytensor-base >=2.38.2,<2.39 + - rich >=13.7.1 + - scipy >=1.4.1 + - threadpoolctl >=3.1.0,<4.0.0 + - typing_extensions >=3.7.4 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pymc?source=hash-mapping + size: 397309 + timestamp: 1777723530496 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + size: 110893 + timestamp: 1769003998136 +- 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-9.0.3-pyhc364b38_1.conda + sha256: 960f59442173eee0731906a9077bd5ccf60f4b4226f05a22d1728ab9a21a879c + md5: 6a991452eadf2771952f39d43615bb3e + depends: + - colorama >=0.4 + - pygments >=2.7.2 + - python >=3.10 + - iniconfig >=1.0.1 + - packaging >=22 + - pluggy >=1.5,<2 + - tomli >=1 + - exceptiongroup >=1 + - python + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 299984 + timestamp: 1775644472530 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-codestyle-2.0.1-py_0.tar.bz2 + sha256: 8d6a66942e455cd32fb208b45877bcce11d48452f703bb3ad41f7afc2e768d6b + md5: 74135a4626e6c4bed80955c0adc4d8be + depends: + - pycodestyle + - pytest + - python >3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-codestyle?source=hash-mapping + size: 7701 + timestamp: 1596903015641 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5 + md5: 67d1790eefa81ed305b89d8e314c7923 + depends: + - coverage >=7.10.6 + - pluggy >=1.2 + - pytest >=7 + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + size: 29559 + timestamp: 1774139250481 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda + sha256: 2936717381a2740c7bef3d96827c042a3bba3ba1496c59892989296591e3dabb + md5: 0511afbe860b1a653125d77c719ece53 + depends: + - pytest >=6.2.5 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-mock?source=hash-mapping + size: 22968 + timestamp: 1758101248317 +- 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/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-discovery-1.3.1-pyhcf101f3_0.conda + sha256: 4a44f16a36fec7125b72d5a57bea963fa9deadccf65e29bb5ca610cd1d5cc0af + md5: 45ea5eceb1c2e35a08a834869837a090 + depends: + - python >=3.10 + - filelock >=3.15.4 + - platformdirs <5,>=4.3.6 + - python + license: MIT + purls: + - pkg:pypi/python-discovery?source=compressed-mapping + size: 35067 + timestamp: 1778678120896 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 + md5: 23029aae904a2ba587daba708208012f + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fastjsonschema?source=hash-mapping + size: 244628 + timestamp: 1755304154927 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-25.9.23-pyh1e1bc0e_0.conda + sha256: 1933243d9f839bb7bc6c9b75481b6445f50f8b727eb926086e8a2a347fb0467d + md5: 611207751a2c0b5b999b07b78985d7a0 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/flatbuffers?source=hash-mapping + size: 34827 + timestamp: 1758880404905 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + sha256: 97327b9509ae3aae28d27217a5d7bd31aff0ab61a02041e9c6f98c11d8a53b29 + md5: 32780d6794b8056b78602103a04e90ef + depends: + - cpython 3.12.13.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 46449 + timestamp: 1772728979370 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + sha256: b0139f80dea17136451975e4c0fefb5c86893d8b7bc6360626e8b025b8d8003a + md5: 606d94da4566aa177df7615d68b29176 + depends: + - graphviz >=2.46.1 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/graphviz?source=hash-mapping + size: 38837 + timestamp: 1749998558249 +- 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/pyvista-0.48.2-pyhd8ed1ab_0.conda + sha256: 1b888022034b884921c239c0467275f6b4973b65350435a9e323b0795d5f9bfb + md5: d90d43289d75931f7be528f8eb4ffe3d + depends: + - cyclopts >=4.0.0 + - matplotlib-base >=3.0.1 + - numpy + - pillow + - pooch + - python >=3.10 + - scooby >=0.5.1 + - typing-extensions + - vtk-base !=9.4.0,!=9.4.1,<9.7.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyvista?source=compressed-mapping + size: 2259790 + timestamp: 1778405078289 +- conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda + sha256: 0604c6dff3af5f53e34fceb985395d08287137f220450108a795bcd1959caf14 + md5: 34fa231b5c5927684b03bb296bb94ddc + depends: + - prompt_toolkit >=2.0,<4.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/questionary?source=hash-mapping + size: 31257 + timestamp: 1757356458097 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 + md5: 870293df500ca7e18bedefa5838a22ab + depends: + - attrs >=22.2.0 + - python >=3.10 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + size: 51788 + timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + sha256: 4487fdb341537e2df47159ed8e546add99080974c52d5b2dc2a710910619115a + md5: a5985537dab1ba7034b5ff4ea22e2fa9 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 68658 + timestamp: 1778534036810 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-rst-1.3.2-pyhd8ed1ab_0.conda + sha256: 202e90d6624abc924e185166f6fcfdd29c6749ec26d60480a0a34c898c0b67fd + md5: cbd84dbdb3f5a7d762b5fb2b0d49e7cd + depends: + - docutils + - python >=3.10 + - rich >=12.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich-rst?source=hash-mapping + size: 18299 + timestamp: 1760519277784 +- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + sha256: 30f3c04fcfb64c44d821d392a4a0b8915650dbd900c8befc20ade8fde8ec6aa2 + md5: 0dc48b4b570931adc8641e55c6c17fe4 + depends: + - python >=3.10 + license: 0BSD OR CC0-1.0 + purls: + - pkg:pypi/roman-numerals?source=hash-mapping + size: 13814 + timestamp: 1766003022813 +- conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda + sha256: b48bebe297a63ae60f52e50be328262e880702db4d9b4e86731473ada459c2a1 + md5: 06ad944772941d5dae1e0d09848d8e49 + depends: + - python >=3.10 + - ruamel.yaml.clib >=0.2.15 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml?source=hash-mapping + size: 98448 + timestamp: 1767538149184 +- conda: https://conda.anaconda.org/conda-forge/noarch/salib-1.5.2-pyhd8ed1ab_0.conda + sha256: fc971e80731e39b4e09d05430ccb434cf72cb6a98dd6fcd7db806f59d5e87c6e + md5: 2b46f618a11ce94c030d371707350991 + depends: + - matplotlib-base + - multiprocess + - numpy >=2.0 + - pandas >=1.1.2 + - pathos >=0.2.5 + - python >=3.10 + - scipy >=1.7.3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/salib?source=hash-mapping + size: 663211 + timestamp: 1760238055106 +- conda: https://conda.anaconda.org/conda-forge/noarch/scikit-fem-12.0.1-pyhd8ed1ab_0.conda + sha256: 3021a0de693765ff2d9a591beac2439b2b9b249ce81776df40e0138987d8541f + md5: f616a0c02e18879d8b15a72434a29df7 + depends: + - matplotlib + - meshio >=4.0.4 + - numpy + - python >=3.10 + - scipy + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-fem?source=hash-mapping + size: 117108 + timestamp: 1769671073967 +- conda: https://conda.anaconda.org/conda-forge/noarch/scooby-0.11.2-pyhd8ed1ab_0.conda + sha256: f9c82b8e992963b8c61e20536d7009a6675d3136fcdd737dfc6b60e000d57d3f + md5: c5b13fecbbd3984f12a70599973c6551 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/scooby?source=hash-mapping + size: 24816 + timestamp: 1776995060561 +- 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/noarch/setuptools-81.0.0-pyh332efcf_0.conda + sha256: 6ecf738d5590bf228f09c4ecd1ea91d811f8e0bd9acdef341bc4d6c36beb13a3 + md5: d629a398d7bf872f9ed7b27ab959de15 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 676888 + timestamp: 1770456470072 +- 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=hash-mapping + size: 18455 + timestamp: 1753199211006 +- 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/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + sha256: d1e3e06b5cf26093047e63c8cc77b70d970411c5cbc0cb1fad461a8a8df599f7 + md5: 0401a17ae845fa72c7210e206ec5647d + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/sortedcontainers?source=hash-mapping + size: 28657 + timestamp: 1738440459037 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac + md5: 18de09b20462742fe093ba39185d9bac + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/soupsieve?source=hash-mapping + size: 38187 + timestamp: 1769034509657 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + sha256: 035ca4b17afca3d53650380dd94c564555b7ec2b4f8818111f98c15c7a991b7b + md5: aabfbc2813712b71ba8beb217a978498 + depends: + - alabaster >=0.7.14 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.21,<0.23 + - imagesize >=1.3 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.12 + - requests >=2.30.0 + - roman-numerals >=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: 1584836 + timestamp: 1767271941650 +- 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-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/stable-baselines3-2.8.0-pyhd8ed1ab_0.conda + sha256: d39227b724ed9a6b6420b017cbdd4e4324a1e0e0a285646683960355b87f9f3c + md5: f48306269defdd7294978d1f740dfa3e + depends: + - cloudpickle + - gymnasium >=0.29.1,<1.3.0 + - matplotlib-base + - numpy >=1.20,<3.0 + - pandas + - python >=3.10 + - pytorch >=2.3,<3.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/stable-baselines3?source=hash-mapping + size: 126501 + timestamp: 1775803758824 +- 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/noarch/sympy-1.14.0-pyh2585a3b_106.conda + sha256: 1c8057e6875eba958aa8b3c1a072dc9a75d013f209c26fd8125a5ebd3abbec0c + md5: 32d866e43b25275f61566b9391ccb7b5 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=1.1.0,<1.5 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + size: 4661767 + timestamp: 1771952371059 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + size: 24008591 + timestamp: 1765578833462 +- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 + md5: 3b887b7b3468b0f494b4fad40178b043 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tabulate?source=hash-mapping + size: 43964 + timestamp: 1772732795746 +- conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + sha256: 6b549360f687ee4d11bf85a6d6a276a30f9333df1857adb0fe785f0f8e9bcd60 + md5: f88bb644823094f436792f80fba3207e + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/tblib?source=hash-mapping + size: 19397 + timestamp: 1762956379123 +- conda: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.19.0-pyhd8ed1ab_0.conda + sha256: 348a60f31eb14fd2e10f00d3c7b5036981b9b2d957cf56b1c9fecbfa6c0782d5 + md5: 59cc119240f48dc05369fa8bea07ea05 + 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: 5188674 + timestamp: 1740522550333 +- conda: https://conda.anaconda.org/conda-forge/noarch/tensorflow-probability-0.25.0-pyh8b42bfb_1.conda + sha256: 39baf82f0adc46fd8bbfb376dc355a4144c1bf1c361d94d505aaba4c2b345ef2 + md5: 95886b482047fa2f5e74ef238377a579 + depends: + - absl-py + - cloudpickle >=1.3 + - decorator + - dm-tree + - gast >=0.3.2 + - numpy >=1.13.3 + - python >=3.10 + - six >=1.10.0 + constrains: + - jax >=0.4.35 + - tf-keras >=2.18.0 + - tensorflow-base >=2.18.0 + - tensorflow-datasets >=2.2.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tfp-nightly?source=hash-mapping + size: 2240747 + timestamp: 1762338910685 +- conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.3.0-pyhd8ed1ab_0.conda + sha256: 2107f959cd2a8a804d52e124434088e1a28c843942b62a7f8a3d84072861f0ef + md5: bc6228906129e420c74a5ebaf0d63936 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/termcolor?source=hash-mapping + size: 13259 + timestamp: 1767096412722 +- conda: https://conda.anaconda.org/conda-forge/noarch/testbook-0.4.2-pyhd8ed1ab_1.conda + sha256: 9c9118730d41238a91e9866957ab530ebb40dc08404a279a57d97b113e199838 + md5: 08222f749321b4ca300a2afecdb13e77 + depends: + - nbclient >=0.4.0 + - nbformat >=5.0.4 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/testbook?source=hash-mapping + size: 16831 + timestamp: 1736154170462 +- conda: https://conda.anaconda.org/conda-forge/noarch/tf-keras-2.19.0-pyhd8ed1ab_0.conda + sha256: f52e5c8ee9e7beb08fb2f4d963ddf15ffb154a68f66749907440189ac26a3293 + md5: 7798ccb8b8fcf77ad35eb72151791786 + depends: + - numpy >=1.23 + - python >=3.10 + - tensorflow >=2.19,<2.20 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tf-keras?source=hash-mapping + size: 912796 + timestamp: 1773470434035 +- 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/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda + sha256: 1cd52f9ccb4854c4d731438afe0e833b6b71edaf5ede661152aa98efb3a7cc70 + md5: 42ef10a8f7f5d55a2e267c0d5daa6387 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomlkit?source=hash-mapping + size: 41169 + timestamp: 1778423744478 +- conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + sha256: 4e379e1c18befb134247f56021fdf18e112fb35e64dd1691858b0a0f3bea9a45 + md5: c07a6153f8306e45794774cf9b13bd32 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/toolz?source=hash-mapping + size: 53978 + timestamp: 1760707830681 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 + md5: e5ce43272193b38c2e9037446c1d9206 + depends: + - python >=3.10 + - __unix + - python + license: MPL-2.0 and MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 94132 + timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.0-pyhcf101f3_0.conda + sha256: dfb681579be59c2e790c95f7f49b7529a9b0511d6385ad276e3c8988cbd54d2c + md5: 4bada6a6d908a27262af8ebddf4f7492 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 115165 + timestamp: 1778074251714 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: edd329d7d3a4ab45dcf905899a7a6115 + depends: + - typing_extensions ==4.15.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 91383 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 51692 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.2-pyhcf101f3_0.conda + sha256: 087716b31239125800be5a78033e2015a59ade164dafdcd4bea232096928394a + md5: 8c59af2e72a3660082705902fa6ab23b + depends: + - python >=3.10 + - distlib >=0.3.7,<1 + - filelock <4,>=3.24.2 + - importlib-metadata >=6.6 + - platformdirs >=3.9.1,<5 + - python-discovery >=1 + - typing_extensions >=4.13.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=compressed-mapping + size: 5154898 + timestamp: 1778616159099 +- conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda + sha256: 9ab2c12053ea8984228dd573114ffc6d63df42c501d59fda3bf3aeb1eaa1d23e + md5: 7da1571f560d4ba3343f7f4c48a79c76 + license: MIT + license_family: MIT + purls: [] + size: 140476 + timestamp: 1765821981856 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda + sha256: 1ee2d8384972ecbf8630ce8a3ea9d16858358ad3e8566675295e66996d5352da + md5: eb9538b8e55069434a18547f43b96059 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=hash-mapping + size: 82917 + timestamp: 1777744489106 +- 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/werkzeug-3.1.8-pyhcf101f3_0.conda + sha256: 5108c1bf2f0512e5c9dc8191e31b144c23b7cf0e73423a246173006002368d79 + md5: 3eeca039e7316268627f4116da9df64c + depends: + - markupsafe >=2.1.1 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/werkzeug?source=hash-mapping + size: 258232 + timestamp: 1775160081069 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda + sha256: 9e156ffaefb8463437144326ada4b85d1de17961b9997ac5f1cbbaf747bd8bed + md5: d0e3b2f0030cf4fca58bde71d246e94c + depends: + - packaging >=24.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 33491 + timestamp: 1776878563806 +- conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda + sha256: 0754558be231485ee835b0db11bace246ecd5465143a355029b039803ea716b0 + md5: d34454e27bb9ec7025cefccfa92908ad + depends: + - aiohttp <4 + - msgpack-python >=1,<2 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/wslink?source=hash-mapping + size: 36729 + timestamp: 1773305846931 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + sha256: 9f5f5905afea6e0188aa6887aed0809033143343a7af06983f4b390c2286d2d7 + md5: 099794df685f800c3f319ff4742dc1bb + depends: + - python >=3.11 + - numpy >=1.26 + - packaging >=24.2 + - pandas >=2.2 + - python + constrains: + - bottleneck >=1.4 + - cartopy >=0.23 + - cftime >=1.6 + - dask-core >=2024.6 + - distributed >=2024.6 + - flox >=0.9 + - h5netcdf >=1.3 + - h5py >=3.11 + - hdf5 >=1.14 + - iris >=3.9 + - matplotlib-base >=3.8 + - nc-time-axis >=1.4 + - netcdf4 >=1.6.0 + - numba >=0.60 + - numbagg >=0.8 + - pint >=0.24 + - pydap >=3.5.0 + - scipy >=1.13 + - seaborn-base >=0.13 + - sparse >=0.15 + - toolz >=0.12 + - zarr >=2.18 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/xarray?source=hash-mapping + size: 1017999 + timestamp: 1776122774298 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.10.0-pyhd8ed1ab_0.conda + sha256: 02943091700f860bc3fc117deabe5fd609ed7bae64fd97da2f70241167c2719d + md5: b82273c95432c78efe98f14cbc46be7d + depends: + - numpy >=2.0 + - python >=3.12 + - scipy >=1.13 + - xarray >=2024.02.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/xarray-einstats?source=hash-mapping + size: 38256 + timestamp: 1771933879255 +- conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + sha256: 663ea9b00d68c2da309114923924686ab6d3f59ef1b196c5029ba16799e7bb07 + md5: 4487b9c371d0161d54b5c7bbd890c0fc + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/xyzservices?source=hash-mapping + size: 51732 + timestamp: 1774900074457 +- conda: https://conda.anaconda.org/conda-forge/noarch/yamllint-1.38.0-pyhcf101f3_1.conda + sha256: 7f5bcc0f059c607ccd65fa1b82d8b369c2598a6e86c31f7a4995bc2f2753e2eb + md5: db30cb6c0910cc35e35d3955cf373df2 + depends: + - pathspec >=1.0.0 + - python >=3.10 + - pyyaml + - python + license: GPL-3.0-or-later + license_family: GPL + purls: + - pkg:pypi/yamllint?source=hash-mapping + size: 111901 + timestamp: 1770937575481 +- conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + sha256: 5488542dceeb9f2874e726646548ecc5608060934d6f9ceaa7c6a48c61f9cc8d + md5: e52c2ef711ccf31bb7f70ca87d144b9e + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zict?source=hash-mapping + size: 36341 + timestamp: 1733261642963 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca + md5: e1c36c6121a7c9c76f2f148f1e83b983 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 24461 + timestamp: 1776131454755 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 8325 + timestamp: 1764092507920 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.13.5-py312h9f8c436_0.conda + sha256: 11b13962c9c9a4edc831876f448a908ca6b62cf3f71bd5f0f33387f4d8a7955c + md5: 99fe4bfba47fd1304c087922a3d0e0f8 + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.4.0 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 1001884 + timestamp: 1774999993903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda + sha256: ec238f18ce8140485645252351a0eca9ef4f7a1c568a420f240a585229bc12ef + md5: 7adba36492a1bb22d98ffffe4f6fc6de + depends: + - __osx >=11.0 + - libcxx >=16 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 2235747 + timestamp: 1718551382432 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/astroid-4.0.4-py312h81bd7bf_0.conda + sha256: a4b8f314e2ced66f99d7d5948d3e481f24f336be0db64e6417f6bb9aa0df5fb3 + md5: 6d1f4744a6b483b7738b60f4cd508a20 + depends: + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/astroid?source=hash-mapping + size: 509900 + timestamp: 1770634914230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + sha256: b0747f9b1bc03d1932b4d8c586f39a35ac97e7e72fe6e63f2b2a2472d466f3c1 + md5: 57301986d02d30d6805fdce6c99074ee + depends: + - __osx >=11.0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 347530 + timestamp: 1713896411580 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-ha7d4cc1_3.conda + sha256: ce023981f49a96074bc84d6249c7097b71c27e8d3bd750fc07c520579159521c + md5: 4fbd86a4d1efeb954b0d559d6717bd2b + depends: + - __osx >=11.0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 116717 + timestamp: 1777489477698 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda + sha256: 13c42cb54619df0a1c3e5e5b0f7c8e575460b689084024fd23abeb443aac391b + md5: 8baab664c541d6f059e83423d9fc5e30 + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 45233 + timestamp: 1764593742187 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda + sha256: cd3817c82470826167b1d8008485676862640cff65750c34062e6c20aeac419b + md5: b759f02a7fa946ea9fd9fb035422c848 + depends: + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 224116 + timestamp: 1763585987935 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + sha256: ce405171612acef0924a1ff9729d556db7936ad380a81a36325b7df5405a6214 + md5: 6edccad10fc1c76a7a34b9c14efbeaa3 + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 21470 + timestamp: 1767790900862 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.0-h351c84d_0.conda + sha256: 454c02593d88246ac0fd4fc5e306147dd4f6c4866931c436ddeccdb37a70250f + md5: cb6d3b9905ffa47de2628e1ba9666c33 + depends: + - __osx >=11.0 + - libcxx >=19 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 53822 + timestamp: 1774480046539 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.13-h95cdebe_0.conda + sha256: 7a008a5a2f76256e841a8565b373a7dcfd2a439e5d9dbec320322468637f69e5 + md5: fc4478bc51e76c5d26ea2c4f1e3ba366 + depends: + - __osx >=11.0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 173575 + timestamp: 1774488444724 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_1.conda + sha256: e03ce71af986541d79fae88f7636d7a252b215d4560b47f005050dc9e1dc3c11 + md5: af3d15f053619ca43ea0943de01d368b + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 176967 + timestamp: 1777471210683 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h8860bc9_2.conda + sha256: 19a97f5d06ef994d7f48e77de3f998cc0a72d750d9363f2ba3894234c7bc799e + md5: 826c667323e95b2af0223641c69f327c + depends: + - __osx >=11.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 156329 + timestamp: 1777488187414 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.2-h07b101a_1.conda + sha256: 236b4acfc8b0757e427087b53ebaf090190d106a7e73b6b1e8f80388988e89ac + md5: 7a520ebd6ae9efe641cb207b650d004c + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 131374 + timestamp: 1777824889044 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda + sha256: 8a4ee03ea6e14d5a498657e5fe96875a133b4263b910c5b60176db1a1a0aaa27 + md5: 658a8236f3f1ebecaaa937b5ccd5d730 + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 53430 + timestamp: 1764755714246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + sha256: 06661bc848b27aa38a85d8018ace8d4f4a3069e22fa0963e2431dc6c0dc30450 + md5: 07f6c5a5238f5deeed6e985826b30de8 + depends: + - __osx >=11.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 91917 + timestamp: 1771063496505 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.38.3-hba17502_1.conda + sha256: 917ca9bcd9271a55be1c39dc1b07ce2e6c268c1fd507750d86138d98f708724a + md5: 40aa7f64708aef33749bcedd53d04d2e + depends: + - libcxx >=19 + - __osx >=11.0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-http >=0.10.13,<0.10.14.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.12.2,<0.12.3.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 271073 + timestamp: 1778019218424 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-h30a6df1_4.conda + sha256: 29c21176bc47051ed20db066dc4917b1c9d8e209f936a1737998755061ee133f + md5: 45bb0d0e776ed7cd12597710058c2d50 + depends: + - __osx >=11.0 + - libcxx >=19 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - libcurl >=8.20.0,<9.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.0,<0.7.1.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3261086 + timestamp: 1778156290937 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + sha256: d9a04af33d9200fcd9f6c954e2a882c5ac78af4b82025623e59cb7f7e590b451 + md5: 7efe92d28599c224a24de11bb14d395e + depends: + - __osx >=11.0 + - libcurl >=8.18.0,<9.0a0 + - libcxx >=19 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 290928 + timestamp: 1768837810218 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + sha256: 428fa73808a688a252639080b6751953ad7ecd8a4cbd8f23147b954d6902b31b + md5: ca46cc84466b5e05f15a4c4f263b6e80 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libcxx >=19 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 167424 + timestamp: 1770345338067 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + sha256: 9de2f050a49597e5b98b59bf90880e00bfdff79a3afbb18828565c3a645d62d6 + md5: f08b3b9d7333dc427b79897e6e3e7f29 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 426735 + timestamp: 1770322058844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + sha256: 541be427e681d129c8722e81548d2e51c4b1a817f88333f3fbb3dcdef7eacafb + md5: b658a3fb0fc412b2a4d30da3fcec036f + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 121500 + timestamp: 1770240531430 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + sha256: 1891df88b68768bc042ea766c1be279bff0fdaf471470bfa3fa599284dbd0975 + md5: 601ac4f945ba078955557edf743f1f78 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 198153 + timestamp: 1770384528646 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.5.0-py312h87c4bb7_0.conda + sha256: a492dcf07b1c58797b3192f11aef7e3beb18ec91646d6a5acfe5c6e61e66118d + md5: 6ec306e02579965dc9c01092a5f4ce4c + depends: + - python + - __osx >=11.0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd?source=compressed-mapping + size: 240840 + timestamp: 1778594074672 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-5.0.0-py312h6ef9ec0_1.conda + sha256: f93cb3d56e002e0c2a8e37a4a8c555aaacf2e1eeee751bd838d9f2f58b2446c4 + md5: 93bc90afdb07688a2ff63fbd11950033 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/bcrypt?source=hash-mapping + size: 267217 + timestamp: 1762497792005 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.307-accelerate.conda + build_number: 7 + sha256: 9fd953a26fbbbe833e174a9a130521d3455c0d9ae560c2c76264098fe81b1dca + md5: 671f3e508a42a0a1f962354e7a635bc2 + depends: + - blas-devel 3.11.0 7*_accelerate + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19150 + timestamp: 1778490017653 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.11.0-7_h55bc449_accelerate.conda + build_number: 7 + sha256: 7791d19638bd2bae1395c0f0d2cba444489caaf8266e274c03b1cb300a84d487 + md5: 0b334b13525ef443af35642e18f9284a + depends: + - libblas 3.11.0 7_h3d1d584_accelerate + - libcblas 3.11.0 7_h752f6bc_accelerate + - liblapack 3.11.0 7_hcb0d94e_accelerate + - liblapacke 3.11.0 7_hbdd07e9_accelerate + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18423 + timestamp: 1778489995129 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + sha256: c3fe902114b9a3ac837e1a32408cc2142c147ec054c1038d37aec6814343f48a + md5: 925acfb50a750aa178f7a0aced77f351 + depends: + - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33602 + timestamp: 1733513285902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + sha256: 422ac5c91f8ef07017c594d9135b7ae068157393d2a119b1908c7e350938579d + md5: 48ece20aa479be6ac9a284772827d00c + depends: + - __osx >=11.0 + - brotli-bin 1.2.0 hc919400_1 + - libbrotlidec 1.2.0 hc919400_1 + - libbrotlienc 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 20237 + timestamp: 1764018058424 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + sha256: e2d142052a83ff2e8eab3fe68b9079cad80d109696dc063a3f92275802341640 + md5: 377d015c103ad7f3371be1777f8b584c + depends: + - __osx >=11.0 + - libbrotlidec 1.2.0 hc919400_1 + - libbrotlienc 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 18628 + timestamp: 1764018033635 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py312h0dfefe5_1.conda + sha256: 6178775a86579d5e8eec6a7ab316c24f1355f6c6ccbe84bb341f342f1eda2440 + md5: 311fcf3f6a8c4eb70f912798035edd35 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 359503 + timestamp: 1764018572368 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 180327 + timestamp: 1765215064054 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + sha256: cde9b79ee206fe3ba6ca2dc5906593fb7a1350515f85b2a1135a4ce8ec1539e3 + md5: 36200ecfbbfbcb82063c87725434161f + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 900035 + timestamp: 1766416416791 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + sha256: a8d8f9a6ae4c149d2174f8f52c61da079cc793b87e2f76441a43daf7f394631f + md5: aea08dd508f71d6ca3cfa4e8694e7953 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm22_1_hb5e89dc_4 + - ld64 956.6 llvm22_1_h5b97f1b_4 + - libllvm22 >=22.1.0,<22.2.0a0 + license: APSL-2.0 + license_family: Other + purls: [] + size: 24551 + timestamp: 1772019751097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + sha256: 97075a1afeac8a7a4dca258ac10efb70638e3c734cbf5a6328ca1e0718e09c41 + md5: 97768bb89683757d7e535f9b7dcba39d + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=956.6,<956.7.0a0 + - libcxx + - libllvm22 >=22.1.0,<22.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 22.1.* + - sigtool-codesign + constrains: + - clang 22.1.* + - ld64 956.6.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 749166 + timestamp: 1772019681419 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda + sha256: 597e986ac1a1bd1c9b29d6850e1cdea4a075ce8292af55568952ec670e7dd358 + md5: 503ac138ad3cfc09459738c0f5750705 + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.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: 288080 + timestamp: 1761203317419 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py312hf57c059_1.conda + sha256: 80bb769852c90c763cdb90e55a9f2a392164de907a6df579cc8b94bff85d0158 + md5: bd54402123a03de02e03c509597c635b + depends: + - __osx >=11.0 + - numpy >=1.21.2 + - numpy >=1.23,<3 + - 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/cftime?source=hash-mapping + size: 387077 + timestamp: 1768511266483 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.5-default_hd632d02_1.conda + sha256: 661be9d7e197ac2eeeff52a18f5e2c385497fb523fd91a3e50cf62c792ce3d06 + md5: d440f7fc2d44b55cd806e5a033dcf0a1 + depends: + - __osx >=11.0 + - compiler-rt22 22.1.5.* + - libclang-cpp22.1 22.1.5 default_h8e162e0_1 + - libcxx >=22.1.5 + - libllvm22 >=22.1.5,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 825331 + timestamp: 1778476335771 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.5-default_cfg_hb78b91e_1.conda + sha256: 7861600cd2506d2945c4254c089fe1083b4643146b93f98df58e4dc8d5bbf586 + md5: df62aad1251047d963da339efbc495ad + depends: + - cctools + - clang-22 22.1.5 default_hd632d02_1 + - clang_impl_osx-arm64 22.1.5 default_h17d1ed9_1 + - ld64 + - ld64_osx-arm64 * llvm22_1_* + - llvm-openmp >=22.1.5 + - llvm-tools 22.1.5.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 28682 + timestamp: 1778476413617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-22.1.5-default_h8e162e0_1.conda + sha256: 1348683f1bb903e9a63e3ad003e2530291884fd7a3127f695ea622f86effa32c + md5: ff91dfd45cffd50b06d22d7df575821e + depends: + - __osx >=11.0 + - libclang-cpp22.1 >=22.1.5,<22.2.0a0 + - libclang13 >=22.1.5 + - libcxx >=22.1.5 + - libllvm22 >=22.1.5,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 102846 + timestamp: 1778476581308 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + sha256: 05a2d99ba55f4b401c11a750fac9bee879b3f09a16c1df2415836c46c9fd629f + md5: 743068a5a4061084f22a5f8b6675a3e8 + depends: + - cctools_impl_osx-arm64 + - clang-22 22.1.5 default_hd632d02_1 + - compiler-rt 22.1.5.* + - compiler-rt_osx-arm64 + - ld64_osx-arm64 * llvm22_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 28091 + timestamp: 1778476400908 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-22.1.5-default_cfg_h76039ee_1.conda + sha256: 1f0bf998f0c819c58524e73732c1032f16a96528bd7c4ffd2f1c06047fd10a0e + md5: 613b4558ecec63d30af7fd947b5e07fb + depends: + - clang 22.1.5 default_cfg_hb78b91e_1 + - clangxx_impl_osx-arm64 22.1.5 default_h17d1ed9_1 + - libcxx-devel 22.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 28392 + timestamp: 1778476613862 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.5-default_h17d1ed9_1.conda + sha256: adfc5fa04aecf4a5229d4975bf375aa0cb9f82c7264d45ddab6b4b58443b6718 + md5: c557ba34549e137502e0a59b8715d730 + depends: + - clang-22 22.1.5 default_hd632d02_1 + - clang-scan-deps 22.1.5 default_h8e162e0_1 + - clang_impl_osx-arm64 22.1.5 default_h17d1ed9_1 + - libcxx-devel 22.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 28111 + timestamp: 1778476592829 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cli11-2.6.2-h784d473_0.conda + sha256: f89ec6763a27e7c33a60ff193478cb48be8416adddd05d72f012401e2ef1ae01 + md5: d7fa57f42bc657a10352a044daa141e2 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 100635 + timestamp: 1772207835581 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/commitizen-4.15.1-py312h81bd7bf_0.conda + sha256: a5610b00b86ee67d8b66b24c91f7b157188cf5ed5d603ab850eea7168c8144da + md5: 505ff88c8bdeae6a2dc6339327c54eda + depends: + - argcomplete <3.7,>=1.12.1 + - charset-normalizer <4,>=2.1.0 + - colorama <1.0,>=0.4.1 + - decli <1.0,>=0.6.0 + - deprecated <2,>=1.2.13 + - jinja2 >=2.10.3 + - packaging >=26 + - prompt-toolkit !=3.0.52 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - pyyaml >=3.8 + - questionary <3.0,>=2.0 + - termcolor <4.0.0,>=1.1.0 + - tomlkit <1.0.0,>=0.8.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/commitizen?source=hash-mapping + size: 163210 + timestamp: 1778096010824 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.5-hce30654_1.conda + sha256: a442d55ea02f8615e74b3763b3621598fe432f973bcd6f4cf876704d7e854203 + md5: 98d56b1f4f0ded3a5fc68a22f7b168cc + depends: + - compiler-rt22 22.1.5 hd34ed20_1 + - libcompiler-rt 22.1.5 hd34ed20_1 + constrains: + - clang 22.1.5 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 16462 + timestamp: 1778193616563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.5-hd34ed20_1.conda + sha256: 96478509ecb21e4882034351565f756fcc15f7200032539d37baba9bd290c3e5 + md5: 211e29460c00fa540f34f7710d01c2d4 + depends: + - __osx >=11.0 + - compiler-rt22_osx-arm64 22.1.5.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 99528 + timestamp: 1778193615341 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + sha256: fa1b3967c644c1ffaf8beba3d7aee2301a8db32c0e9a56649a0e496cf3abd27c + md5: f9cce0bc86b46533489a994a47d3c7d2 + depends: + - numpy >=1.25 + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 286084 + timestamp: 1769156157865 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.14.0-py312h04c11ed_0.conda + sha256: f96b3c7ebd947defc940cb53c6cb508b8e53db7e21e30426e154a0b69f528192 + md5: 7568d1be300c1b10faac484fdf425241 + 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: 389749 + timestamp: 1778445251509 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py312h1238841_0.conda + sha256: f2560a639d9f67c53f495d75289a63b840744be04669dc949afb0e694f971fdb + md5: 7a4c2757d53e6a36c45f0eeaf50dac34 + depends: + - __osx >=11.0 + - cffi >=2.0 + - openssl >=3.5.6,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + 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: 1853060 + timestamp: 1777966201485 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.28-hb961e35_1.conda + sha256: 2bb1a8cfc2534b05718c21ffacd806c5c3d5289c9e8be12270d9fc5606c859bf + md5: 784c64a42b083798c5acd2373df5b825 + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libcxx >=19 + - libntlm >=1.8,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + purls: [] + size: 194397 + timestamp: 1771943557428 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py312h2bbb03f_2.conda + sha256: be8d2bf477d0bf8d19a7916c2ceccef33cbfecf918508c18b89098aa7b20017e + md5: 49389c14c49a416f458ce91491f62c67 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - toolz >=0.10.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cytoolz?source=hash-mapping + size: 591797 + timestamp: 1771856474133 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda + sha256: 93e077b880a85baec8227e8c72199220c7f87849ad32d02c14fb3807368260b8 + md5: 5a74cdee497e6b65173e10d94582fae6 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 316394 + timestamp: 1685695959391 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dbus-1.16.2-h3ff7a7c_1.conda + sha256: a8207751ed261764061866880da38e4d3063e167178bfe85b6db9501432462ba + md5: 5a3506971d2d53023c1c4450e908a8da + depends: + - libcxx >=19 + - __osx >=11.0 + - libglib >=2.86.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + license: AFL-2.1 OR GPL-2.0-or-later + purls: [] + size: 393811 + timestamp: 1764536084131 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.20-py312h6510ced_0.conda + sha256: f0ca130b5ffd6949673d3c61d7b8562ab76ad8debafb83f8b3443d30c172f5eb + md5: da3b5efcb0caabcede61a6ce4e0a7669 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - libcxx >=19 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2752978 + timestamp: 1769744996462 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dm-tree-0.1.10-py312h5ac6f9e_0.conda + sha256: 7b2e6ddff2647d02b3f2cbc48ef26892f8b7809d488a72fa9d9fae2194fe2b03 + md5: 8be5e9d293cbd4512ef38134c56172fe + depends: + - __osx >=11.0 + - absl-py >=0.6.1 + - attrs >=18.2.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - numpy >=1.21 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - wrapt >=1.11.2 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/dm-tree?source=hash-mapping + size: 120335 + timestamp: 1775827592725 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.4.0-hf6b4638_0.conda + sha256: 777f73f137c56f390e14d03bae9538f66e4b42025c5fe304531537aca9261060 + md5: 5c2db157899dc09a20dcc87638066120 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 64561 + timestamp: 1773480255077 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda + sha256: 078a5e52e3a845585b39ad441db4445a61eb033ab272991351bfbf722dcb1a72 + md5: 56a644c825e7ea8da0866fcc016190f3 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 1314362 + timestamp: 1773744888755 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + sha256: 75a022706a04890db2d56d2967f06773cbef3e257ae4ce898d60d7a4b8aa99a4 + md5: 517f7185d37c1fab8c8220c1110d82cb + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 13293 + timestamp: 1773744888755 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + sha256: ba685b87529c95a4bf9de140a33d703d57dc46b036e9586ed26890de65c1c0d5 + md5: 3b87dabebe54c6d66a07b97b53ac5874 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 296347 + timestamp: 1758743805063 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.8.0-hf6b4638_0.conda + sha256: 9f8657c32bcff353b218b1bd7369de34c0534dc5a461630b296265e65e94e2d8 + md5: 90f3b6fa818b07e9402d5ee89f3892d5 + depends: + - __osx >=11.0 + - libexpat 2.8.0 hf6b4638_0 + license: MIT + license_family: MIT + purls: [] + size: 135334 + timestamp: 1777846191235 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-8.1.1-gpl_h246f3d5_101.conda + sha256: 0ae2fddd81ad657d18eee5f8273d290f039f2f0075c0da74c2edd60110c62243 + md5: 99b1ce7a32a3bb4da59b7f1a73acc29f + depends: + - __osx >=11.0 + - aom >=3.9.1,<3.10.0a0 + - bzip2 >=1.0.8,<2.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - gmp >=6.3.0,<7.0a0 + - harfbuzz >=14.2.0 + - lame >=3.100,<3.101.0a0 + - libass >=0.17.4,<0.17.5.0a0 + - libcxx >=19 + - libexpat >=2.8.0,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libiconv >=1.18,<2.0a0 + - libjxl >=0.11,<1.0a0 + - liblzma >=5.8.3,<6.0a0 + - libopenvino >=2026.0.0,<2026.0.1.0a0 + - libopenvino-arm-cpu-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-auto-batch-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-auto-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-hetero-plugin >=2026.0.0,<2026.0.1.0a0 + - libopenvino-ir-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-onnx-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-paddle-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-pytorch-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-tensorflow-frontend >=2026.0.0,<2026.0.1.0a0 + - libopenvino-tensorflow-lite-frontend >=2026.0.0,<2026.0.1.0a0 + - libopus >=1.6.1,<2.0a0 + - libplacebo >=7.360.1,<7.361.0a0 + - librsvg >=2.62.1,<3.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libvpx >=1.15.2,<1.16.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - openh264 >=2.6.0,<2.6.1.0a0 + - openssl >=3.5.6,<4.0a0 + - sdl2 >=2.32.56,<3.0a0 + - shaderc >=2026.2,<2026.3.0a0 + - svt-av1 >=4.0.1,<4.0.2.0a0 + - x264 >=1!164.3095,<1!165 + - x265 >=3.5,<3.6.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 9677592 + timestamp: 1777901770154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda + sha256: b8f4ce2919f2542c6688af909c18f9672b2a19efdb57118c5f415dd5ff0fb3cd + md5: 1d6e0829bc8d6907fae9a81f169414ce + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1299156 + timestamp: 1761143339517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda + sha256: dba5d4a93dc62f20e4c2de813ccf7beefed1fb54313faff9c4f2383e4744c8e5 + md5: ae2f556fbb43e5a75cc80a47ac942a8e + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 180970 + timestamp: 1767681372955 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + sha256: 851e9c778bfc54645dcab7038c0383445cbebf16f6bb2d3f62ce422b1605385a + md5: d06ae1a11b46cc4c74177ecd28de7c7a + depends: + - __osx >=11.0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 237308 + timestamp: 1771382999247 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.62.1-py312h04c11ed_0.conda + sha256: bb1a702f2297768c7e4f38e8a97572c7dc4043e2f0180c85388bc8a485fc131f + md5: 796ee212ade2e31537ace26c569b6eaa + 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: 2897154 + timestamp: 1776708811824 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_0.conda + sha256: 5952bd9db12207a18a112e8924aa2ce8c2f9d57b62584d58a97d2f6afe1ea324 + md5: 6dcc75ba2e04c555e881b72793d3282f + depends: + - libfreetype 2.14.3 hce30654_0 + - libfreetype6 2.14.3 hdfa99f5_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173313 + timestamp: 1774298702053 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + sha256: d856dc6744ecfba78c5f7df3378f03a75c911aadac803fa2b41a583667b4b600 + md5: 04bdce8d93a4ed181d1d726163c2d447 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 59391 + timestamp: 1757438897523 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.7.0-py312h512c567_0.conda + sha256: 690af95d69d97b6e1ffead1edd413ca0f8b9189fb867b6bd8fd351f8ad509043 + md5: 9f016ae66f8ef7195561dbf7ce0e5944 + depends: + - __osx >=11.0 + - libcxx >=19 + - 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/frozenlist?source=hash-mapping + size: 52265 + timestamp: 1752167495152 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + sha256: 07cbba4e12430de35ea608eb3006cf1f7f63832c4f89a081cd6f3872944c1aa6 + md5: e67ebd2f639f46e52af8531622fa6051 + depends: + - __osx >=11.0 + - libglib >=2.86.4,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.56,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 548309 + timestamp: 1774986047281 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 +- 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/osx-arm64/glew-2.3.0-hf163413_0.conda + sha256: ee35fae07596ea935e268890d6ff735921dc64e0e914d7a572325e27134506b0 + md5: 3fb37080547d6ecb5e887569cd181819 + depends: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 458581 + timestamp: 1766373683267 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h37541a8_2.conda + sha256: 414bdf86a8096d5706293d163359def2e61b8ffd3fe106bbf2028d79e58e6a97 + md5: 8d4580a91948a6c3383a7c2fbfe5311c + depends: + - libglib ==2.88.1 ha08bb59_2 + - libffi + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 204902 + timestamp: 1778508895255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glslang-16.3.0-h7cb4797_0.conda + sha256: d5bb8e2373cb39d1404ef7dc8019e764b27180c8a0f88ba234a595dc330caabb + md5: 85d9c709161737695252660b174b36f2 + depends: + - __osx >=11.0 + - libcxx >=19 + - spirv-tools >=2026,<2027.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 875961 + timestamp: 1777747792638 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.0-py312he1ee7cc_1.conda + sha256: 5f30afd0ef54b4744eb61f71a5ccc9965d9b07830cecc0db9dc6ce73f39b05c4 + md5: bd0f515e01326c13cc81424233ac7b18 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + size: 194024 + timestamp: 1773245811244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + sha256: c507ae9989dbea7024aa6feaebb16cbf271faac67ac3f0342ef1ab747c20475d + md5: 0fc46fee39e88bbcf5835f71a9d9a209 + depends: + - __osx >=11.0 + - libcxx >=19 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 81202 + timestamp: 1755102333712 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + sha256: 755c72d469330265f80a615912a3b522aef6f26cbc52763862b6a3c492fbf97c + md5: 1f3d859de3ca2bcaa845e92e87d73660 + depends: + - __osx >=11.0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.4,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.86.3,<3.0a0 + - librsvg >=2.60.0,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + purls: [] + size: 2218284 + timestamp: 1769427599940 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py312h0c23288_0.conda + sha256: 47ca1a2b85df8c16cab5f364e41aea61c70b22c1c23f3656e19947fe442fd783 + md5: b498051579243a7f68016a90ee3c83d2 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libgrpc 1.78.1 h3e3f78d_0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.12,<5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 762460 + timestamp: 1774013064868 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + sha256: 26862a9898054b8552e55e609e5ce73c7ef1eb28bbe6fb87f0b9109d73cd09df + md5: 5557a2433b1339b8e536c264afea41ef + depends: + - __osx >=11.0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.5,<3.0a0 + - glib-tools + - harfbuzz >=13.2.1 + - hicolor-icon-theme + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libglib >=2.86.4,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 9385734 + timestamp: 1774288504338 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + sha256: e0f8c7bc1b9ea62ded78ffa848e37771eeaaaf55b3146580513c7266862043ba + md5: 21b4dd3098f63a74cf2aa9159cbef57d + depends: + - libcxx >=15.0.7 + - libglib >=2.76.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 304331 + timestamp: 1686545503242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gymnasium-1.2.3-np2py312hcf3ad39_0.conda + sha256: 2909bfd76b896405b7a2c6901d68ee6ec4ac184bf3d4ecb0467b9b8723256cec + md5: 48600eff20be955e6ee15d995f95da26 + depends: + - python + - cloudpickle >=1.2.0 + - farama-notifications + - jax-jumpy >=1.0.0 + - typing_extensions >=4.3.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/gymnasium?source=hash-mapping + size: 1131351 + timestamp: 1769938812373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hdd01ddf_102.conda + sha256: 68bf1ed50a983c4eea17bab8cb91e7b2bfd19b92f3846e2a057ab1bb78b5b1cd + md5: d6561da751793e9f534b175e070b19d3 + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<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: 1180081 + timestamp: 1775582311942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + sha256: 40ccd6a589c60a4cedb2f9921dfa60ea5845b5ce323477b042b6f90218b239f6 + md5: ea75b03886981362d93bb4708ee14811 + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=78.3,<79.0a0 + - libcxx >=19 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.86.4,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2023669 + timestamp: 1776779039314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + sha256: c3b01e3c3fe4ca1c4d28c287eaa5168a4f2fd3ffd76690082ac919244c22fa90 + md5: ff5d749fd711dc7759e127db38005924 + depends: + - libcxx >=15.0.7 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 762257 + timestamp: 1695661864625 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_109.conda + sha256: 5c49a8d636c4cd712652012a4a6d96188cff26032eb0c56a80e428c121b1596f + md5: fa70cb619977ab679abfe4b4c4202a35 + depends: + - __osx >=11.0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.20.0,<9.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3296683 + timestamp: 1777519194055 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + sha256: 46a4958f2f916c5938f2a6dc0709f78b175ece42f601d79a04e0276d55d25d07 + md5: cfb39109ac5fa8601eb595d66d5bf156 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 17616 + timestamp: 1771539622983 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 12361647 + timestamp: 1773822915649 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py312h8d61f43_0.conda + sha256: 3ba5666c9910a045cb4175aa6d47f555b897e08a32f4e70130e13ef442c26d83 + md5: 87c8022a3fa27834572248287ea81d6c + depends: + - python + - scipy >=1.9 + - ml_dtypes >=0.2.0 + - libcxx >=20 + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + - libre2-11 >=2025.11.5 + - re2 + - python_abi 3.12.* *_cp312 + - openssl >=3.5.5,<4.0a0 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - numpy >=1.23,<3 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + constrains: + - jax >=0.9.2 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jaxlib?source=hash-mapping + size: 70088922 + timestamp: 1774537047767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.6-h726d253_1.conda + sha256: 415c2376eef1bb47f8cc07279ecc54a2fa92f6dfdb508d337dd21d0157e3c8ad + md5: 0ff996d1cf523fa1f7ed63113f6cc052 + depends: + - __osx >=11.0 + - libcxx >=18 + license: LicenseRef-Public-Domain OR MIT + purls: [] + size: 145287 + timestamp: 1733780601066 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda + sha256: 8de440f0e33ab6895e81f2c47c51e59d177349a832087a0367e8e259c97f4833 + md5: 58261af35f0d33fd28e2257b208a1be0 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 68490 + timestamp: 1773067215781 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed + md5: e446e1822f4da8e5080a9de93474184d + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1160828 + timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2 + sha256: f40ce7324b2cf5338b766d4cdb8e0453e4156a4f83c2f31bbfff750785de304c + md5: bff0e851d66725f78dc2fd8b032ddb7e + license: LGPL-2.0-only + license_family: LGPL + purls: [] + size: 528805 + timestamp: 1664996399305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + sha256: d589ff5294e42576563b22bdea0860cb80b0cbe0f3852836eddaadedf6eec4ef + md5: e5ba982008c0ac1a1c0154617371bab5 + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 212998 + timestamp: 1778079809873 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + sha256: 405f08540aedb58fa070b097143b3fe0fcb2b92e3b4aca723780e2f3d754803b + md5: 8254e40b35e6c3159de53275801a6ebc + depends: + - ld64_osx-arm64 956.6 llvm22_1_h692d5aa_4 + - libllvm22 >=22.1.0,<22.2.0a0 + constrains: + - cctools_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 21907 + timestamp: 1772019717408 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + sha256: e4ae2ef85672c094aa3467d466f932ccdc1dda9bd4adac64f4252cc796149091 + md5: 4c2255bf859bff6c52ed38960e3bc963 + depends: + - __osx >=11.0 + - libcxx + - libllvm22 >=22.1.0,<22.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - clang 22.1.* + - ld64 956.6.* + - cctools_impl_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 1038027 + timestamp: 1772019602406 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51 + md5: 095e5749868adab9cae42d4b460e5443 + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 164222 + timestamp: 1773114244984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + sha256: 756611fbb8d2957a5b4635d9772bd8432cb6ddac05580a6284cca6fdc9b07fca + md5: bb65152e0d7c7178c0f1ee25692c9fd1 + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - abseil-cpp =20260107.1 + - libabseil-static =20260107.1=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1229639 + timestamp: 1770863511331 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 + md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 30390 + timestamp: 1769222133373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h37fbca7_1_cpu.conda + build_number: 1 + sha256: 814e775718a3ccafcbcd704b11dc402374513ec6f66241780ff7ffbe7f2ffcda + md5: 9efaddf61a69aeb93cff572fed6baccc + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.38.3,<0.38.4.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libcxx >=21 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 4239511 + timestamp: 1778174861358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-hee8fe31_1_cpu.conda + build_number: 1 + sha256: 4d0f25e14c02a08a9843bf7cb9af8fe00772151ac95a93809482aa7e1002c0ea + md5: 4c849c657fd2f7676c6935a17d9a6c04 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-compute 24.0.0 h3b6a98a_1_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 519410 + timestamp: 1778175198375 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h3b6a98a_1_cpu.conda + build_number: 1 + sha256: 04076544c1797753b4ba145a68727bf68827591de9870867bac5e4e7ca39a829 + md5: 548f34b1374e772de97cdba8774c5f58 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h37fbca7_1_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 2243159 + timestamp: 1778174967068 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-hee8fe31_1_cpu.conda + build_number: 1 + sha256: 2557536377f7e3ae986e47b3584b53ca148d91f6d1b836f3371ff56b15082379 + md5: bfcfc8dc98740cd7577cc25933ce6a62 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-acero 24.0.0 hee8fe31_1_cpu + - libarrow-compute 24.0.0 h3b6a98a_1_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libparquet 24.0.0 h16c0493_1_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 519773 + timestamp: 1778175399688 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_1_cpu.conda + build_number: 1 + sha256: 9ba4cd38cfb7d2830b0e6905a2bfa6dd6c435d81ec3f923dc664b45b91cc742b + md5: e9d4414f2487505ea94cbb0852aa0c51 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h37fbca7_1_cpu + - libarrow-acero 24.0.0 hee8fe31_1_cpu + - libarrow-dataset 24.0.0 hee8fe31_1_cpu + - libcxx >=21 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 455365 + timestamp: 1778175475107 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libass-0.17.4-hcbd7ca7_0.conda + sha256: 079f5fdf7aace970a0db91cd2cc493c754dfdc4520d422ecec43d2561021167a + md5: 0977f4a79496437ff3a2c97d13c4c223 + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - libzlib >=1.3.1,<2.0a0 + - fribidi >=1.0.10,<2.0a0 + - libiconv >=1.18,<2.0a0 + - harfbuzz >=11.0.1 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + license: ISC + purls: [] + size: 138339 + timestamp: 1749328988096 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h3d1d584_accelerate.conda + build_number: 7 + sha256: 56436546803abbc1944516122cda0ccd017ea5420051e3aac6050e2b18982d00 + md5: bb818f20b2e79bc3ff9c01cc55b7786b + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - liblapacke 3.11.0 7*_accelerate + - mkl <2027 + - blas 2.307 accelerate + - liblapack 3.11.0 7*_accelerate + - libcblas 3.11.0 7*_accelerate + track_features: + - blas_accelerate + - blas_accelerate_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2832885 + timestamp: 1778489963495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h0419b56_1.conda + sha256: 6f1450cdde346f12cdfa4f6862cc9aa288a8967a7017cf4ccdbbeb403604e148 + md5: c0cc232de93ca04196d6b4e46037d1f3 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - icu >=78.1,<79.0a0 + - libcxx >=19 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 2154080 + timestamp: 1766347492076 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_1.conda + sha256: 8007d99f1740f67469a6356bc1bce30ba927828848bd749392478213d2975a1b + md5: 26b4c1e484fb6e462721f9d3d15c764b + depends: + - libboost 1.90.0 h0419b56_1 + - libboost-headers 1.90.0 hce30654_1 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 38383 + timestamp: 1766347659405 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_1.conda + sha256: 460b71679d163e305aef91f8e692e20ce3536042d0ce9537692a17a3b024cd51 + md5: d1a15433e40a71e9a879483e4f7bf307 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + purls: [] + size: 14684234 + timestamp: 1766347522812 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229 + md5: 006e7ddd8a110771134fcc4e1e3a6ffa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 79443 + timestamp: 1764017945924 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + sha256: 2eae444039826db0454b19b52a3390f63bfe24f6b3e63089778dd5a5bf48b6bf + md5: 079e88933963f3f149054eec2c487bc2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 29452 + timestamp: 1764017979099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + sha256: 01436c32bb41f9cb4bcf07dda647ce4e5deb8307abfc3abdc8da5317db8189d1 + md5: b2b7c8288ca1a2d71ff97a8e6a1e8883 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + purls: [] + size: 290754 + timestamp: 1764018009077 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_h752f6bc_accelerate.conda + build_number: 7 + sha256: 49dca6d075e7a23d19a6640370e25e3ac046d672b28c6467f517a572ea14c860 + md5: 10646f90b6ae4c58d7e6989f1ba24681 + depends: + - libblas 3.11.0 7_h3d1d584_accelerate + constrains: + - liblapacke 3.11.0 7*_accelerate + - liblapack 3.11.0 7*_accelerate + - blas 2.307 accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18823 + timestamp: 1778489976942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.5-default_h8e162e0_1.conda + sha256: e55e200773e111b021ff60bb47d69033204f9b48590a00e439646968757c4504 + md5: 091664d061ddbca7594cd306fe82d648 + depends: + - __osx >=11.0 + - libcxx >=22.1.5 + - libllvm22 >=22.1.5,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 14186675 + timestamp: 1778476259538 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-22.1.5-default_h6dd9417_1.conda + sha256: d1f50e70f2276dec7d7b0595769deec791080c77e5fb8585d287973305bd6277 + md5: 98ecd7b37d923081e402c3c2f6e39008 + depends: + - __osx >=11.0 + - libcxx >=22.1.5 + - libllvm22 >=22.1.5,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 8936209 + timestamp: 1778476466526 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.5-hd34ed20_1.conda + sha256: 4be653c88cce088080b1b47e3a7a4f3cb85a1d7a8103d9ac4db22e8cf65c624e + md5: 4104db0e6821aa62e2eb48a65e06da24 + depends: + - __osx >=11.0 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 1376087 + timestamp: 1778193605976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + sha256: 38c0bc634b61e542776e97cfd15d5d41edd304d4e47c333004d2d622439b2381 + md5: 2f57b7d0c6adda88957586b7afd78438 + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 400568 + timestamp: 1777462251987 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 + md5: ff484b683fecf1e875dfc7aa01d19796 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 569359 + timestamp: 1778191546305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.5-h6dc3340_1.conda + sha256: bff4b86a8d890571c53ba8306ae6a0077829b2c1c1bc136d36f1423a6c674830 + md5: b877f90f38166751b0c29b5b58ad9009 + depends: + - libcxx >=22.1.5 + - libcxx-headers >=22.1.5,<22.1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 22129 + timestamp: 1778191560604 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 55420 + timestamp: 1761980066242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdovi-3.3.2-h78f8ca3_4.conda + sha256: 0eff0b03662d30b14b6f95a930fedf19948d45b05653389f59ae964ddf92ba9c + md5: 6ece15d35513fb9543cf45310cda72e1 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 278373 + timestamp: 1777839138867 +- 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/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/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c + md5: 65466e82c09e888ca7560c11a97d5450 + depends: + - __osx >=11.0 + constrains: + - expat 2.8.0.* + license: MIT + license_family: MIT + purls: [] + size: 68789 + timestamp: 1777846180142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + sha256: a047a2f238362a37d484f9620e8cba29f513a933cd9eb68571ad4b270d6f8f3e + md5: f73b109d49568d5d1dda43bb147ae37f + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 8091 + timestamp: 1774298691258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + sha256: ff764608e1f2839e95e2cf9b243681475f8778c36af7a42b3f78f476fdbb1dd3 + md5: e98ba7b5f09a5f450eca083d5a1c4649 + depends: + - __osx >=11.0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 338085 + timestamp: 1774298689297 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 + md5: 644058123986582db33aebd4ae2ca184 + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 404080 + timestamp: 1778273064154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + sha256: 269edce527e204a80d3d05673301e0207efcd0dbeebc036a118ceb52690d6341 + md5: fa4a92cfaae9570d89700a292a9ca714 + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + purls: [] + size: 159247 + timestamp: 1766331953491 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 + md5: 1ea03f87cdb1078fbc0e2b2deb63752c + depends: + - libgfortran5 15.2.0 hdae7583_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 139675 + timestamp: 1778273280875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 + md5: ba36d8c606a6a53fe0b8c12d47267b3d + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 599691 + timestamp: 1778273075448 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + sha256: 3b32a7a710132d509f2ea38b2f0384414c863533e0fc7ac71b6a0763e4c67424 + md5: 62d6f3b832d7d79ae0c0aa1bb3c325fa + depends: + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + size: 4439458 + timestamp: 1778508895255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + sha256: 632d23ea1c00b2f439d8846d4925646dafa6c0380ecc3353d8a9afa878829539 + md5: b4e0ec13e232efea554bb5155dc1ef32 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libcxx >=19 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.5,<4.0a0 + constrains: + - libgoogle-cloud 3.3.0 *_1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1773417 + timestamp: 1774214139261 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + sha256: 024e3e099a478b3b89e0dee32348a55c6a1237fe66aa730172ae642f63ffc093 + md5: 7fb98178c58d71ba046a451968d8579f + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=19 + - libgoogle-cloud 3.3.0 he41eb1d_1 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + size: 523970 + timestamp: 1774214725148 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + sha256: a6e01573795484c2200e499ddffb825d24184888be6a596d4beaceebe6f8f525 + md5: 17b9e07ba9b46754a6953999a948dcf7 + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 4820402 + timestamp: 1774012715207 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + sha256: d47c3c030671d196ff1cdd343e93eb2ae0d7b665cb79f8164cc91488796db437 + md5: fed55ddd65a830cb62e78f07cfffcd41 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2339152 + timestamp: 1770953916323 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + sha256: 4fcad3cbec60da940312e883b7866816517acc5f9baecfe9a778de57327a1b1b + md5: 7394850583ca88325244b68b532c7a39 + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 OR BSD-3-Clause + purls: [] + size: 609931 + timestamp: 1776990524407 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + purls: [] + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + sha256: 17e035ae6a520ff6a6bb5dd93a4a7c3895891f4f9743bcb8c6ef607445a31cd0 + md5: b8a7544c83a67258b0e8592ec6a5d322 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 555681 + timestamp: 1775962975624 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + sha256: 948cf1370abb58e06a7c9554838c68672ef1d78e01c3fc4e62ccfc3072579645 + md5: 05bead8980f5ae6a070117dacec38b5b + depends: + - libcxx >=19 + - __osx >=11.0 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1032419 + timestamp: 1777065264956 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hcb0d94e_accelerate.conda + build_number: 7 + sha256: 9ecf0466775c9f754e8ffa37c0773fe20b2cd3652d6c6c9fe2ef347a7629aeb5 + md5: 6f9583c773e6e4888826118967413c03 + depends: + - libblas 3.11.0 7_h3d1d584_accelerate + constrains: + - liblapacke 3.11.0 7*_accelerate + - blas 2.307 accelerate + - libcblas 3.11.0 7*_accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18836 + timestamp: 1778489984337 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.11.0-7_hbdd07e9_accelerate.conda + build_number: 7 + sha256: e2847da6e52411b59fb8a98ac50a8b61f883f9736c03e30b82fc5fc9af65b558 + md5: bb32266f21b01dc0e37a51fb0b3373c3 + depends: + - libblas 3.11.0 7_h3d1d584_accelerate + - libcblas 3.11.0 7_h752f6bc_accelerate + - liblapack 3.11.0 7_hcb0d94e_accelerate + constrains: + - blas 2.307 accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18846 + timestamp: 1778489992110 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.5-h89af1be_1.conda + sha256: 23dec5565018f13742b63cdc401d403411fc68713bc6f49dab3854fd4fc4fcc3 + md5: 2d7889ebb30d8b3425e369f4f262a789 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 30038795 + timestamp: 1778412238119 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.3-h8088a28_0.conda + sha256: 3002be39c0e98ec6cd103b0dc2963dc9e0d7cab127fb2fe9a8de9707a76ed1f0 + md5: ebe1f5418d6e2d4bbc26b2c906a0a470 + depends: + - __osx >=11.0 + - liblzma 5.8.3 h8088a28_0 + license: 0BSD + purls: [] + size: 118482 + timestamp: 1775825828010 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h7a8d41e_104.conda + sha256: db5bd198e5b22277beab224f2e89527fa260d97081bc32dfad797c8530b5eca6 + md5: a78ca7f5fd6a7431bc0c128c2ce759be + depends: + - __osx >=11.0 + - blosc >=1.21.6,<2.0a0 + - bzip2 >=1.0.8,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - libzip >=1.11.2,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 679634 + timestamp: 1776687193083 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + sha256: 2bc7bc3978066f2c274ebcbf711850cc9ab92e023e433b9631958a098d11e10a + md5: 6ea18834adbc3b33df9bd9fb45eaf95b + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 576526 + timestamp: 1773854624224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda + sha256: ea8c680924d957e12270dca549620327d5e986f23c4bd5f45627167ca6ef7a3b + md5: c90c1d3bd778f5ec0d4bb4ef36cbd5b6 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 31099 + timestamp: 1734670168822 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libogg-1.3.5-h48c0fde_1.conda + sha256: 28bd1fe20fe43da105da41b95ac201e95a1616126f287985df8e86ddebd1c3d8 + md5: 29b8b11f6d7e6bd0e76c029dcf9dd024 + depends: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 216719 + timestamp: 1745826006052 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + sha256: 47ce35cc7b903d546cc8ac0a09abfab7aea955147dc18bb2c9eaa5dc7c378a37 + md5: 8cb49289db7cfec1dea3bf7e0e4f0c8d + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 hce30654_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 579527 + timestamp: 1774001294901 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + sha256: 17f18bab128650598d2f09ae653ab406b9f049e0692b4519a2cf09a6f1603ee9 + md5: efdb13315f1041c7750214a20c1ab162 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 396412 + timestamp: 1774001222028 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-2026.0.0-h3e6d54f_1.conda + sha256: ffbd4a3c8540dfaddbdd68cf3073967a3c8faadd97d7df912f73734e53f9213e + md5: 8e140a6e2a1db294892a8da72c9afb0e + depends: + - __osx >=11.0 + - libcxx >=19 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 4515660 + timestamp: 1772716610278 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-arm-cpu-plugin-2026.0.0-h3e6d54f_1.conda + sha256: 352ebc24805cb756ef11afa5c9606b3e19da99e434afc35cddc356538b5ec49d + md5: 48f3117552be579619620f3b6768b52f + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - pugixml >=1.15,<1.16.0a0 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8759182 + timestamp: 1772716648998 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-batch-plugin-2026.0.0-h2406d2e_1.conda + sha256: 1cbbf43149334ccf793f782bd0924e08e5952c667578ac33a33076a4ab54ad47 + md5: 6012967b53bf790c2ad9160c2779d7bc + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 105710 + timestamp: 1772716704250 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-auto-plugin-2026.0.0-h2406d2e_1.conda + sha256: fa6c01a897ccc92998cae1e75ac65c68f311ad0834182801d5d3139ac307309f + md5: 52839e682c6bde645a9f4cdcdfc33639 + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - tbb >=2022.3.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 213574 + timestamp: 1772716732087 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-hetero-plugin-2026.0.0-h85cbfa6_1.conda + sha256: 18e6b6d061d27049e2a34fbd1a633209294eb700aa7eee7a3d2877ce4d45888b + md5: 77d314ff80fb262dbe061527dec60263 + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - pugixml >=1.15,<1.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 184975 + timestamp: 1772716757394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-ir-frontend-2026.0.0-h85cbfa6_1.conda + sha256: 166792875fe62f90a528a4931f29ea18cf74694469870e98c8772460f92fc653 + md5: c7f37a124ab9a53444d213a3db5f9747 + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - pugixml >=1.15,<1.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 172169 + timestamp: 1772716782643 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-onnx-frontend-2026.0.0-h41365f2_1.conda + sha256: eb307ee1ad8eb47aa011d03d77995bfd1153b80893ab5880fd928093ad50cab4 + md5: 8d32df9ac0c17ba2735e26be190399f6 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1425474 + timestamp: 1772716809587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-paddle-frontend-2026.0.0-h41365f2_1.conda + sha256: e3ca93158beac502b65256ae78736889e8b40184b0dc938a1b8136ae2a0c3a4d + md5: 6c821b72c8e5b0467f3d39a33e357064 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 434092 + timestamp: 1772716839090 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-pytorch-frontend-2026.0.0-hf6b4638_1.conda + sha256: c694e5dc1bbb2ea876e65c8c33b148a24f56b5f7a60f8449ca62b159d9020709 + md5: 7cd9c1d466e5be74f5cb32f545b1b887 + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 823766 + timestamp: 1772716865028 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-frontend-2026.0.0-hc295da0_1.conda + sha256: f680809aef09ca68d7446e3f1810ca3f3d9f744cbfe3a8d8ec9bd807f17d80fd + md5: 09d1d2b4e5648afd706e2252299087f4 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - snappy >=1.2.2,<1.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 910147 + timestamp: 1772716892527 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenvino-tensorflow-lite-frontend-2026.0.0-hf6b4638_1.conda + sha256: 3079cdc940a7e0b84376845accefd084f9a01c37af5901083ae47cc02fd5723d + md5: 361b9eb57e71939cf3d35fa1145a6325 + depends: + - __osx >=11.0 + - libcxx >=19 + - libopenvino 2026.0.0 h3e6d54f_1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 379126 + timestamp: 1772716918802 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopus-1.6.1-h1a92334_0.conda + sha256: 5c95a5f7712f543c59083e62fc3a95efec8b7f3773fbf4542ad1fb87fbf51ff4 + md5: 7f414dd3fd1cb7a76e51fec074a9c49e + depends: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 308000 + timestamp: 1768497248058 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h16c0493_1_cpu.conda + build_number: 1 + sha256: 72e5dc5747144cc4e8ea4c287509c69c6f8d1c72a678285e39e3df76867cef5b + md5: 5b32ce08a542383f4c72cdee323979e8 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h37fbca7_1_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1098422 + timestamp: 1778175143698 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libplacebo-7.360.1-h176d363_0.conda + sha256: e9b39572e2feaef496167ba9f4ab75ed3afa4c16c3aeb0bb8c71adc515a74536 + md5: 7402fdef0c155dcd18c0ff4c5853c4b2 + depends: + - __osx >=11.0 + - libcxx >=19 + - libdovi >=3.3.2,<4.0a0 + - shaderc >=2026.2,<2026.3.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - lcms2 >=2.19,<3.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 529463 + timestamp: 1777836126438 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + sha256: 66eae34546df1f098a67064970c92aa14ae7a7505091889e00468294d2882c36 + md5: 2259ae0949dbe20c0665850365109b27 + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 289546 + timestamp: 1776315246750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-18.3-hd341ff2_0.conda + sha256: 625b59f5b3c750a2e4c5a0a4ade5b4f1c3d6b8d6a781797324344c03270a529a + md5: fc064efe5042bcaf994307822ccbb1f1 + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.5,<4.0a0 + license: PostgreSQL + purls: [] + size: 2705141 + timestamp: 1772136813226 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + sha256: 626852cd50690526c9eac216a9f467edd4cbb01060d0efe41b7def10b54bdb08 + md5: b839e3295b66434f20969c8b940f056a + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libcxx >=19 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2713660 + timestamp: 1769748299578 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + sha256: 1e2d23bbc1ffca54e4912365b7b59992b7ae5cbeb892779a6dcd9eca9f71c428 + md5: 40d8ad21be4ccfff83a314076c3563f4 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libcxx >=19 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 165851 + timestamp: 1768190225157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + sha256: 4d28ad0213fca6f93624c27f13493b986ce63e05386d2ff7a2ad723c4e7c7cec + md5: 4766fd69e64e477b500eb901dbe7bb6b + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.5,<3.0a0 + - harfbuzz >=13.1.1 + - libglib >=2.86.4,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 2402915 + timestamp: 1773816188394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 + md5: c08557d00807785decafb932b5be7ef5 + depends: + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 36416 + timestamp: 1767045062496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 + md5: 7cc5247987e6d115134ebab15186bc13 + depends: + - __osx >=11.0 + license: ISC + purls: [] + size: 248039 + timestamp: 1772479570912 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 + md5: 6681822ea9d362953206352371b6a904 + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + size: 920047 + timestamp: 1777987051643 +- 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/osx-arm64/libtensorflow_cc-2.19.1-cpu_he004e32_5.conda + sha256: c837eabe8f2c7b525528066591893b4ef5824586699546e0d2fb88c19f73e178 + md5: b3ce8a2d91f9e512afb54b1c275edca9 + depends: + - libml_dtypes-headers >=0.5.1,<0.6 + - libtensorflow_framework ==2.19.1 cpu_h3441331_5 + - __osx >=11.0 + - libcxx >=19 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.6,<4.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - icu >=78.3,<79.0a0 + - libcurl >=8.20.0,<9.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libpng >=1.6.58,<1.7.0a0 + - giflib >=5.2.2,<5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 137616400 + timestamp: 1778106412562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtensorflow_framework-2.19.1-cpu_h3441331_5.conda + sha256: 8873ad429159f54a36eceecc21615a9e7a8f82b30c0731da9d8abfb65ddb8401 + md5: a74afedaa52fde24ac79bbb04ab7a9ac + depends: + - __osx >=11.0 + - libcxx >=19 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.6,<4.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - icu >=78.3,<79.0a0 + - libcurl >=8.20.0,<9.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - flatbuffers >=25.9.23,<25.9.24.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libpng >=1.6.58,<1.7.0a0 + - giflib >=5.2.2,<5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8850906 + timestamp: 1778106412562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtheora-1.1.1-h99b78c6_1006.conda + sha256: 05d8f9a4ae6669ebf8d69ec7f62c47b197b885ff989641d8a8043a1159d50c22 + md5: 4b0af7570b8af42ac6796da8777589d1 + depends: + - __osx >=11.0 + - libogg 1.3.* + - libogg >=1.3.5,<1.4.0a0 + - libvorbis 1.3.* + - libvorbis >=1.3.7,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 282764 + timestamp: 1719667898064 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + sha256: 568bb23db02b050c3903bec05edbcab84960c8c7e5a1710dac3109df997ac7f1 + md5: d006875f9a58a44f92aec9a7ebeb7150 + depends: + - __osx >=11.0 + - libcxx >=19 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 323017 + timestamp: 1777019893083 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f + md5: e2a72ab2fa54ecb6abab2b26cde93500 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.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: 373892 + timestamp: 1762022345545 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.10.0-cpu_generic_hf7cc835_3.conda + sha256: a47f1ec77004982a78e3e1533d841bea0930c22594c12bc67e2cb74cd7709b97 + md5: 98f89ad42eaba858443d31336677aed2 + depends: + - __osx >=11.0 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=19.1.7 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch-cpu 2.10.0 + - openblas * openmp_* + - pytorch-gpu <0.0a0 + - libopenblas * openmp_* + - pytorch 2.10.0 cpu_generic_*_3 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 30298089 + timestamp: 1772181525404 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + sha256: 5eee9a2bf359e474d4548874bcfc8d29ebad0d9ba015314439c256904e40aaad + md5: f6654e9e96e9d973981b3b2f898a5bfa + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 83849 + timestamp: 1748856224950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + sha256: ae1a82e62cd4e3c18e005ae7ff4358ed72b2bfbfe990d5a6a5587f81e9a100dc + md5: 2255add2f6ae77d0a96624a5cbde6d45 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 87916 + timestamp: 1768735311947 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 421195 + timestamp: 1753948426421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvorbis-1.3.7-h81086ad_2.conda + sha256: 95768e4eceaffb973081fd986d03da15d93aa10609ed202e6fd5ca1e490a3dce + md5: 719e7653178a09f5ca0aa05f349b41f7 + depends: + - libogg + - libcxx >=19 + - __osx >=11.0 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 259122 + timestamp: 1753879389702 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvpx-1.15.2-ha759d40_0.conda + sha256: d21729b04fe101d1b2f8cdd607faacf1070abba3702db699787a3fe026eeaca6 + md5: 0d2febd301e25a48e00447b300d68f9c + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1192913 + timestamp: 1762010603501 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libvulkan-loader-1.4.341.0-h3feff0a_0.conda + sha256: d2790dafc9149b1acd45b9033d02cfa3f3e9ee5af97bd61e0a5718c414a0a135 + md5: 6b4c9a5b130759136a0dde0c373cb0ea + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - libvulkan-headers 1.4.341.0.* + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 180304 + timestamp: 1770077143460 +- 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/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/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + sha256: ff75b84cdb9e8d123db2fa694a8ac2c2059516b6cbc98ac21fb68e235d0fd354 + md5: 19edaa53885fc8205614b03da2482282 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + size: 466360 + timestamp: 1776377102261 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + sha256: 2fe1d8de0854342ae9cabe408b476935f82f5636e153b3b497456264dc8ff3a1 + md5: 8e037d73747d6fe34e12d7bcac10cf21 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h5ef1a60_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 41102 + timestamp: 1776377119495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + sha256: 507599a77c1ce823c2d3acaefaae4ead0686f183f3980467a4c4b8ba209eff40 + md5: 7177414f275db66735a17d316b0a81d6 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 125507 + timestamp: 1730442214849 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + sha256: 2cd49562feda2bf324651050b2b035080fd635ed0f1c96c9ce7a59eff3cc0029 + md5: 8a4e2a54034b35bc6fa5bf9282913f45 + depends: + - __osx >=11.0 + constrains: + - openmp 22.1.5|22.1.5.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 285806 + timestamp: 1778447786965 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.5-hb545844_1.conda + sha256: b07a4e463a52e5a1bdaf9ca413a6495fa46aa1446ceadd6ba1ff168f386716e5 + md5: c33fcec235638c72a2084657b038c541 + depends: + - __osx >=11.0 + - libcxx >=19 + - libllvm22 22.1.5 h89af1be_1 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 17835396 + timestamp: 1778412358363 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.5-hd34ed20_1.conda + sha256: 9e791556dddfd53363732fa369655536c21f7492d0ff35587172b810d8d9fad4 + md5: 9db24df0a236587f7fd247cbc6f66d92 + depends: + - __osx >=11.0 + - libllvm22 22.1.5 h89af1be_1 + - llvm-tools-22 22.1.5 hb545844_1 + constrains: + - llvm 22.1.5 + - clang 22.1.5 + - clang-tools 22.1.5 + - llvmdev 22.1.5 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 52214 + timestamp: 1778412425638 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py312h7ca588d_1.conda + sha256: dc8477d74574e5b4bd4b45882f021a95f8a311b66633869e9b4d750e00a81add + md5: 24c6c9295e1048c90b8b1c3e9b6340f0 + depends: + - __osx >=11.0 + - libcxx >=19 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 24314492 + timestamp: 1776077372867 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py312h2b25a0d_1.conda + sha256: fb2c6c6d0078cc7097f71ca4117adfb013163dd7845d3a7b90c80cf8c324b2e3 + md5: 43132aaf61e6d8a59624b2da26aec518 + depends: + - python + - lz4-c + - __osx >=11.0 + - python 3.12.* *_cpython + - lz4-c >=1.10.0,<1.11.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/lz4?source=hash-mapping + size: 125772 + timestamp: 1765026411222 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + sha256: 330394fb9140995b29ae215a19fad46fcc6691bdd1b7654513d55a19aaa091c1 + md5: 11d95ab83ef0a82cc2de12c1e0b47fe4 + 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: 25564 + timestamp: 1772445846939 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.9-py312h1f38498_0.conda + sha256: 79d518d9556ce81ff4e55e3e947a5a8cb6b1c4a101536e86ab90c34d2c80efcf + md5: 94174d301ce2f5962197fb9b880ea8ff + depends: + - matplotlib-base >=3.10.9,<3.10.10.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 17770 + timestamp: 1777001080046 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.9-py312hf3defc7_0.conda + sha256: c2dc997012fb8a901163cdad333ba5ba27733aa26d67a28a6501f4b4d69fcbce + md5: e5d83f3ae6ada32d4e64e366a41f9ff6 + depends: + - __osx >=11.0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.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=hash-mapping + size: 8191891 + timestamp: 1777001043842 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mesalib-26.0.3-h6616f17_0.conda + sha256: 1e20c96b96d0ca05fbacc6e0d0f3839e9dce5cf93bd7dc96ab3ce238fa732680 + md5: 6fa08e5346520c364de1b96b231e959e + depends: + - libcxx >=20 + - __osx >=12.3 + - libexpat >=2.7.4,<3.0a0 + - zstd >=1.5.7,<1.6.0a0 + - spirv-tools >=2026,<2027.0a0 + - libzlib >=1.3.1,<2.0a0 + - libllvm22 >=22.1.1,<22.2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2547385 + timestamp: 1773868300799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py312h60fbb24_1.conda + sha256: 8a0d3e818b44af3b300d169396d807467eebd292505a96ffce5dd4d7c8731942 + md5: 75b22b97f4e00dd1bcdf6e9c9d8610bb + depends: + - python + - python 3.12.* *_cpython + - libcxx >=19 + - __osx >=11.0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 243518 + timestamp: 1771362387850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + sha256: a9774664adea222e4165efddcd902641c03c7d08fda3a83a5b0885e675ead309 + md5: 2845c3a1d0d8da1db92aba8323892475 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + size: 86181 + timestamp: 1774472395307 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda + sha256: af5eca85f7ffdd403275e916f1de40a7d4b48ae138f12479523d9500c6a073ba + md5: a47a14da2103c9c7a390f7c8bc8d7f9b + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 348767 + timestamp: 1773414111071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py312h84eede6_1.conda + sha256: 1540339678e13365001453fdcb698887075a2b326d5fab05cfd0f4fdefae4eab + md5: e3973f0ac5ac854bf86f0d5674a1a289 + depends: + - __osx >=11.0 + - libcxx >=19 + - 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/msgpack?source=hash-mapping + size: 91268 + timestamp: 1762504467174 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.7.1-py312h43af8aa_0.conda + sha256: d7f2c4137271b158a452d02a5a3c4ceade8e8e75352fc90a4360f4a7eda9be9f + md5: 8094abe00f22955a9396d91c690f36e8 + 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/multidict?source=hash-mapping + size: 87852 + timestamp: 1771611147963 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.19-py312hb3ab3e3_0.conda + sha256: e6684816e5cd74b664ba2adbcfdbfa9434702690a2ba10f62ed41566ed5b38d1 + md5: 7aa7f3104e4fe84565e0b9a77086736f + depends: + - python + - dill >=0.4.1 + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multiprocess?source=hash-mapping + size: 371957 + timestamp: 1769086875473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.20.2-py312hefc2c51_0.conda + sha256: 1e51597a605b2160bce7348cfa98ba50bb9d1f8a9c84c900ec439bde5c7da255 + md5: 7b0f9713b276fe257a55a4a0087bafa7 + depends: + - __osx >=11.0 + - mypy_extensions >=1.0.0 + - pathspec >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-librt >=0.8.0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 11889344 + timestamp: 1776803962764 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311h8d5b1ca_107.conda + noarch: python + sha256: 7a970ec23c8bbc28ca4b9e87f9f433e88652be4a486b985b734a24aa99a390e3 + md5: d8b44220d12594fcfb4461fde6c4e803 + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + - numpy >=1.23,<3 + - _python_abi3_support 1.* + - cpython >=3.11 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/netcdf4?source=hash-mapping + size: 996533 + timestamp: 1774640101490 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + sha256: 1945fd5b64b74ef3d57926156fb0bfe88ee637c49f3273067f7231b224f1d26d + md5: 755cfa6c08ed7b7acbee20ccbf15a47c + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 137595 + timestamp: 1768670878127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py312h2d3d6e9_1.conda + sha256: 304cc4894ed021d6101801219449afcca1179c7f1c700cc7a87b543a9bbbc7e7 + md5: 489bd27f778c3194664c82447b73bc96 + depends: + - __osx >=11.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libopenblas >=0.3.18,!=0.3.20 + - scipy >=1.0 + - tbb >=2021.6.0 + - cuda-python >=11.6 + - cuda-version >=11.2 + - cudatoolkit >=11.2 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 5721304 + timestamp: 1778390934553 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py312ha003a3f_0.conda + sha256: 817fd3c66965a3d9750bd420af52a12e85dfc769a1fe1162170680f4cd58d873 + md5: 47a61f04473bcc6121d449ee7f67f799 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - libblas >=3.9.0,<4.0a0 + - liblapack >=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=compressed-mapping + size: 6840412 + timestamp: 1778655476542 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openh264-2.6.0-hb5b2745_0.conda + sha256: fbea05722a8e8abfb41c989e2cec7ba6597eabe27cb6b88ff0b6443a5abb9069 + md5: 6ff0890a94972aca7cc7f8f8ef1ff142 + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 601538 + timestamp: 1739400923874 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4 + md5: 4b5d3a91320976eec71678fad1e3569b + depends: + - __osx >=11.0 + - libcxx >=19 + - libpng >=1.6.55,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 319697 + timestamp: 1772625397692 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.13-hf7f56bc_0.conda + sha256: 4a7b691a5b2241ee10f59a9e51f68be4cf1e4294829cebb40d198139a561e780 + md5: 7940b03e5c1e85b0c8b8a74f3011783f + depends: + - __osx >=11.0 + - cyrus-sasl >=2.1.28,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libcxx >=19 + - openssl >=3.5.6,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + purls: [] + size: 844724 + timestamp: 1775742074928 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea + md5: 25dcccd4f80f1638428613e0d7c9b4e1 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3106008 + timestamp: 1775587972483 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.19.1-py312h766f71e_0.conda + sha256: 9a5d3944bd6281fb2f2004d06ff3caa60846c642c7a739a9026b037833cda57f + md5: af48088edf339bdea37725f49d4fefea + 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: 437049 + timestamp: 1778048481638 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + sha256: 8594f064828cca9b8d625e2ebe79436fd4ffc030c950573380c54a8f4329f955 + md5: 77bfe521901c1a247cc66c1276826a85 + depends: + - tzdata + - libcxx >=19 + - __osx >=11.0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - lz4-c >=1.10.0,<1.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 548180 + timestamp: 1773230270828 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py312h6510ced_0.conda + sha256: 7202013525593f57a452dac7e5fee9f26478822be3ba5c893643517b8627406d + md5: 4581a32b837950217327fcab93214313 + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - __osx >=11.0 + - python 3.12.* *_cpython + - libcxx >=19 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=compressed-mapping + size: 13926263 + timestamp: 1778602825408 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda + sha256: 2074598145bf286490d232c6f0a3d301403305d56f5c45a0170f44bc00fde8e5 + md5: 81203e2c973f049afba930cf6f79c695 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 23192144 + timestamp: 1773933643305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + sha256: b57c59cf5abb06d407b3a79017b990ca5bfb10c15a10c62fc29e113f2b12d9a9 + md5: 4b433508ebb295c05dd3d03daf27f7bb + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 425743 + timestamp: 1774282709773 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba + md5: 9b4190c4055435ca3502070186eba53a + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 850231 + timestamp: 1763655726735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py312h4e908a4_0.conda + sha256: f7ee5d45bf16184d2b53f0d35c98c06e4e82e21688ce93e52b55c02ec7153bf3 + md5: 0634560e556adb3e7924668e49ad53fc + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - libxcb >=1.17.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - tk >=8.6.13,<8.7.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - lcms2 >=2.18,<3.0a0 + - python_abi 3.12.* *_cp312 + - openjpeg >=2.5.4,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 965082 + timestamp: 1775060469004 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + sha256: 29c9b08a9b8b7810f9d4f159aecfd205fce051633169040005c0b7efad4bc718 + md5: 17c3d745db6ea72ae2fce17e7338547f + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 248045 + timestamp: 1754665282033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.8.1-ha88f16d_0.conda + sha256: f5818ac1741aa91b43185989b35319e6dd819c7beab271fc2bb7fda4be089128 + md5: 1d135fa1ea825987507d1e14e4187b1e + depends: + - sqlite + - libtiff + - libcurl + - __osx >=11.0 + - libcxx >=19 + - libsqlite >=3.53.0,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libcurl >=8.19.0,<9.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + purls: [] + size: 3146690 + timestamp: 1775840276015 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.3.1-py312h998013c_0.conda + sha256: dd97df075f5198d42cc4be6773f1c41a9c07d631d95f91bfee8e9953eccc965b + md5: d8280c97e09e85c72916a3d98a4076d7 + 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/propcache?source=hash-mapping + size: 51972 + timestamp: 1744525285336 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py312h857ab9a_2.conda + sha256: 3e8720f23829f60103f61fc5e53ac36535da5896855a98d2bbbc6a35e78be430 + md5: db3dd88ca6652ab2485d11f88a2b1d59 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 465012 + timestamp: 1773265421534 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_0.conda + sha256: 6d0e21c76436374635c074208cfeee62a94d3c37d0527ad67fd8a7615e546a05 + md5: fd856899666759403b3c16dcba2f56ff + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 239031 + timestamp: 1769678393511 +- 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/osx-arm64/pugixml-1.15-hd3d436d_0.conda + sha256: 5ad8d036040b095f85d23c70624d3e5e1e4c00bc5cea97831542f2dcae294ec9 + md5: b9a4004e46de7aeb005304a13b35cb94 + depends: + - __osx >=11.0 + - libcxx >=18 + license: MIT + license_family: MIT + purls: [] + size: 91283 + timestamp: 1736601509593 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py312h1f38498_0.conda + sha256: c7cc2c75525c6522f9b948cd9ead2d5ceec55ba8b78cfd6f222fbc581219d0ff + md5: 2b3892c12915851e12955ee753eaedbb + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 26799 + timestamp: 1776928498495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py312h21b41d0_0_cpu.conda + sha256: 38049b8b098fa02446e97bedebdde2ff4cae4b579581a7125da3e751bcf5a54d + md5: 7020684cfd5c066e86cee8affad06e83 + depends: + - __osx >=11.0 + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libcxx >=21 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.23,<3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 4322018 + timestamp: 1776928464897 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py312h6831925_1.conda + sha256: cd8574cb3843e5da683df861e7f0a819f37d10ea15a0a9867ea10fbda77a86aa + md5: e0e4cac5a7ccebc36a3945cd8f39c489 + depends: + - __osx >=11.0 + - cffi >=1.4.1 + - libsodium >=1.0.21,<1.0.22.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1192691 + timestamp: 1772171510253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-2.38.3-py312ha7b44dd_0.conda + sha256: f09fe9981426eb8ba0014673abdb0ccbc6425741299c26f2e485875ec9be7dd3 + md5: 7cddb6eab7a389d4493402a6644f01ba + depends: + - python + - pytensor-base ==2.38.3 np2py312h60fbb24_0 + - clangxx + - blas * *accelerate + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 10159 + timestamp: 1777368424687 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytensor-base-2.38.3-np2py312h60fbb24_0.conda + sha256: bfed8d60f8ff104f627558158e676e35b41fd694f19d7984ac0704a52b935d1f + md5: 3d54c491648939a43a48b3df4a2568b6 + depends: + - python + - setuptools >=59.0.0 + - scipy >=1,<2 + - numpy >=2.0 + - numba >=0.58,<=0.65.1 + - filelock >=3.15 + - etuples + - logical-unification + - minikanren + - cons + - python 3.12.* *_cpython + - libcxx >=19 + - __osx >=11.0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pytensor?source=hash-mapping + size: 2779994 + timestamp: 1777368424687 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-h8561d8f_0_cpython.conda + sha256: e658e647a4a15981573d6018928dec2c448b10c77c557c29872043ff23c0eb6a + md5: 8e7608172fa4d1b90de9a745c2fd2b81 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.4,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.5,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 12127424 + timestamp: 1772730755512 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.11.0-py312hb3ab3e3_0.conda + sha256: 3e4a920f8be7ddc863e25fa430377f6fc1d1db301726a42dffc64b94d8cbe544 + md5: ce26b141512a4261080d10847bc7afe3 + depends: + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=compressed-mapping + size: 129095 + timestamp: 1778511902080 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytokens-0.4.1-py312hb3ab3e3_1.conda + sha256: 6dd98f113e5fe7e13249fd74124f0fb7e67f5d3be568c7df3527b4e850b0914c + md5: d655e82f6e1ae67f3eca46e0094f2c73 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytokens?source=hash-mapping + size: 167672 + timestamp: 1771613855566 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.10.0-cpu_generic_py312_h2470ad0_3.conda + sha256: 6da6392a6d89f043c914c658cdaf98c49e6860ab7e91a0afcb8463723bca4364 + md5: b4c7ecd785628fbd767d9cb854ec2c0c + depends: + - __osx >=11.0 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libtorch 2.10.0 cpu_generic_hf7cc835_3 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=19.1.7 + - mpmath <1.4 + - networkx + - nomkl + - numpy >=1.23,<3 + - optree >=0.13.0 + - pybind11 <3.0.2 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.10.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=hash-mapping + size: 22846148 + timestamp: 1772185000775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + sha256: 737959262d03c9c305618f2d48c7f1691fb996f14ae420bfd05932635c99f873 + md5: 95a5f0831b5e0b1075bbd80fcffc52ac + 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: 187278 + timestamp: 1770223990452 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda + noarch: python + sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 + md5: 2f6b79700452ef1e91f45a99ab8ffe5a + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 191641 + timestamp: 1771717073430 +- 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/osx-arm64/qt6-main-6.11.1-pl5321h01fc3ab_0.conda + sha256: 66905589313ff0eceacf548f48fde7eb2165d17f53d8610e7020e1804bcac3e2 + md5: c77a6f66fc72d0c85f0d55fd3630379a + depends: + - libcxx >=19 + - __osx >=11.0 + - double-conversion >=3.4.0,<3.5.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - icu >=78.3,<79.0a0 + - openssl >=3.5.6,<4.0a0 + - libpq >=18.3,<19.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libglib >=2.88.1,<3.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - pcre2 >=10.47,<10.48.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - harfbuzz >=14.2.0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - qt ==6.11.1 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 48062647 + timestamp: 1778618847691 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + sha256: 5bab972e8f2bff1b5b3574ffec8ecb89f7937578bd107584ed3fde507ff132f9 + md5: a1ff22f664b0affa3de712749ccfbf04 + depends: + - libre2-11 2025.11.05 h4c27e2a_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 27445 + timestamp: 1768190259003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py312h6ef9ec0_0.conda + sha256: ea06f6f66b1bea97244c36fd2788ccd92fd1fb06eae98e469dd95ee80831b057 + md5: a7cfbbdeb93bb9a3f249bc4c3569cd4c + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 358853 + timestamp: 1764543161524 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py312hb3ab3e3_1.conda + sha256: ee60a8409096aec04e713c7d98b744689eabb0a98a6cd7b122e896636ec28696 + md5: b3f01912f92602e178c7106d5191f06e + depends: + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml-clib?source=hash-mapping + size: 131636 + timestamp: 1766159558170 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.12-hbd3f8a3_0.conda + noarch: python + sha256: 91992a557456cbe9980e8ffb0f0d1200f65f741adeefc7ecf568d1935690a7bc + md5: 7151a0851207b88c0031f388a7825e9b + depends: + - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 8485007 + timestamp: 1778119519471 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py312he5ca3e3_1.conda + sha256: 5f640a06e001666f9d4dca7cca992f1753e722e9f6e50899d7d250c02ddf7398 + md5: ed7887c51edfa304c69a424279cec675 + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.3.0 + - threadpoolctl >=3.2.0 + - libcxx >=19 + - python 3.12.* *_cpython + - __osx >=11.0 + - llvm-openmp >=19.1.7 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9124177 + timestamp: 1766550900752 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py312h0f234b1_0.conda + sha256: 7082a8c87ae32b6090681a1376e3335cf23c95608c68a3f96f3581c847f8b840 + md5: fd035cd01bb171090a990ae4f4143090 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - 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: 13966986 + timestamp: 1771881089893 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + sha256: 704c5cae4bc839a18c70cbf3387d7789f1902828c79c6ddabcd34daf594f4103 + md5: 092c5b693dc6adf5f409d12f33295a2a + depends: + - libcxx >=19 + - __osx >=11.0 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + purls: [] + size: 542508 + timestamp: 1757842919681 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl3-3.4.8-h6fa9c73_0.conda + sha256: 0c15a7f3f46d175c70ca7b032cee3eee9ef602492688a79a6e734f2efc466dad + md5: 53311362c6da21e58442bfb959991455 + depends: + - __osx >=11.0 + - libcxx >=19 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libusb >=1.0.29,<2.0a0 + - dbus >=1.16.2,<2.0a0 + license: Zlib + purls: [] + size: 1561566 + timestamp: 1777693640800 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/shaderc-2026.2-hf31e910_0.conda + sha256: 97870b15002b9e78a169681655a148049cd1763d4062114155268e84b3ef8793 + md5: 6e50dd641e624d5921f25a82aea39ae9 + depends: + - __osx >=11.0 + - glslang >=16,<17.0a0 + - libcxx >=19 + - spirv-tools >=2026,<2027.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 112111 + timestamp: 1777361061717 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc + md5: ade77ad7513177297b1d75e351e136ce + depends: + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 114331 + timestamp: 1767045086274 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + sha256: 799d0578369e67b6d0d6ecdacada411c259629fc4a500b99703c5e85d0a68686 + md5: 68f833178f171cfffdd18854c0e9b7f9 + depends: + - __osx >=11.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + license: BSL-1.0 + purls: [] + size: 587027 + timestamp: 1756274982526 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + sha256: cb9305ede19584115f43baecdf09a3866bfcd5bcca0d9e527bd76d9a1dbe2d8d + md5: fca4a2222994acd7f691e57f94b750c5 + depends: + - libcxx >=19 + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 38883 + timestamp: 1762948066818 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/spirv-tools-2026.1-h4ddebb9_0.conda + sha256: 8c7b7b1f7a42f1a878f08e44ee94023285eb51ba8e5042f28d61dce305b10242 + md5: 2e34a5f251c18163da9bfbb4733cc1d9 + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1613001 + timestamp: 1770089883327 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + sha256: b26e0b8d945799f53a505192694599c0dd0ee422d9afa7d98c15e6144b6f99f9 + md5: f7a7a885f173730179da53e02b98ca93 + depends: + - __osx >=11.0 + - libsqlite 3.53.1 h1b79a29_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing + purls: [] + size: 181970 + timestamp: 1777987071018 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.6-py312ha11c99a_0.conda + sha256: 18f8711f235e32d793938e1738057e7be1d0bfe98f7d27e3e4b98aa757deae92 + md5: 31f49265d8de9776cd15b421f24b23e0 + 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: 11537488 + timestamp: 1764984166760 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-4.0.1-h0cb729a_0.conda + sha256: bdef3c1c4d2a396ad4f7dc64c5e9a02d4c5a21ff93ed07a33e49574de5d2d18d + md5: 8badc3bf16b62272aa2458f138223821 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1456245 + timestamp: 1769664727051 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + sha256: de6893e53664e769c1b1c4103a666d436e3d307c0eb6a09a164e749d116e80f7 + md5: 555070ad1e18b72de36e9ee7ed3236b3 + depends: + - libcxx >=19.0.0.a0 + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: NCSA + purls: [] + size: 200192 + timestamp: 1775657222120 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-2023.0.0-he0260a5_2.conda + sha256: 6f72a2984052444b9381020fa329b83dace95f335573dc21199f1b1d1a5f5473 + md5: 440c0a36cc20db1f28877a69afbb5e88 + depends: + - __osx >=11.0 + - libcxx >=19 + - libhwloc >=2.13.0,<2.13.1.0a0 + license: Apache-2.0 + purls: [] + size: 122303 + timestamp: 1778675142610 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tbb-devel-2023.0.0-h7f394f9_2.conda + sha256: 384b8f9a3fb0e49e0f083d5d760aae2e8b45eba6ff38483cc3b9e33cdd1c3837 + md5: d4e2b050226f525f0ad64705cf302bee + depends: + - __osx >=11.0 + - libcxx >=19 + - tbb 2023.0.0 he0260a5_2 + purls: [] + size: 1139235 + timestamp: 1778675210689 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorboard-data-server-0.7.0-py312h9536bd2_4.conda + sha256: a76bf47a5d9ad1134d6025c307773e20596f37b90682b14f1965c18f6b87a7da + md5: 2c911f542edf82b500cb08f6164cd3e7 + depends: + - __osx >=11.0 + - openssl >=3.5.4,<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: 3207231 + timestamp: 1764930138005 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-2.19.1-cpu_py312hc65d1cb_5.conda + sha256: 5e531150bb912ba9e8ea6cfc7c3af8e619829fc16b511cc9752e072444ac14d8 + md5: 7119cefd8ff100262aa43ca9ffa76927 + depends: + - python + - tensorflow-base ==2.19.1 cpu_py312h66a5cad_5 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 47381 + timestamp: 1778106412562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tensorflow-base-2.19.1-cpu_py312h66a5cad_5.conda + sha256: 1a5d05ac1577bc3bd435ac3f3985d43589b446be93038cf6bf7aaf294a7e6ad6 + md5: 6afaa7d100fc4b093ed9a1e1da41dc82 + depends: + - python + - packaging + - absl-py >=1.0.0 + - astunparse >=1.6.0 + - gast >=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2 + - google-pasta >=0.1.1 + - grpcio 1.78.* + - h5py >=3.11 + - ml_dtypes >=0.5.1,<1.0 + - opt_einsum >=2.3.2 + - protobuf >=5.26 + - python-flatbuffers >=24.3.25 + - requests >=2.21.0,<3 + - six >=1.12 + - termcolor >=1.1.0 + - typing_extensions >=3.6.6 + - wrapt >=1.11.0 + - tensorboard >=2.19,<2.20 + - keras >=3.5 + - libtensorflow_framework ==2.19.1 cpu_h3441331_5 + - libtensorflow_cc ==2.19.1 cpu_he004e32_5 + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tensorflow?source=hash-mapping + size: 314828014 + timestamp: 1778106412562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py312h2bbb03f_0.conda + sha256: 29edd36311b4a810a9e6208437bdbedb28c9ac15221caf812cb5c5cf48375dca + md5: 02cce5319b0f1317d9642dcb2e475379 + 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: 859155 + timestamp: 1774358568476 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda + sha256: 4d047b1d6e0f4bdd8c43e1b772665de9a10c0649a7f158df8193a3a6e7df714f + md5: e80504aa921f5ab11456f27bd9ef5d25 + depends: + - __osx >=11.0 + - cffi + - libcxx >=19 + - 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/ukkonen?source=hash-mapping + size: 14733 + timestamp: 1769439379176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + sha256: e935d0c11581e31e89ce4899a28b16f924d1a3c1af89f18f8a2c5f5728b3107f + md5: 45b836f333fd3e282c16fff7dc82994e + 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: 415828 + timestamp: 1770909782683 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-4.09-hce30654_0.conda + sha256: 598a2c7c38a8b3495efd354e5903a693059f0ee0d1b6af1a339ec09a7839737a + md5: bf5e569456f850071049b692fe7ab755 + license: BSL-1.0 + purls: [] + size: 14174 + timestamp: 1767012345273 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/viskores-1.1.1-cpu_h841489f_0.conda + sha256: c64e599fbf4381c93202561716393f748166628a1affb574c62122fa9c728d1b + md5: de0c0f0d1328a15ed1b2be2d10ebc4f2 + depends: + - llvm-openmp >=19.1.7 + - __osx >=11.0 + - libcxx >=19 + - mesalib >=26.0.3,<26.1.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - glew >=2.3.0,<2.4.0a0 + - zfp >=1.0.1,<2.0a0 + track_features: + - viskores-p-0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20406566 + timestamp: 1777494828271 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.6.1-py312hee49c5b_4.conda + sha256: fad9468b45d691f3e363d5227c997f6bd1c1f7f1a9cccd3414245c42edca633b + md5: 51b4978733a101cf4abac40f3ea180e0 + depends: + - vtk-base >=9.6.1,<9.6.2.0a0 + - vtk-io-ffmpeg >=9.6.1,<9.6.2.0a0 + - libboost-devel + - liblzma-devel + - tbb-devel + - eigen + - expat + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 27082 + timestamp: 1778024929741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-base-9.6.1-py312h12f95e6_4.conda + sha256: 7941a2cb1b422604708ae66b436027ea322b0928a8d584bbb1e85bca938e7b92 + md5: 8869ab07c3925c4d618eba20aecbc2b5 + depends: + - python + - utfcpp + - nlohmann_json + - cli11 + - numpy + - wslink + - matplotlib-base >=2.0.0 + - __osx >=11.0 + - libcxx >=18 + - pugixml >=1.15,<1.16.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libtheora >=1.1.1,<1.2.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - eigen-abi >=5.0.1.100,<5.0.1.101.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - proj >=9.8.1,<9.9.0a0 + - libexpat >=2.8.0,<3.0a0 + - tbb >=2022.3.0 + - libogg >=1.3.5,<1.4.0a0 + - libpng >=1.6.58,<1.7.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - libzlib >=1.3.2,<2.0a0 + - jsoncpp >=1.9.6,<1.9.7.0a0 + - viskores >=1.1.1,<1.2.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - libsqlite >=3.53.1,<4.0a0 + - python_abi 3.12.* *_cp312 + - qt6-main >=6.11.0,<6.12.0a0 + - liblzma >=5.8.3,<6.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libtiff >=4.7.1,<4.8.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - fmt >=12.1.0,<12.2.0a0 + constrains: + - libboost-headers >=1.90.0,<1.91.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/vtk?source=hash-mapping + size: 62250825 + timestamp: 1778024929741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/vtk-io-ffmpeg-9.6.1-py312h199f87a_4.conda + sha256: df255a7011a3c9078d0b801d3083c52b38147a49367c3b698bd02d110434054b + md5: 5ab6e27a8a0e5047bcf8a63467a846d9 + depends: + - vtk-base ==9.6.1 py312h12f95e6_4 + - ffmpeg + - python_abi 3.12.* *_cp312 + - ffmpeg >=8.1.1,<9.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 94791 + timestamp: 1778024929741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py312h2bbb03f_0.conda + sha256: 5dbc29e84b2d14bbfcaf5372571312991e749ac1dc55e822ccb15d71e752ed67 + md5: ff5ed7b9da564a701eae86999617a247 + 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: 83872 + timestamp: 1772795226695 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2 + sha256: debdf60bbcfa6a60201b12a1d53f36736821db281a28223a09e0685edcce105a + md5: b1f6dccde5d3a1f911960b6e567113ff + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 717038 + timestamp: 1660323292329 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 + sha256: 2fed6987dba7dee07bd9adc1a6f8e6c699efb851431bcb6ebad7de196e87841d + md5: b1f7f2780feffe310b068c021e8ff9b2 + depends: + - libcxx >=12.0.1 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1832744 + timestamp: 1646609481185 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + sha256: adae11db0f66f86156569415ed79cda75b2dbf4bea48d1577831db701438164f + md5: 78b548eed8227a689f93775d5d23ae09 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 14105 + timestamp: 1762976976084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda + sha256: f7fa0de519d8da589995a1fe78ef74556bb8bc4172079ae3a8d20c3c81354906 + md5: 9d1299ace1924aa8f4e0bc8e71dd0cf7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 19156 + timestamp: 1762977035194 +- 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/osx-arm64/yarl-1.23.0-py312h04c11ed_0.conda + sha256: 2379fd978cfc5598d9ef6f01946da890851f5ed22ecf8596abb328f7ddd640ba + md5: c5cce9282c0a099ba55a43a80fc67795 + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - 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/yarl?source=hash-mapping + size: 140208 + timestamp: 1772409657987 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda + sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 + md5: e85dcd3bde2b10081cdcaeae15797506 + depends: + - __osx >=11.0 + - libcxx >=19 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 245246 + timestamp: 1772476886668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda + sha256: 5b8bc86ca206f456ca9fe9e1a629f68b949ac47070211bccf4b44d29141c85d7 + md5: 581bd74656ccd460cf2bbe152292a1eb + depends: + - __osx >=11.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 204043 + timestamp: 1766549790975 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + sha256: 8dd2ac25f0ba714263aac5832d46985648f4bfb9b305b5021d702079badc08d2 + md5: f1c0bce276210bed45a04949cfe8dc20 + depends: + - __osx >=11.0 + - libzlib 1.3.2 h8088a28_2 + license: Zlib + license_family: Other + purls: [] + size: 81123 + timestamp: 1774072974535 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + sha256: a339606a6b224bb230ff3d711e801934f3b3844271df9720165e0353716580d4 + md5: d99c2a23a31b0172e90f456f580b695e + depends: + - __osx >=11.0 + - libcxx >=19 + license: Zlib + license_family: Other + purls: [] + size: 94375 + timestamp: 1770168363685 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 433413 + timestamp: 1764777166076 +- pypi: git+https://github.com/nchopin/particles#f71e94a21a11c73b58e2d694775b1b1d379b8854 + name: particles + version: '0.4' + requires_dist: + - joblib + - numba + - numpy>=1.18 + - scipy>=1.7 + - scikit-learn + - pandas ; extra == 'extra' + - statsmodels ; extra == 'extra' + - ipython ; extra == 'extra' + - seaborn ; extra == 'extra' + - matplotlib ; extra == 'extra' + - ipython ; extra == 'docs' + - sphinx==7.0.1 ; extra == 'docs' + - nbsphinx==0.9.2 ; extra == 'docs' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl + name: deprecation + version: 2.1.0 + sha256: a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a + requires_dist: + - packaging +- pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + name: loguru + version: 0.7.3 + sha256: 31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c + requires_dist: + - colorama>=0.3.4 ; sys_platform == 'win32' + - aiocontextvars>=0.2.0 ; python_full_version < '3.7' + - win32-setctime>=1.0.0 ; sys_platform == 'win32' + - pre-commit==4.0.1 ; python_full_version >= '3.9' and extra == 'dev' + - tox==3.27.1 ; python_full_version < '3.8' and extra == 'dev' + - tox==4.23.2 ; python_full_version >= '3.8' and extra == 'dev' + - pytest==6.1.2 ; python_full_version < '3.8' and extra == 'dev' + - pytest==8.3.2 ; python_full_version >= '3.8' and extra == 'dev' + - pytest-cov==2.12.1 ; python_full_version < '3.8' and extra == 'dev' + - pytest-cov==5.0.0 ; python_full_version == '3.8.*' and extra == 'dev' + - pytest-cov==6.0.0 ; python_full_version >= '3.9' and extra == 'dev' + - pytest-mypy-plugins==1.9.3 ; python_full_version >= '3.6' and python_full_version < '3.8' and extra == 'dev' + - pytest-mypy-plugins==3.1.0 ; python_full_version >= '3.8' and extra == 'dev' + - colorama==0.4.5 ; python_full_version < '3.8' and extra == 'dev' + - colorama==0.4.6 ; python_full_version >= '3.8' and extra == 'dev' + - freezegun==1.1.0 ; python_full_version < '3.8' and extra == 'dev' + - freezegun==1.5.0 ; python_full_version >= '3.8' and extra == 'dev' + - exceptiongroup==1.1.3 ; python_full_version >= '3.7' and python_full_version < '3.11' and extra == 'dev' + - mypy==0.910 ; python_full_version < '3.6' and extra == 'dev' + - mypy==0.971 ; python_full_version == '3.6.*' and extra == 'dev' + - mypy==1.4.1 ; python_full_version == '3.7.*' and extra == 'dev' + - mypy==1.13.0 ; python_full_version >= '3.8' and extra == 'dev' + - sphinx==8.1.3 ; python_full_version >= '3.11' and extra == 'dev' + - sphinx-rtd-theme==3.0.2 ; python_full_version >= '3.11' and extra == 'dev' + - myst-parser==4.0.0 ; python_full_version >= '3.11' and extra == 'dev' + - build==1.2.2 ; python_full_version >= '3.11' and extra == 'dev' + - twine==6.0.1 ; python_full_version >= '3.11' and extra == 'dev' + requires_python: '>=3.5,<4.0' +- pypi: https://files.pythonhosted.org/packages/10/9a/e3186e760c57ee5f1c27ea5cea577a0ff9abfca51eefcb4d9a4cd39aff2e/pandoc-2.4.tar.gz + name: pandoc + version: '2.4' + sha256: ecd1f8cbb7f4180c6b5db4a17a7c1a74df519995f5f186ef81ce72a9cbd0dd9a + requires_dist: + - plumbum + - ply +- pypi: https://files.pythonhosted.org/packages/39/1f/54ddd9171840bbf2437287ffab18268d7ccbca7752a7f290252ddabbcef8/numpysane-0.42.tar.gz + name: numpysane + version: '0.42' + sha256: 47f240cab2fd05a26776b91c0e07e03b1ebaf943005bcea0fc1585ded079b0bd + requires_dist: + - numpy +- pypi: https://files.pythonhosted.org/packages/44/ca/2ecd4529be078797bda8d662d1ecb67b1bb884ee7531a4b1646162d21658/jsonschema_rs-0.46.4-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + name: jsonschema-rs + version: 0.46.4 + sha256: 8a83672e74aecd2cec20758afc9374eabff259d9e094c9f18987a81c19fb01ab + requires_dist: + - fastjsonschema>=2.20.0 ; extra == 'bench' + - jsonschema>=4.23.0 ; extra == 'bench' + - pytest-benchmark>=4.0.0 ; extra == 'bench' + - flask>=2.2.5 ; extra == 'tests' + - hypothesis>=6.79.4 ; extra == 'tests' + - pytest>=7.4.4 ; extra == 'tests' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4a/49/bb935b2e68cf31e2b2face9d0841ac97447b6d0387d0c2d2255c7a2867da/scikit_activeml-1.0.0-py3-none-any.whl + name: scikit-activeml + version: 1.0.0 + sha256: 34e8d3a594cd98ed6210d0c91d651829f01119822e0337cd42302a33480ed292 + requires_dist: + - joblib>=1.4.0 + - numpy>=2.1 + - scipy>=1.14.1 + - scikit-learn>=1.6.0 + - matplotlib>=3.9.0 + - makefun>=1.15.3 + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - jupyter ; extra == 'dev' + - sphinx>=8.1,<=8.2 ; extra == 'dev' + - sphinxcontrib-bibtex~=2.6 ; extra == 'dev' + - numpydoc~=1.9 ; extra == 'dev' + - nbsphinx~=0.9 ; extra == 'dev' + - nbformat~=5.10 ; extra == 'dev' + - sphinx-gallery~=0.19 ; extra == 'dev' + - sphinx-copybutton ; extra == 'dev' + - sphinx-sitemap ; extra == 'dev' + - pybtex~=0.25 ; extra == 'dev' + - pydata-sphinx-theme~=0.16 ; extra == 'dev' + - gitpython ; extra == 'dev' + - black ; extra == 'dev' + - flake8 ; extra == 'dev' + - pre-commit ; extra == 'dev' + - joblib<=1.5.2 ; extra == 'max' + - numpy<=2.2.6 ; extra == 'max' + - scipy<=1.15.3 ; extra == 'max' + - scikit-learn<=1.8.0 ; extra == 'max' + - matplotlib<=3.10.7 ; extra == 'max' + - makefun<=1.16.0 ; extra == 'max' + - skorch>=1.2.0 ; extra == 'opt' + - skorch<=1.3.0 ; extra == 'opt-max' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/53/f6/136e03239c2205497b482b04e05c961add0638e92d26b0d13b6499fedb40/diversipy-0.9.tar.gz + name: diversipy + version: '0.9' + sha256: 165a31e946aa360d49b7dc1470524e2da9582aa774490cb934294040f7222f9c + requires_dist: + - numpy + - scipy +- pypi: https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl + name: regex + version: 2026.5.9 + sha256: f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl + name: plumbum + version: 1.10.0 + sha256: 9583d737ac901c474d99d030e4d5eec4c4e6d2d7417b1cf49728cf3be34f6dc8 + requires_dist: + - pywin32 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' + - paramiko ; extra == 'ssh' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/7c/45/7c7a8bcbfe68595c6ad82612dae409bf8c2f7dbad7cb0a30ad0637ce828f/jsonschema_rs-0.46.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: jsonschema-rs + version: 0.46.4 + sha256: 1a06146baf3d4c5f62ea9899ba5d2f87dbd1ea41b4701917b9c929f51480ae50 + requires_dist: + - fastjsonschema>=2.20.0 ; extra == 'bench' + - jsonschema>=4.23.0 ; extra == 'bench' + - pytest-benchmark>=4.0.0 ; extra == 'bench' + - flask>=2.2.5 ; extra == 'tests' + - hypothesis>=6.79.4 ; extra == 'tests' + - pytest>=7.4.4 ; extra == 'tests' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7c/e9/9876105d1c238f82b44211d73913784ce8f53e382960b0858c0e38ac2ced/gnuplotlib-0.46.tar.gz + name: gnuplotlib + version: '0.46' + sha256: e713b73a64eb1a26af45870ee2de84c217e24d5a9f47365c6116afc315da6af4 + requires_dist: + - numpy + - numpysane>=0.3 +- pypi: https://files.pythonhosted.org/packages/90/d6/42d441eeceac1d8fc7d2a7480654db661282dd1f94deef344c5421ba0c3c/rapidyaml-0.12.1-cp312-cp312-macosx_11_0_arm64.whl + name: rapidyaml + version: 0.12.1 + sha256: 6ddd43a1f6a12e706477b85cf51d881c2362d74f4c0433d6092f6b40bae20567 + requires_dist: + - deprecation + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/94/ed/5d45bbd42d5407250dd46ce1b9c098d612c3a9bb538858d09da2df77c961/pylint_exit-1.2.0-py2.py3-none-any.whl + name: pylint-exit + version: 1.2.0 + sha256: 65c9e7856e9058705a92d7c45628d604b2a4b8ee2b3c18a7303be77f9ed87cbe +- pypi: https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl + name: ply + version: '3.11' + sha256: 096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +- pypi: https://files.pythonhosted.org/packages/af/cb/87da89ae11d0de562928a7e8ca40d5daee55049408019d5d1b918af6800b/rapidyaml-0.12.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: rapidyaml + version: 0.12.1 + sha256: 489f1cba591f3e6a6325f3b08edf64abb293b5353906686ec04949ccc3a44855 + requires_dist: + - deprecation + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl + name: makefun + version: 1.16.0 + sha256: 43baa4c3e7ae2b17de9ceac20b669e9a67ceeadff31581007cca20a07bbe42c4 + requires_dist: + - funcsigs ; python_full_version < '3.3' +- pypi: https://files.pythonhosted.org/packages/c8/03/99102b3772bdc5d25fc7fe5f5fb862c54bb6e863991f50d02667999942c1/licenseheaders-0.8.8-py3-none-any.whl + name: licenseheaders + version: 0.8.8 + sha256: 3b159228b37bbba98bd01448c41a5eff773ab26ac5b14ac98c53d06dbc807696 + requires_dist: + - regex + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: regex + version: 2026.5.9 + sha256: dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f8/cb/91d8f07f08e86f03e0e9b5ba9db350d751119c9ba27eff4c418e4f27ee9c/fourcipp-1.103.0-py3-none-any.whl + name: fourcipp + version: 1.103.0 + sha256: cfadfc81ab1322336bef3d6ea4670a427b970051eb221d4735add6b20ffd6283 + requires_dist: + - jsonschema-rs + - loguru + - numpy + - rapidyaml + - regex + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pip-tools ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + requires_python: '>=3.10' diff --git a/pyproject.toml b/pyproject.toml index a45d6f3ed..737f19d31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,49 @@ build-backend = "setuptools.build_meta" [project] name = "queens" authors = [{ name = "QUEENS developers" }] -dynamic = ["version", "dependencies", "optional-dependencies"] +license = "LGPL-3.0-or-later" +license-files = ["LICENSE"] +dynamic = ["version"] description = "A general purpose framework for Uncertainty Quantification, Physics-Informed Machine Learning, Bayesian Optimization, Inverse Problems and Simulation Analytics" readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.12" +dependencies = [ + "setuptools>=81.0.0,<82", + "numba>=0.65.0", + "numpy>=2.4.3", + "pandas>=3.0.2", + "scikit-learn>=1.8.0", + "scipy>=1.17.1", + "dask>=2026.3.0", + "distributed>=2026.3.0", + "dask-jobqueue>=0.9.0", + "fabric>=3.2.3", + "xarray>=2026.4.0", + "pydoe>=0.9.9", + "salib>=1.5.2", + "vtk>=9.5.0", + "pyvista>=0.47.3", + "chaospy>=4.3.20", + "pyyaml>=6.0.3", + "jinja2>=3.1.6", + "arviz>=0.23.4,<1", + "gpflow", + "tensorflow>=2.18.0", + "tensorflow-probability>=0.25.0", + "tf-keras>=2.18.0", + "jax>=0.5.2", + "pymc>=5.28.4", + "stable-baselines3>=2.8.0", + "matplotlib>=3.10.8", + "seaborn>=0.13.2", + "plotly>=6.6.0", + "tqdm>=4.67.3", + "pathos>=0.3.5", + "gnuplotlib>=0.46", + "diversipy>=0.9", + "particles @ git+https://github.com/nchopin/particles.git", + "scikit-activeml>=1.0.0", +] keywords = [ "gaussian processes", "uncertainty quantification", @@ -22,20 +61,6 @@ keywords = [ [tool.setuptools.dynamic] version = { attr = "queens.__VERSION__" } -dependencies = { file = ["requirements.in"] } -optional-dependencies = { safe = { file = [ - "requirements.txt", -] }, develop = { file = [ - "dev-requirements.txt", # We fix the development packages, other linters might fail -] }, safe_develop = { file = [ - "requirements.txt", - "dev-requirements.txt", -] }, fourc = { file = [ - "src/queens_interfaces/fourc/fourc_requirements.txt", -] }, tutorial = { file = [ - "requirements.txt", - "tutorial-requirements.txt", -] } } # cli utils [project.scripts] @@ -58,6 +83,7 @@ Changelog = "https://github.com/queens-py/queens/blob/main/CHANGELOG.md" # Tools section [tool.black] line-length = 100 +target-version = ["py312"] [tool.isort] profile = "black" @@ -81,9 +107,12 @@ testpaths = ["tests"] pythonpath = ["test_utils"] markers = [ "benchmark: Benchmark tests, involving full QUEENS-iterator runs for performance benchmarks (excluded from the main pipeline)", + "convergence_tests: Convergence tests with higher sample counts or tighter analytical references", "integration_tests: Integration tests with Python interface", "unit_tests: Unit tests", - "tutorial_tests: Tutorial tests", + "tutorial_tests: Tutorial tests that require no specialized tutorial resources", + "tutorial_tests_fourc: Tutorial tests that require fourc", + "tutorial_tests_remote: Tutorial tests that require remote execution resources", "integration_tests_fourc: Integration tests with fourc", "lnm_cluster: Integration tests with LNM clusters (require access to LNM network)", "imcs_cluster: Integration tests with LNM clusters (require access to IMCS network)", @@ -91,9 +120,10 @@ markers = [ ] [tool.coverage.run] -source = ["queens"] +source = ["src"] parallel = true branch = true +relative_files = true [tool.coverage.report] # Regexes for lines to exclude from consideration @@ -106,61 +136,31 @@ show_missing = false [tool.coverage.html] directory = "html_coverage_report" -[tool.liccheck] -authorized_licenses = [ - "apache", - "apache 2.0", - "Apache-2.0", - "apache software license", - "apache license, version 2.0", - "apache license version 2.0", - "apache license 2.0", - "apache software", - "bsd", - "new bsd", - "bsd license", - "new bsd license", - "3-clause bsd", - "BSD 3-Clause", - "BSD-3-Clause", - "simplified bsd", - "CMU License (MIT-CMU)", - "gnu lgpl", - "GNU Library or Lesser General Public License (LGPL)", - "lgpl", - "historical permission notice and disclaimer (hpnd)", - "isc", - "isc license", - "isc license (iscl)", - "mit", - "mit license", - "mozilla public license 2.0", - "mozilla public license 2.0 (mpl 2.0)", - "python software foundation", - "python software foundation license", - "University of Illinois/NCSA Open Source", - "zlib/libpng", -] -unauthorized_licenses = [ - "gpl v3", - "gpl v2", - "gpl", - "GNU general public license (gpl)", - "IBM Public License", - "RPL", - "Reciprocal Public License", - "Sleepycat License", +[tool.pip-licenses] +from = "mixed" +ignore-packages = [ + # cons is under LGPL-3 + "cons", + # queens (this library) is under a LGPL-3-or-later + "queens", + # fourcipp is under MIT + "fourcipp", + # scikit-activeml is under BSD 3-Clause License + "scikit-activeml", + # namex is under Apache 2.0 see https://github.com/fchollet/namex?tab=License-1-ov-file + "namex", + # miniKanren is under a BSD-3-Clause (sligthly modified a,b,c instead of 1.,2.,3. see https://github.com/pythological/kanren/blob/main/LICENSE.txt + "miniKanren", + # vtk is under BSD-3-Clause see https://gitlab.kitware.com/vtk/vtk/-/blob/master/Copyright.txt?ref_type=heads + "vtk", + # torch is under BSD-3-Clause + "torch", + # PySide6 is under (LGPLv3 or GPLv2 or GPLv3) see https://code.qt.io/cgit/pyside/pyside-setup.git/tree/README.pyside6.md + "PySide6", + # shiboken6 is under (LGPLv3 or GPLv2 or GPLv3) see https://code.qt.io/cgit/pyside/pyside-setup.git/tree/README.pyside6.md + "shiboken6", ] -[tool.liccheck.authorized_packages] -# filelock has public domain license without restrictions -# see https://github.com/tox-dev/py-filelock -filelock = ">=3" -# cons is under LGPL-3 -cons = ">=0.4.5" -# namex is under Apache 2.0 see https://github.com/fchollet/namex?tab=License-1-ov-file -namex = "==0.0.8" -# setuptools is under MIT License -setuptools = ">=79.0.0" +allow-only="MIT;MIT License;MIT-CMU;BSD;BSD License;BSD-2-Clause;BSD-3-Clause;BSD 3-Clause;3-Clause BSD License;BSD-2-Clause AND Apache-2.0 WITH LLVM-exception;BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0;Apache-2.0;Apache License 2.0;Apache Software License;Apache-2.0 OR BSD-3-Clause;Apache-2.0 OR BSD-2-Clause;Apache-2.0 AND CNRI-Python;Apache-2.0 AND MIT;ISC;PSF-2.0;Python Software Foundation License;MPL-2.0;Mozilla Public License 2.0;Mozilla Public License 2.0 (MPL 2.0);MPL-2.0 AND MIT;LGPL;LGPL-2.1;LGPL-3.0;LGPL-3.0-or-later;Zlib;0BSD;CC0-1.0" [tool.mypy] check_untyped_defs = true @@ -175,9 +175,138 @@ exclude = '''(?x)( ^(.gitlab|.github|config|doc|tests|test_utils)/| ^src/(example_simulator_functions|queens_interfaces)/| ^src/queens/(data_processors|drivers|iterators|models)/| - ^src/queens/(schedulers|stochastic_optimizers|variational_distributions|visualization)/| + ^src/queens/(schedulers|stochastic_optimizers|visualization)/| ^src/queens/(main.py|global_settings.py) ).*$''' [[tool.mypy.overrides]] module = ["yaml"] follow_untyped_imports = true + +[tool.pixi.workspace] +channels = ["conda-forge", "nodefaults"] +platforms = ["linux-64", "osx-arm64"] + +[tool.pixi.feature.base.dependencies] +python = ">=3.12" +pip = ">=26.0.1" +setuptools = ">=81.0.0,<82" +numba = ">=0.65.0" +numpy = ">=2.4.3" +pandas = ">=3.0.2" +scikit-learn = ">=1.8.0" +scipy = ">=1.17.1" +dask = ">=2026.3.0" +distributed = ">=2026.3.0" +dask-jobqueue = ">=0.9.0" +fabric = ">=3.2.3" +xarray = ">=2026.4.0" +pydoe = ">=0.9.9" +salib = ">=1.5.2" +vtk = ">=9.5.0" +pyvista = ">=0.47.3" +chaospy = ">=4.3.20" +pyyaml = ">=6.0.3" +jinja2 = ">=3.1.6" +arviz = ">=0.23.4,<1" +gpflow = ">=2.9.2" +tensorflow = ">=2.18.0" +tensorflow-probability = ">=0.25.0" +tf-keras = ">=2.18.0" +jax = ">=0.5.2" +pymc = ">=5.28.4" +stable-baselines3 = ">=2.8.0" +matplotlib = ">=3.10.8" +seaborn = ">=0.13.2" +plotly = ">=6.6.0" +tqdm = ">=4.67.3" +pathos = ">=0.3.5" + +[tool.pixi.feature.base.pypi-dependencies] +gnuplotlib = ">=0.46" +diversipy = ">=0.9" +particles = { git = "https://github.com/nchopin/particles.git"} +scikit-activeml= ">=1.0.0" + +[tool.pixi.feature.base.tasks] +install-editable = "python -m pip install --no-deps --no-build-isolation -e ." + +[tool.pixi.feature.dev.dependencies] +pytest = ">=9.0.3" +py = ">=1.11.0" +pytest-codestyle = ">=2.0.1" +pytest-cov = ">=7.1.0" +pytest-mock = ">=3.15.1" +pytest-xdist = ">=3.8.0" +mock = ">=5.2.0" +black = ">=26.3.1" +pylint = ">=4.0.5" +isort = ">=8.0.1" +pre-commit = ">=4.5.1" +pre-commit-hooks = ">=5.0.0" +sphinx = ">=9.1.0" +nbsphinx = ">=0.9.8" +pydata-sphinx-theme = ">=0.17.0" +pandoc = "*" +commitizen = ">=4.13.10" +docformatter = ">=1.7.7" +yamllint = ">=1.38.0" +ruff = ">=0.15.10" +nbstripout = ">=0.9.1" +myst-parser = ">=5.0.0" +testbook = ">=0.4.2" +ipykernel = ">=7.2.0" +mypy = ">=1.20.1" +pip-licenses = ">=5.5" + +[tool.pixi.feature.dev.pypi-dependencies] +pylint-exit = ">=1.2.0" +licenseheaders = ">=0.8.8" + +[tool.pixi.feature.tutorials.dependencies] +scikit-fem = ">=12.0.1" + +[tool.pixi.feature.fourc.dependencies] +[tool.pixi.feature.fourc.pypi-dependencies] +fourcipp = ">=1.91.0" + +[tool.pixi.environments] +default = { features = ["base"], no-default-feature = true, solve-group = "default"} +all = { features = ["base","tutorials", "fourc"], no-default-feature = true, solve-group = "default"} +dev = { features = ["base", "dev", "tutorials", "fourc"], no-default-feature = true, solve-group = "default"} + +[dependency-groups] +dev = [ + "pytest>=9.0.3", + "py>=1.11.0", + "pytest-codestyle>=2.0.1", + "pytest-cov>=7.1.0", + "pytest-mock>=3.15.1", + "pytest-xdist>=3.8.0", + "mock>=5.2.0", + "black>=26.3.1", + "pylint>=4.0.5", + "isort>=8.0.1", + "pre-commit>=4.5.1", + "pre-commit-hooks>=5.0.0", + "sphinx>=9.1.0", + "nbsphinx>=0.9.8", + "pydata-sphinx-theme>=0.17.0", + "pandoc", + "commitizen>=4.13.10", + "docformatter>=1.7.7", + "yamllint>=1.38.0", + "ruff>=0.15.10", + "nbstripout>=0.9.1", + "myst-parser>=5.0.0", + "testbook>=0.4.2", + "ipykernel>=7.2.0", + "mypy>=1.20.1", + "pip-licenses>=5.5", + "pylint-exit>=1.2.0", + "licenseheaders>=0.8.8", +] + +[project.optional-dependencies] +tutorials =["scikit-fem>=12.0.1"] +fourc = ["fourcipp>=1.91.0"] +all = ["queens[fourc]", "queens[tutorials]"] diff --git a/requirements.in b/requirements.in deleted file mode 100644 index deb3ca439..000000000 --- a/requirements.in +++ /dev/null @@ -1,69 +0,0 @@ -# This file contains all the requirements for QUEENS (production runs). - -# Do not fix the version of a package if not strictly necessary. We use pip-tools in order to create a requirements.txt file where the version of the different packages are fixed to the latest stable version w.r.t. QUEENS. From time to time pip-tools is used to upgrade to the newer available versions. - -# dependencies from environment.yml (i.e., they are handled by conda) -cython==3.0.11 -numba==0.60.0 -numpy==1.26.4 -pandas==2.2.3 -scikit-learn==1.5.2 -scipy==1.14.1 - -# Dask packages -dask -distributed # dask.distributed -dask-jobqueue -bokeh>3 # for dask dashboard -fabric # for ssh connection - -# Others -xarray # Special array format -pyDOE # design of experiments -SALib # for sensitivity analysis -diversipy # sampling from space filling subsets -vtk>=9.2.0 # vtk format handler -pyvista -autograd # wrapper around numpy for automated differentiation -particles # Chopin et al. sequential Monte-Carlo, filtering/smoothing package -chaospy # polynomial chaos -pyyaml # to load yaml files -jinja2 - -# Machine learning libraries -arviz # Bayesian visualization -gpflow # LV and variational GPs -optax # google jax based optimizer -tensorflow -tensorflow-probability -jax -scikit-activeml>=0.4.1 -pymc -stable-baselines3 - -# making fancy plots -matplotlib -seaborn -plotly - -# testing framework -pytest -py -pytest-codestyle -pytest-cov -pytest-mock -pytest-xdist -mock -py - -# Terminal utils -tqdm # a smart progress meter for loops -gnuplotlib # for gnuplot based terminal ascii plots -tomli # TOML parser - -# Other Python stuff -pathos # multiprocessing with more complex python objects -black>=24.4.2 # formatter for code created by QUEENS's create_script_from_input_file() method - -# needed for dev-requirements, check if still needed -importlib-metadata<7 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 05a75c0b3..000000000 --- a/requirements.txt +++ /dev/null @@ -1,570 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --output-file=requirements.txt requirements.in -# -absl-py==2.1.0 - # via - # chex - # keras - # optax - # tensorboard - # tensorflow - # tensorflow-probability -arviz==0.20.0 - # via - # -r requirements.in - # pymc -astunparse==1.6.3 - # via tensorflow -autograd==1.7.0 - # via -r requirements.in -bcrypt==4.2.0 - # via paramiko -black==24.10.0 - # via -r requirements.in -bokeh==3.6.1 - # via -r requirements.in -cachetools==5.5.0 - # via pymc -certifi==2024.8.30 - # via requests -cffi==1.17.1 - # via - # cryptography - # pynacl -chaospy==4.3.17 - # via -r requirements.in -charset-normalizer==3.4.0 - # via requests -check-shapes==1.1.1 - # via gpflow -chex==0.1.87 - # via optax -click==8.1.7 - # via - # black - # dask - # distributed -cloudpickle==3.1.0 - # via - # dask - # distributed - # gymnasium - # pymc - # stable-baselines3 - # tensorflow-probability -cons==0.4.6 - # via - # etuples - # minikanren - # pytensor -contourpy==1.3.0 - # via - # bokeh - # matplotlib -coverage[toml]==7.6.4 - # via pytest-cov -cryptography==43.0.3 - # via paramiko -cycler==0.12.1 - # via matplotlib -cython==3.0.11 - # via -r requirements.in -dask==2024.10.0 - # via - # -r requirements.in - # dask-jobqueue - # distributed -dask-jobqueue==0.9.0 - # via -r requirements.in -decorator==5.1.1 - # via - # fabric - # tensorflow-probability -deprecated==1.2.14 - # via - # fabric - # gpflow -dill==0.3.9 - # via - # multiprocess - # pathos -distributed==2024.10.0 - # via - # -r requirements.in - # dask-jobqueue -diversipy==0.9 - # via -r requirements.in -dm-tree==0.1.8 - # via tensorflow-probability -dropstackframe==0.1.1 - # via check-shapes -etils[epy]==1.10.0 - # via optax -etuples==0.3.9 - # via - # minikanren - # pytensor -execnet==2.1.1 - # via pytest-xdist -fabric==3.2.2 - # via -r requirements.in -farama-notifications==0.0.4 - # via gymnasium -filelock==3.16.1 - # via - # pytensor - # torch - # triton -flatbuffers==24.3.25 - # via tensorflow -fonttools==4.54.1 - # via matplotlib -fsspec==2024.10.0 - # via - # dask - # torch -gast==0.6.0 - # via - # tensorflow - # tensorflow-probability -gnuplotlib==0.42 - # via -r requirements.in -google-pasta==0.2.0 - # via tensorflow -gpflow==2.9.2 - # via -r requirements.in -grpcio==1.67.1 - # via - # tensorboard - # tensorflow -gymnasium==1.0.0 - # via stable-baselines3 -h5netcdf==1.4.0 - # via arviz -h5py==3.12.1 - # via - # h5netcdf - # keras - # tensorflow -idna==3.10 - # via requests -importlib-metadata==6.11.0 - # via - # -r requirements.in - # chaospy - # dask - # numpoly -iniconfig==2.0.0 - # via pytest -invoke==2.2.0 - # via fabric -iteration-utilities==0.13.0 - # via scikit-activeml -jax==0.4.35 - # via - # -r requirements.in - # chex - # optax -jaxlib==0.4.35 - # via - # chex - # jax - # optax -jinja2==3.1.4 - # via - # -r requirements.in - # bokeh - # distributed - # torch -joblib==1.4.2 - # via - # particles - # scikit-activeml - # scikit-learn -keras==3.6.0 - # via tensorflow -kiwisolver==1.4.7 - # via matplotlib -lark==1.2.2 - # via check-shapes -libclang==18.1.1 - # via tensorflow -llvmlite==0.43.0 - # via numba -locket==1.0.0 - # via - # distributed - # partd -logical-unification==0.4.6 - # via - # cons - # minikanren - # pytensor -makefun==1.15.6 - # via scikit-activeml -markdown==3.7 - # via tensorboard -markdown-it-py==3.0.0 - # via rich -markupsafe==3.0.2 - # via - # jinja2 - # werkzeug -matplotlib==3.9.2 - # via - # -r requirements.in - # arviz - # pyvista - # salib - # scikit-activeml - # seaborn - # stable-baselines3 - # vtk -mdurl==0.1.2 - # via markdown-it-py -minikanren==1.0.3 - # via pytensor -ml-dtypes==0.4.1 - # via - # jax - # jaxlib - # keras - # tensorflow -mock==5.1.0 - # via -r requirements.in -mpmath==1.3.0 - # via sympy -msgpack==1.1.0 - # via distributed -multipledispatch==1.0.0 - # via - # etuples - # gpflow - # logical-unification - # minikanren -multiprocess==0.70.17 - # via - # pathos - # salib -mypy-extensions==1.0.0 - # via black -namex==0.0.8 - # via keras -networkx==3.4.2 - # via torch -numba==0.60.0 - # via - # -r requirements.in - # particles -numpoly==1.2.14 - # via chaospy -numpy==1.26.4 - # via - # -r requirements.in - # arviz - # autograd - # bokeh - # chaospy - # chex - # contourpy - # diversipy - # gnuplotlib - # gpflow - # gymnasium - # h5py - # jax - # jaxlib - # keras - # matplotlib - # ml-dtypes - # numba - # numpoly - # numpysane - # optax - # pandas - # particles - # pydoe - # pymc - # pytensor - # pyvista - # salib - # scikit-activeml - # scikit-learn - # scipy - # seaborn - # stable-baselines3 - # tensorboard - # tensorflow - # tensorflow-probability - # xarray - # xarray-einstats -numpysane==0.40 - # via gnuplotlib -opt-einsum==3.4.0 - # via - # jax - # tensorflow -optax==0.2.3 - # via -r requirements.in -optree==0.13.0 - # via keras -packaging==24.1 - # via - # arviz - # black - # bokeh - # dask - # distributed - # gpflow - # h5netcdf - # keras - # matplotlib - # plotly - # pooch - # pytest - # tensorboard - # tensorflow - # xarray -pandas==2.2.3 - # via - # -r requirements.in - # arviz - # bokeh - # pymc - # salib - # seaborn - # stable-baselines3 - # xarray -paramiko==3.5.0 - # via fabric -partd==1.4.2 - # via dask -particles==0.4 - # via -r requirements.in -pathos==0.3.3 - # via -r requirements.in -pathspec==0.12.1 - # via black -pillow==11.0.0 - # via - # bokeh - # matplotlib - # pyvista -platformdirs==4.3.6 - # via - # black - # pooch -plotly==5.24.1 - # via -r requirements.in -pluggy==1.5.0 - # via pytest -pooch==1.8.2 - # via pyvista -pox==0.3.5 - # via pathos -ppft==1.7.6.9 - # via pathos -protobuf==5.28.3 - # via - # tensorboard - # tensorflow -psutil==6.1.0 - # via distributed -py==1.11.0 - # via -r requirements.in -pycodestyle==2.12.1 - # via pytest-codestyle -pycparser==2.22 - # via cffi -pydoe==0.3.8 - # via -r requirements.in -pygments==2.18.0 - # via rich -pymc==5.17.0 - # via -r requirements.in -pynacl==1.5.0 - # via paramiko -pyparsing==3.2.0 - # via matplotlib -pytensor==2.25.5 - # via pymc -pytest==8.3.3 - # via - # -r requirements.in - # pytest-codestyle - # pytest-cov - # pytest-mock - # pytest-xdist -pytest-codestyle==2.0.1 - # via -r requirements.in -pytest-cov==5.0.0 - # via -r requirements.in -pytest-mock==3.14.0 - # via -r requirements.in -pytest-xdist==3.6.1 - # via -r requirements.in -python-dateutil==2.9.0.post0 - # via - # matplotlib - # pandas -pytz==2024.2 - # via pandas -pyvista==0.44.1 - # via -r requirements.in -pyyaml==6.0.2 - # via - # -r requirements.in - # bokeh - # dask - # distributed -requests==2.32.3 - # via - # pooch - # tensorflow -rich==13.9.3 - # via - # keras - # pymc -salib==1.5.1 - # via -r requirements.in -scikit-activeml==0.5.2 - # via -r requirements.in -scikit-learn==1.5.2 - # via - # -r requirements.in - # particles - # scikit-activeml -scipy==1.14.1 - # via - # -r requirements.in - # arviz - # chaospy - # diversipy - # gpflow - # jax - # jaxlib - # particles - # pydoe - # pymc - # pytensor - # salib - # scikit-activeml - # scikit-learn - # xarray-einstats -scooby==0.10.0 - # via pyvista -seaborn==0.13.2 - # via -r requirements.in -six==1.16.0 - # via - # astunparse - # google-pasta - # python-dateutil - # tensorboard - # tensorflow - # tensorflow-probability -sortedcontainers==2.4.0 - # via distributed -stable-baselines3==2.4.1 - # via -r requirements.in -sympy==1.13.1 - # via torch -tabulate==0.9.0 - # via gpflow -tblib==3.0.0 - # via distributed -tenacity==9.0.0 - # via plotly -tensorboard==2.18.0 - # via tensorflow -tensorboard-data-server==0.7.2 - # via tensorboard -tensorflow==2.18.0 - # via - # -r requirements.in - # gpflow - # tensorflow-probability - # tf-keras -tensorflow-io-gcs-filesystem==0.37.1 - # via tensorflow -tensorflow-probability[tf]==0.24.0 - # via - # -r requirements.in - # gpflow -termcolor==2.5.0 - # via tensorflow -tf-keras==2.18.0 - # via tensorflow-probability -threadpoolctl==3.5.0 - # via - # pymc - # scikit-learn -tomli==2.0.2 - # via -r requirements.in -toolz==1.0.0 - # via - # chex - # dask - # distributed - # logical-unification - # minikanren - # partd -torch==2.5.1 - # via stable-baselines3 -tornado==6.4.1 - # via - # bokeh - # distributed -tqdm==4.66.6 - # via -r requirements.in -triton==3.1.0 - # via torch -typing-extensions==4.12.2 - # via - # arviz - # chex - # etils - # gpflow - # gymnasium - # optree - # pymc - # pyvista - # tensorflow - # torch -tzdata==2024.2 - # via pandas -urllib3==2.2.3 - # via - # distributed - # requests -vtk==9.3.1 - # via - # -r requirements.in - # pyvista -werkzeug==3.0.6 - # via tensorboard -wheel==0.44.0 - # via astunparse -wrapt==1.16.0 - # via - # deprecated - # tensorflow -xarray==2024.10.0 - # via - # -r requirements.in - # arviz - # xarray-einstats -xarray-einstats==0.8.0 - # via arviz -xyzservices==2024.9.0 - # via bokeh -zict==3.0.0 - # via distributed -zipp==3.20.2 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/src/queens/data_processors/__init__.py b/src/queens/data_processors/__init__.py index d971049e7..3513492c1 100644 --- a/src/queens/data_processors/__init__.py +++ b/src/queens/data_processors/__init__.py @@ -16,6 +16,7 @@ Modules for extracting and processing data from simulation output files. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/data_processors/csv_file.py b/src/queens/data_processors/csv_file.py index 1dba3ca4b..85f1ce888 100644 --- a/src/queens/data_processors/csv_file.py +++ b/src/queens/data_processors/csv_file.py @@ -352,11 +352,18 @@ def _filter_by_target_values(self, raw_data): Returns: DataFrame: Filtered data. """ - if any(raw_data): - target_indices = [] - for target_value in self.filter_target_values: - target_indices.append( - int(np.where(np.abs(raw_data.index - target_value) <= self.filter_tol)[0]) + if not raw_data.empty: + target_indices = raw_data.index.get_indexer( + self.filter_target_values, + method="nearest", + tolerance=self.filter_tol, + ) + + if (target_indices == -1).any(): + missing_targets = np.asarray(self.filter_target_values)[target_indices == -1] + raise RuntimeError( + f"No index values found within tolerance {self.filter_tol} " + f"for target values {missing_targets.tolist()}." ) return raw_data.iloc[target_indices] @@ -371,13 +378,21 @@ def _filter_by_range(self, raw_data): Returns: DataFrame: Filtered data. """ - if any(raw_data): - range_start = int( - np.where(np.abs(raw_data.index - self.filter_range[0]) <= self.filter_tol)[0] - ) - range_end = int( - np.where(np.abs(raw_data.index - self.filter_range[-1]) <= self.filter_tol)[-1] + if not raw_data.empty: + range_start, range_end = raw_data.index.get_indexer( + self.filter_range, + method="nearest", + tolerance=self.filter_tol, ) + if -1 in (range_start, range_end): + missing_targets = np.asarray(self.filter_range)[ + np.asarray([range_start, range_end]) == -1 + ] + raise RuntimeError( + f"No index values found within tolerance {self.filter_tol} " + f"for range values {missing_targets.tolist()}." + ) + return raw_data.iloc[range_start : range_end + 1] return None diff --git a/src/queens/distributions/__init__.py b/src/queens/distributions/__init__.py index 24075fdab..e9c758172 100644 --- a/src/queens/distributions/__init__.py +++ b/src/queens/distributions/__init__.py @@ -16,6 +16,7 @@ Modules for probability distributions. """ + from __future__ import annotations from typing import TYPE_CHECKING @@ -34,6 +35,7 @@ from queens.distributions.multinomial import Multinomial from queens.distributions.normal import Normal from queens.distributions.particle import Particle + from queens.distributions.truncated_normal import TruncatedNormal from queens.distributions.uniform import Uniform from queens.distributions.uniform_discrete import UniformDiscrete @@ -41,5 +43,5 @@ class_module_map = extract_type_checking_imports(__file__) -def __getattr__(name: str) -> Distribution: +def __getattr__(name: str) -> type[Distribution]: return import_class_from_class_module_map(name, class_module_map, __name__) diff --git a/src/queens/distributions/lognormal.py b/src/queens/distributions/lognormal.py index 6bd6b1b58..ab757377d 100644 --- a/src/queens/distributions/lognormal.py +++ b/src/queens/distributions/lognormal.py @@ -65,7 +65,14 @@ def cdf(self, x: np.ndarray) -> np.ndarray: Returns: CDF at positions """ - return self.normal_distribution.cdf(np.log(x)) + x = np.asarray(x, dtype=float).reshape(-1, self.dimension) + cdf = np.zeros(x.shape[0]) + positive_support = np.all(x > 0, axis=1) + + if np.any(positive_support): + cdf[positive_support] = self.normal_distribution.cdf(np.log(x[positive_support])) + + return cdf def draw(self, num_draws: int = 1) -> np.ndarray: """Draw samples. diff --git a/src/queens/distributions/truncated_normal.py b/src/queens/distributions/truncated_normal.py new file mode 100644 index 000000000..36e07259c --- /dev/null +++ b/src/queens/distributions/truncated_normal.py @@ -0,0 +1,164 @@ +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2024-2025, QUEENS contributors. +# +# This file is part of QUEENS. +# +# QUEENS is free software: you can redistribute it and/or modify it under the terms of the GNU +# Lesser General Public License as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. QUEENS is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You +# should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, +# see . +# +"""Truncated normal distribution.""" + +import numpy as np +import scipy.stats +from numpy.typing import ArrayLike + +from queens.distributions._distribution import Continuous +from queens.utils.logger_settings import log_init_args + + +class TruncatedNormal(Continuous): + """Truncated normal distribution. + + A one-dimensional normal distribution restricted to the finite interval + [lower_bound, upper_bound]. The distribution is parametrized by the + mean and std of the underlying (unbounded) normal distribution. + + Internally, scipy.stats.truncnorm is used with standardized bounds + a = (lower_bound - unbounded_mean) / unbounded_std and + b = (upper_bound - unbounded_mean) / unbounded_std. + + Attributes: + unbounded_mean: Mean of the underlying (unbounded) normal distribution. + unbounded_std: Standard deviation of the underlying (unbounded) normal distribution. + lower_bound: Lower bound of the distribution. + upper_bound: Upper bound of the distribution. + scipy_truncnorm: Scipy truncated normal distribution object. + mean: (inherited) Mean of the truncated distribution, computed via scipy. + covariance: (inherited) Variance of the truncated distribution, computed via scipy. + dimension: (inherited) Dimensionality of the distribution (always 1). + """ + + @log_init_args + def __init__( + self, + unbounded_mean: ArrayLike, + unbounded_std: ArrayLike, + lower_bound: ArrayLike, + upper_bound: ArrayLike, + ) -> None: + """Initialize truncated normal distribution. + + Args: + unbounded_mean: Mean of the underlying (unbounded) normal distribution. + unbounded_std: Standard deviation of the underlying (unbounded) normal distribution. + Must be positive. + lower_bound: Lower bound of the distribution. Must be smaller than upper_bound. + upper_bound: Upper bound of the distribution. + """ + unbounded_mean = np.array(unbounded_mean).reshape(-1) + unbounded_std = np.array(unbounded_std).reshape(-1) + lower_bound = np.array(lower_bound).reshape(-1) + upper_bound = np.array(upper_bound).reshape(-1) + + if max(unbounded_mean.size, unbounded_std.size, lower_bound.size, upper_bound.size) != 1: + raise NotImplementedError( + "Only one-dimensional truncated normal distributions are supported." + ) + + super().check_positivity(unbounded_std=unbounded_std) + super().check_bounds(lower_bound, upper_bound) + + a = (lower_bound - unbounded_mean) / unbounded_std + b = (upper_bound - unbounded_mean) / unbounded_std + scipy_truncnorm = scipy.stats.truncnorm(a, b, loc=unbounded_mean, scale=unbounded_std) + + self.unbounded_mean = unbounded_mean + self.unbounded_std = unbounded_std + self.lower_bound = lower_bound + self.upper_bound = upper_bound + self.scipy_truncnorm = scipy_truncnorm + + super().__init__( + mean=scipy_truncnorm.mean(), + covariance=scipy_truncnorm.var(), + dimension=1, + ) + + def cdf(self, x: np.ndarray) -> np.ndarray: + """Cumulative distribution function. + + Args: + x: Positions at which the CDF is evaluated + + Returns: + CDF at positions + """ + cdf = self.scipy_truncnorm.cdf(x).reshape(-1) + return cdf + + def draw(self, num_draws: int = 1) -> np.ndarray: + """Draw samples. + + Args: + num_draws: Number of draws + + Returns: + Drawn samples from the distribution + """ + samples = self.scipy_truncnorm.rvs(size=num_draws).reshape(-1, 1) + return samples + + def logpdf(self, x: np.ndarray) -> np.ndarray: + """Log of the probability density function. + + Args: + x: Positions at which the log-PDF is evaluated + + Returns: + Log-PDF at positions + """ + logpdf = self.scipy_truncnorm.logpdf(x).reshape(-1) + return logpdf + + def grad_logpdf(self, x: np.ndarray) -> np.ndarray: + """Gradient of the log-PDF with respect to x. + + Args: + x: Positions at which the gradient of the log-PDF is evaluated + + Returns: + Gradient of the log-PDF at positions + """ + x = np.asarray(x).reshape(-1) + grad_logpdf = (self.unbounded_mean - x) / self.unbounded_std**2 + return grad_logpdf + + def pdf(self, x: np.ndarray) -> np.ndarray: + """Probability density function. + + Args: + x: Positions at which the PDF is evaluated + + Returns: + PDF at positions + """ + pdf = self.scipy_truncnorm.pdf(x).reshape(-1) + return pdf + + def ppf(self, quantiles: np.ndarray) -> np.ndarray: + """Percent point function (inverse of CDF — quantiles). + + Args: + quantiles: Quantiles at which the PPF is evaluated + + Returns: + Positions which correspond to given quantiles + """ + ppf = self.scipy_truncnorm.ppf(quantiles).reshape(-1) + return ppf diff --git a/src/queens/drivers/__init__.py b/src/queens/drivers/__init__.py index e92ffe561..30f56ef91 100644 --- a/src/queens/drivers/__init__.py +++ b/src/queens/drivers/__init__.py @@ -17,6 +17,7 @@ Modules for calling external simulation software. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/drivers/jobscript.py b/src/queens/drivers/jobscript.py index 7989fef9c..32ac3b9a8 100644 --- a/src/queens/drivers/jobscript.py +++ b/src/queens/drivers/jobscript.py @@ -14,7 +14,6 @@ # """Driver to run a jobscript.""" - import logging from collections.abc import Callable from dataclasses import dataclass @@ -106,17 +105,18 @@ def __init__( Args: parameters (Parameters): Parameters object. - input_templates (str, Path, dict): Path(s) to simulation input template. - jobscript_template (str, Path): Path to jobscript template or read-in jobscript - template. - executable (str, Path): Path to main executable of respective software. + input_templates (str, Path, dict): (Local) path(s) to simulation input template. + jobscript_template (str, Path): (Local) path to jobscript template or read-in jobscript + template. + executable (str, Path): Path to main executable of respective software. Is a remote + path when using the Cluster scheduler. files_to_copy (list, opt): Files or directories to copy to experiment_dir. data_processor (obj, opt): Instance of data processor class. gradient_data_processor (obj, opt): Instance of data processor class for gradient data. jobscript_file_name (str, opt): Jobscript file name (default: 'jobscript.sh'). extra_options (dict, opt): Extra options to inject into jobscript template. raise_error_on_jobscript_failure (bool, opt): Whether to raise an error for a non-zero - jobscript exit code. + jobscript exit code. """ super().__init__(parameters=parameters, files_to_copy=files_to_copy) self.input_templates = self.create_input_templates_dict(input_templates) @@ -247,7 +247,7 @@ def run( with metadata.time_code("run_jobscript"): execute_cmd = f"bash {jobscript_file} >{log_file} 2>&1" - self._run_executable(job_id, execute_cmd) + self._run_executable(job_id, execute_cmd, log_file) with metadata.time_code("data_processing"): results = self._get_results(output_dir) @@ -287,18 +287,21 @@ def _manage_paths( return job_dir, output_dir, output_file, input_files, log_file - def _run_executable(self, job_id, execute_cmd): + def _run_executable(self, job_id, execute_cmd, log_file): """Run executable. Args: job_id (int): Job ID. execute_cmd (str): Executed command. + log_file (Path): Path to redirected jobscript output. """ process_returncode, _, stdout, stderr = run_subprocess( execute_cmd, raise_error_on_subprocess_failure=False, ) if self.raise_error_on_jobscript_failure and process_returncode: + if log_file.is_file(): + stdout += f"\n\nContents of {log_file}:\n{read_file(log_file)}" raise SubprocessError.construct_error_from_command( command=execute_cmd, command_output=stdout, diff --git a/src/queens/iterators/__init__.py b/src/queens/iterators/__init__.py index c85c89ada..b2e4ee25a 100644 --- a/src/queens/iterators/__init__.py +++ b/src/queens/iterators/__init__.py @@ -17,6 +17,7 @@ Modules for parameter studies, uncertainty quantification, sensitivity analysis, Bayesian inverse analysis, and optimization. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/iterators/latin_hypercube_sampling.py b/src/queens/iterators/latin_hypercube_sampling.py index c83226faa..a88a0ef96 100644 --- a/src/queens/iterators/latin_hypercube_sampling.py +++ b/src/queens/iterators/latin_hypercube_sampling.py @@ -17,7 +17,7 @@ import logging import numpy as np -from pyDOE import lhs +from pydoe import lhs from queens.iterators._iterator import Iterator from queens.utils.logger_settings import log_init_args @@ -81,7 +81,8 @@ def __init__( def pre_run(self): """Generate samples for subsequent LHS analysis.""" - np.random.seed(self.seed) + seed_sequence = np.random.SeedSequence(self.seed) + lhs_rng = np.random.default_rng(seed_sequence.spawn(1)[0]) num_inputs = self.parameters.num_parameters @@ -92,7 +93,11 @@ def pre_run(self): # create latin hyper cube samples in unit hyper cube hypercube_samples = lhs( - num_inputs, self.num_samples, criterion=self.criterion, iterations=self.num_iterations + num_inputs, + self.num_samples, + criterion=self.criterion, + iterations=self.num_iterations, + seed=lhs_rng, ) # scale and transform samples according to the inverse cdf self.samples = self.parameters.inverse_cdf_transform(hypercube_samples) diff --git a/src/queens/iterators/metropolis_hastings_pymc.py b/src/queens/iterators/metropolis_hastings_pymc.py index 4fc6fd6a4..714b5333c 100644 --- a/src/queens/iterators/metropolis_hastings_pymc.py +++ b/src/queens/iterators/metropolis_hastings_pymc.py @@ -200,7 +200,7 @@ def post_run(self): """Additional post run for MH.""" super().post_run() _logger.info( - "Acceptance rate is: %f", + "Acceptance rate is: %s", self.step.accepted_sum / self.num_samples, ) diff --git a/src/queens/iterators/optimization.py b/src/queens/iterators/optimization.py index 564a0a46c..e92ebc3b2 100644 --- a/src/queens/iterators/optimization.py +++ b/src/queens/iterators/optimization.py @@ -316,7 +316,7 @@ def core_run(self): start = time.time() # minimization with bounds using Jacobian - if self.algorithm in {"L-BFGS-B", "TNC"}: + if self.algorithm == "L-BFGS-B": self.solution = minimize( self.objective, self.initial_guess, @@ -325,6 +325,15 @@ def core_run(self): bounds=self.bounds, options={"maxiter": int(1e4), "disp": self.verbose_output}, ) + elif self.algorithm == "TNC": + self.solution = minimize( + self.objective, + self.initial_guess, + method=self.algorithm, + jac=self.jacobian, + bounds=self.bounds, + options={"maxfun": int(1e4), "disp": self.verbose_output}, + ) # Constrained Optimization BY Linear Approximation: # minimization with constraints without Jacobian elif self.algorithm in {"COBYLA"}: diff --git a/src/queens/iterators/polynomial_chaos.py b/src/queens/iterators/polynomial_chaos.py index 0be330b1a..684662dab 100644 --- a/src/queens/iterators/polynomial_chaos.py +++ b/src/queens/iterators/polynomial_chaos.py @@ -18,6 +18,10 @@ """ import logging +import re +import sys +import warnings +from importlib import metadata import chaospy as cp import numpy as np @@ -33,6 +37,71 @@ from queens.utils.valid_options import get_option _logger = logging.getLogger(__name__) +_NUMPOLY_RESHAPE_FIX_VERSION = "1.3.9" + + +def _version_parts(version): + """Return numeric release parts from a version string.""" + release_parts = [] + for part in version.split("+", maxsplit=1)[0].split("."): + match = re.match(r"\d+", part) + if match is None: + break + release_parts.append(int(match.group())) + return tuple(release_parts) + + +def _version_less_than(version, minimum_version): + """Compare simple numeric version strings.""" + version_parts = _version_parts(version) + minimum_parts = _version_parts(minimum_version) + length = max(len(version_parts), len(minimum_parts)) + version_parts += (0,) * (length - len(version_parts)) + minimum_parts += (0,) * (length - len(minimum_parts)) + return version_parts < minimum_parts + + +def _installed_version(package_name): + """Return installed package version or *None* if it is unavailable.""" + try: + return metadata.version(package_name) + except metadata.PackageNotFoundError: + return None + + +def _numpy_rejects_newshape_keyword(): + """Does the installed NumPy reject the reshape keyword.""" + try: + np.reshape(np.array([0]), newshape=-1) # pylint: disable=no-value-for-parameter + except TypeError as exc: + return "newshape" in str(exc) + return False + + +def has_macos_numpoly_reshape_mismatch(): + """Does the installed macOS dependencies trigger reshape mismatch.""" + numpoly_version = _installed_version("numpoly") + return ( + sys.platform == "darwin" + and _numpy_rejects_newshape_keyword() + and numpoly_version is not None + and _version_less_than(numpoly_version, _NUMPOLY_RESHAPE_FIX_VERSION) + ) + + +def _warn_if_macos_numpoly_reshape_mismatch(): + """Warn about a known macOS NumPy/numpoly compatibility mismatch.""" + if has_macos_numpoly_reshape_mismatch(): + warnings.warn( + "PolynomialChaos may fail on macOS with this NumPy/numpoly dependency " + f"combination: NumPy {np.__version__} rejects " + "numpy.reshape(..., newshape=...), while installed numpoly " + f"{_installed_version('numpoly')} is older than {_NUMPOLY_RESHAPE_FIX_VERSION}. " + "This is a downstream compatibility issue; use Linux or a dependency set " + "with the upstream numpoly fix until it is released.", + RuntimeWarning, + stacklevel=3, + ) class PolynomialChaos(Iterator): @@ -81,6 +150,7 @@ def __init__( seed (int, opt): Seed for random number generation """ super().__init__(model, parameters, global_settings) + _warn_if_macos_numpoly_reshape_mismatch() if not isinstance(num_collocation_points, int) or num_collocation_points < 1: raise ValueError("Number of samples for the polynomial must be a positive integer!") diff --git a/src/queens/iterators/sobol_index_gp_uncertainty_utils/estimator.py b/src/queens/iterators/sobol_index_gp_uncertainty_utils/estimator.py index fbc9032e3..5caca9f4e 100644 --- a/src/queens/iterators/sobol_index_gp_uncertainty_utils/estimator.py +++ b/src/queens/iterators/sobol_index_gp_uncertainty_utils/estimator.py @@ -240,7 +240,7 @@ def _init_dataset( number_parameters, ) ) - data[:, :, :, :] = np.NaN + data[:, :, :, :] = np.nan estimates_second_order = xr.DataArray( data=data, dims=("gp_realization", "bootstrap", "parameter", "crossparameter"), diff --git a/src/queens/models/__init__.py b/src/queens/models/__init__.py index a0fa15b5f..759bfd3af 100644 --- a/src/queens/models/__init__.py +++ b/src/queens/models/__init__.py @@ -17,6 +17,7 @@ Modules for multi-query mapping of inputs to outputs, such as parameter samples to model evaluations. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/models/bmfmc.py b/src/queens/models/bmfmc.py index 9df16b20b..17d030bce 100644 --- a/src/queens/models/bmfmc.py +++ b/src/queens/models/bmfmc.py @@ -194,7 +194,7 @@ def __init__( X_cols (list, optional): For `man_features`, list of columns from the X-matrix to be used as informative features. num_features (int, optional): For `opt_features`, number of features to be used. - hf_model (model, optional): High-fidelity model used to run simulations and generate + hf_model (Model, optional): High-fidelity model used to run simulations and generate training data. path_to_lf_mc_data (str or list of str, optional): Path(s) to low-fidelity MC data files. diff --git a/src/queens/models/surrogates/gaussian_neural_network.py b/src/queens/models/surrogates/gaussian_neural_network.py index cb1782567..1421ed83c 100644 --- a/src/queens/models/surrogates/gaussian_neural_network.py +++ b/src/queens/models/surrogates/gaussian_neural_network.py @@ -20,6 +20,8 @@ import tensorflow as tf import tensorflow_probability as tfp import tf_keras as keras +from numpy.random import SeedSequence +from tf_keras.initializers import Initializer from queens.models.surrogates._surrogate import Surrogate from queens.utils.configure_tensorflow import configure_keras, configure_tensorflow @@ -44,8 +46,7 @@ class GaussianNeuralNetwork(Surrogate): Attributes: nn_model (tf.model): Tensorflow based Bayesian neural network model num_epochs (int): Number of training epochs for variational optimization - optimizer_seed (int): Random seed used for initialization of stochastic gradient decent - optimizer + seed (int): Seed for pseudo-random number generation verbosity_on (bool): Boolean for model verbosity during training. True=verbose batch_size (int): Size of data-batch (smaller than the training data size) scaler_x (obj): Scaler for inputs @@ -76,7 +77,7 @@ def __init__( num_epochs=None, batch_size=None, adams_training_rate=None, - optimizer_seed=None, + seed=None, verbosity_on=None, nodes_per_hidden_layer_lst=None, activation_per_hidden_layer_lst=None, @@ -93,7 +94,7 @@ def __init__( num_epochs (int): Number of epochs used for variational training of the BNN batch_size (int): Size of data-batch (smaller than the training data size) adams_training_rate (float): Training rate for the ADAMS gradient decent optimizer - optimizer_seed (int): Random seed for stochastic optimization routine + seed (int): Seed for pseudo-random number generation verbosity_on (bool): Boolean for model verbosity during training. True=verbose nodes_per_hidden_layer_lst (lst): List containing number of nodes per hidden layer of the Neural Network. The length of the list @@ -130,7 +131,8 @@ def __init__( self.nn_model = None self.num_epochs = num_epochs - self.optimizer_seed = optimizer_seed + self.seed = seed + self._seed_sequence = SeedSequence(seed) self.verbosity_on = verbosity_on self.batch_size = batch_size self.scaler_x = get_option(VALID_SCALER, data_scaling)() @@ -165,7 +167,10 @@ def _build_model(self): keras.layers.Dense( int(num_nodes), activation=activation, - kernel_initializer=self.kernel_initializer, + kernel_initializer=self._create_seeded_initializer( + self.kernel_initializer, + self._spawn_child_seed_sequence(), + ), ) for num_nodes, activation in zip( self.nodes_per_hidden_layer, self.activation_per_hidden_layer @@ -177,6 +182,10 @@ def _build_model(self): keras.layers.Dense( 2 * output_dim, activation="linear", + kernel_initializer=self._create_seeded_initializer( + "glorot_uniform", + self._spawn_child_seed_sequence(), + ), ), tfp.layers.DistributionLambda( lambda d: tfd.Normal( @@ -198,6 +207,30 @@ def _build_model(self): return model + def _spawn_child_seed_sequence(self): + """Spawn a child sequence from the optimizer seed sequence.""" + return self._seed_sequence.spawn(1)[0] + + def _create_seeded_initializer(self, initializer: Initializer, seed_sequence: SeedSequence): + """Create a Keras initializer with an explicit child seed.""" + if initializer is None: + initializer = "glorot_uniform" + initializer = keras.initializers.get(initializer) + if not hasattr(initializer, "get_config"): + return initializer + + config = initializer.get_config() + if "seed" in config and config["seed"] is None: + config["seed"] = self._keras_seed_from_seed_sequence(seed_sequence) + initializer = initializer.__class__.from_config(config) + return initializer + + @staticmethod + def _keras_seed_from_seed_sequence(seed_sequence: SeedSequence) -> int: + """Create a Keras-compatible integer seed.""" + seed = int(seed_sequence.generate_state(1, dtype=np.uint32)[0] % np.iinfo(np.int32).max) + return seed or 1 + @staticmethod def negative_log_likelihood(y, random_variable_y): """Negative log-likelihood of (tensorflow) random variable. @@ -258,7 +291,8 @@ def train(self): self.num_refinements += 1 # set the random seeds for optimization/training - keras.utils.set_random_seed(self.optimizer_seed) + training_seed_sequence = self._spawn_child_seed_sequence() + keras.utils.set_random_seed(self._keras_seed_from_seed_sequence(training_seed_sequence)) history = self.nn_model.fit( self.x_train, self.y_train, diff --git a/src/queens/models/surrogates/utils/kernel_jitted.py b/src/queens/models/surrogates/utils/kernel_jitted.py index 666fa4dbb..ce2247fc6 100644 --- a/src/queens/models/surrogates/utils/kernel_jitted.py +++ b/src/queens/models/surrogates/utils/kernel_jitted.py @@ -19,7 +19,6 @@ import numpy as np from numba import jit, njit, prange from numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning -from numpy.linalg.linalg import cholesky warnings.simplefilter("ignore", category=NumbaDeprecationWarning) warnings.simplefilter("ignore", category=NumbaPendingDeprecationWarning) @@ -74,7 +73,7 @@ def squared_exponential(x_train_mat, hyper_param_lst): partial_sigma_0_sq[i, j] = np.exp(-(delta**2) / (2.0 * l_scale_sq)) # calculate first the cholesky decomposition - cholesky_k_mat = cholesky(k_mat) + cholesky_k_mat = np.linalg.cholesky(k_mat) partial_sigma_n = np.eye(k_mat.shape[0]) @@ -374,7 +373,7 @@ def matern_3_2(x_train_mat, hyper_param_lst): ) # calculate first the cholesky decomposition - cholesky_k_mat = cholesky(k_mat) + cholesky_k_mat = np.linalg.cholesky(k_mat) partial_sigma_n = np.eye(k_mat.shape[0]) diff --git a/src/queens/parameters/random_fields/__init__.py b/src/queens/parameters/random_fields/__init__.py index db2576c62..62af70f77 100644 --- a/src/queens/parameters/random_fields/__init__.py +++ b/src/queens/parameters/random_fields/__init__.py @@ -33,5 +33,5 @@ class_module_map = extract_type_checking_imports(__file__) -def __getattr__(name: str) -> RandomField: +def __getattr__(name: str) -> type[RandomField]: return import_class_from_class_module_map(name, class_module_map, __name__) diff --git a/src/queens/parameters/random_fields/karhunen_loeve.py b/src/queens/parameters/random_fields/karhunen_loeve.py index 790eb19d0..68181ccd7 100644 --- a/src/queens/parameters/random_fields/karhunen_loeve.py +++ b/src/queens/parameters/random_fields/karhunen_loeve.py @@ -197,7 +197,7 @@ def eigendecomp_cov_matrix(self, latent_dimension: int | None = None) -> int: dimension = latent_dimension else: eigenvalues_normed = eigenvalues / np.sum(eigenvalues) - dimension = (np.cumsum(eigenvalues_normed) < self.explained_variance).argmin() + 1 + dimension = int((np.cumsum(eigenvalues_normed) < self.explained_variance).argmin()) + 1 if dimension == 1 and eigenvalues_normed[0] <= self.explained_variance: raise ValueError("Expansion failed.") diff --git a/src/queens/schedulers/__init__.py b/src/queens/schedulers/__init__.py index 1bbcf70b7..a3c18becf 100644 --- a/src/queens/schedulers/__init__.py +++ b/src/queens/schedulers/__init__.py @@ -16,6 +16,7 @@ Modules for scheduling and submitting computational jobs. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/schedulers/cluster.py b/src/queens/schedulers/cluster.py index b00cadb6a..157e357ae 100644 --- a/src/queens/schedulers/cluster.py +++ b/src/queens/schedulers/cluster.py @@ -63,8 +63,8 @@ def timedelta_to_str(timedelta_obj): """ # Time in seconds time_in_seconds = int(timedelta_obj.total_seconds()) - (minutes, seconds) = divmod(time_in_seconds, 60) - (hours, minutes) = divmod(minutes, 60) + minutes, seconds = divmod(time_in_seconds, 60) + hours, minutes = divmod(minutes, 60) return f"{hours:02}:{minutes:02}:{seconds:02}" diff --git a/src/queens/stochastic_optimizers/__init__.py b/src/queens/stochastic_optimizers/__init__.py index 33b1c7e9a..61d5d1b9f 100644 --- a/src/queens/stochastic_optimizers/__init__.py +++ b/src/queens/stochastic_optimizers/__init__.py @@ -16,6 +16,7 @@ Modules containing stochastic optimizers. """ + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map diff --git a/src/queens/utils/config_directories.py b/src/queens/utils/config_directories.py index a12ae2dc5..874385591 100644 --- a/src/queens/utils/config_directories.py +++ b/src/queens/utils/config_directories.py @@ -67,7 +67,8 @@ def experiment_directory( if experiment_base_directory is None: experiment_base_directory = base_directory() else: - experiment_base_directory = Path(experiment_base_directory) + # Replace ~ with home directory if necessary + experiment_base_directory = Path(experiment_base_directory).expanduser() experiment_dir = experiment_base_directory / experiment_name return experiment_dir, experiment_dir.exists() diff --git a/src/queens/utils/iterative_averaging.py b/src/queens/utils/iterative_averaging.py index 5c271e1d1..86c989d43 100644 --- a/src/queens/utils/iterative_averaging.py +++ b/src/queens/utils/iterative_averaging.py @@ -273,11 +273,11 @@ def l1_norm(vector: NumericalValue, averaged: bool = False) -> float | np.floati Returns: L1 norm of the vector """ - vector = np.array(vector).flatten() - vector = np.nan_to_num(vector) - norm = np.sum(np.abs(vector)) + vector_array = np.array(vector).flatten() + vector_array = np.nan_to_num(vector_array) + norm = np.sum(np.abs(vector_array)) if averaged: - norm /= len(vector) + norm /= vector_array.size return norm @@ -291,11 +291,11 @@ def l2_norm(vector: NumericalValue, averaged: bool = False) -> float | np.floati Returns: L2 norm of the vector """ - vector = np.array(vector).flatten() - vector = np.nan_to_num(vector) - norm = np.sum(vector**2) ** 0.5 + vector_array = np.array(vector).flatten() + vector_array = np.nan_to_num(vector_array) + norm = np.sum(vector_array**2) ** 0.5 if averaged: - norm /= len(vector) ** 0.5 + norm /= vector_array.size**0.5 return norm diff --git a/src/queens/utils/path.py b/src/queens/utils/path.py index 6b5cfa9f1..316269629 100644 --- a/src/queens/utils/path.py +++ b/src/queens/utils/path.py @@ -17,7 +17,12 @@ from pathlib import Path from typing import Sequence -PATH_TO_QUEENS_SOURCE = Path(__file__).parents[1] +import queens + +PATH_TO_QUEENS_SOURCE = Path(queens.__file__).parent + +# this path to root is used during runtime and thus needs to be shipped with a build even though it +# is not useful in that scenario. PATH_TO_ROOT = Path(__file__).parents[3] @@ -36,23 +41,6 @@ def relative_path_from_queens_source(relative_path: str) -> Path: return full_path -def relative_path_from_root(relative_path: str) -> Path: - """Create relative path from root directory. - - As an example to create: *src/queens/folder/file.A* . - - Call *relative_path_from_root("src/queens/folder/file.A")* . - - Args: - relative_path: Path starting from the root directory - - Returns: - Absolute path to the file - """ - full_path = PATH_TO_ROOT / relative_path - return full_path - - def create_folder_if_not_existent(path: Path | str) -> Path: """Create folder if not existent. diff --git a/src/queens/utils/remote_build.py b/src/queens/utils/remote_build.py index 526e9a2b6..bd36ad0cf 100644 --- a/src/queens/utils/remote_build.py +++ b/src/queens/utils/remote_build.py @@ -20,20 +20,12 @@ from queens.utils.remote_operations import RemoteConnection -DEFAULT_PACKAGE_MANAGER = "mamba" -FALLBACK_PACKAGE_MANAGER = "conda" -SUPPORTED_PACKAGE_MANAGERS = [DEFAULT_PACKAGE_MANAGER, FALLBACK_PACKAGE_MANAGER] - - if __name__ == "__main__": parser = argparse.ArgumentParser(description="Build queens environment on remote machine.") parser.add_argument( "--host", type=str, required=True, help="hostname or ip address of remote host" ) parser.add_argument("--user", type=str, default=None, required=False, help="remote username") - parser.add_argument( - "--remote-python", type=str, required=True, help="path to python environment on remote host" - ) parser.add_argument( "--remote-queens-repository", type=str, @@ -51,11 +43,10 @@ ), ) parser.add_argument( - "--package-manager", + "--pixi-environment", type=str, - default=DEFAULT_PACKAGE_MANAGER, - choices=SUPPORTED_PACKAGE_MANAGERS, - help="package manager used for the creation of the remote environment", + default="all", + help="pixi workspace environment to install on the remote host", ) args = parser.parse_args(sys.argv[1:]) @@ -63,10 +54,10 @@ remote_connection = RemoteConnection( host=args.host, user=args.user, - remote_python=args.remote_python, + remote_python="", remote_queens_repository=args.remote_queens_repository, gateway=args.gateway if args.gateway is None else json.loads(args.gateway), ) remote_connection.open() remote_connection.sync_remote_repository() - remote_connection.build_remote_environment(package_manager=args.package_manager) + remote_connection.build_remote_environment(pixi_environment=args.pixi_environment) diff --git a/src/queens/utils/remote_operations.py b/src/queens/utils/remote_operations.py index 5ccf3f8cf..e253c0b79 100644 --- a/src/queens/utils/remote_operations.py +++ b/src/queens/utils/remote_operations.py @@ -35,10 +35,6 @@ _logger = logging.getLogger(__name__) -DEFAULT_PACKAGE_MANAGER = "mamba" -FALLBACK_PACKAGE_MANAGER = "conda" -SUPPORTED_PACKAGE_MANAGERS = [DEFAULT_PACKAGE_MANAGER, FALLBACK_PACKAGE_MANAGER] - class RemoteConnection(Connection): """This is class wrapper around the Connection class of fabric. @@ -334,59 +330,41 @@ def copy_from_remote( def build_remote_environment( self, - package_manager: str = DEFAULT_PACKAGE_MANAGER, + pixi_environment: str = "all", ) -> None: - """Build remote QUEENS environment. + """Build the remote QUEENS pixi environment. Args: - package_manager: Package manager used for the creation of the environment ("mamba" or - "conda") + pixi_environment: Pixi workspace environment to install on the remote host """ - if package_manager not in SUPPORTED_PACKAGE_MANAGERS: - raise ValueError( - f"The package manager '{package_manager}' is not supported.\n" - f"Supported package managers are: {SUPPORTED_PACKAGE_MANAGERS}" - ) remote_connect = f"{self.user}@{self.host}" - - # check if requested package_manager is installed on remote machine: - def package_manager_exists_remote(package_manager_name: str) -> bool: - """Check if requested package manager exists on remote. - - Args: - package_manager_name: name of package manager - """ - result_which = self.run(f"which {package_manager_name}") - if result_which.stderr: - message = ( - f"Could not find requested package manager '{package_manager_name}' " - f"on '{remote_connect}'." - ) - if package_manager_name == DEFAULT_PACKAGE_MANAGER: - _logger.warning(message) - _logger.warning( - "Trying to fall back to the '%s' package manager.", FALLBACK_PACKAGE_MANAGER - ) - package_manager_exists_remote(package_manager_name=FALLBACK_PACKAGE_MANAGER) - else: - raise RuntimeError(message) - return False - return True - - if not package_manager_exists_remote(package_manager_name=package_manager): - package_manager = FALLBACK_PACKAGE_MANAGER + _logger.info("Check availability of pixi on %s...", remote_connect) + result_which = self.run( + "bash -lc 'export PATH=\"$HOME/.pixi/bin:$PATH\"; command -v pixi'", + warn=True, + echo=True, + in_stream=False, + ) + if result_which.exited: + _logger.warning( + "\nCould not find 'pixi' on '%s'. " + "The remote environment was not built automatically.\n" + "Either install pixi and retry or install the Python environment manually on " + "the remote host. See the README.md for environment setup details.\n", + remote_connect, + ) + return _logger.info("Build remote QUEENS environment...") start_time = time.time() - environment_name = Path(self.remote_python).parents[1].name command_string = ( - f"cd {self.remote_queens_repository}; " - f"{package_manager} remove --name {environment_name} --all -y;" - f"{package_manager} env create -f environment.yml --name {environment_name}; " - f"{package_manager} activate {environment_name};" - f"pip install -e ." + 'bash -lc \'export PATH="$HOME/.pixi/bin:$PATH";' + f" cd {self.remote_queens_repository}; " + f"rm -rf .pixi/envs/{pixi_environment}; " + f"pixi install --locked --environment {pixi_environment}; " + f"pixi run --locked --environment {pixi_environment} install-editable;'" ) - result = self.run(command_string, in_stream=False) + result = self.run(command_string, echo=True, in_stream=False) _logger.debug(result.stdout) _logger.info("Build of remote queens environment was successful.") diff --git a/src/queens/variational_distributions/__init__.py b/src/queens/variational_distributions/__init__.py index 233d836a6..5836bf603 100644 --- a/src/queens/variational_distributions/__init__.py +++ b/src/queens/variational_distributions/__init__.py @@ -16,11 +16,15 @@ Modules containing probability distributions for variational inference. """ + +from __future__ import annotations + from typing import TYPE_CHECKING from queens.utils.imports import extract_type_checking_imports, import_class_from_class_module_map if TYPE_CHECKING: + from queens.variational_distributions._variational_distribution import Variational from queens.variational_distributions.full_rank_normal import FullRankNormal from queens.variational_distributions.joint import Joint from queens.variational_distributions.mean_field_normal import MeanFieldNormal @@ -30,5 +34,5 @@ class_module_map = extract_type_checking_imports(__file__) -def __getattr__(name): +def __getattr__(name: str) -> type[Variational]: return import_class_from_class_module_map(name, class_module_map, __name__) diff --git a/src/queens/variational_distributions/_variational_distribution.py b/src/queens/variational_distributions/_variational_distribution.py index f5b5f1edd..b428d0ac0 100644 --- a/src/queens/variational_distributions/_variational_distribution.py +++ b/src/queens/variational_distributions/_variational_distribution.py @@ -15,95 +15,170 @@ """Variational Distribution.""" import abc +from typing import Any, Literal, TypeAlias, TypeVar + +import numpy as np + +# pylint: disable=invalid-name + +NDims = TypeVar("NDims", bound=int) +NSamples = TypeVar("NSamples", bound=int) +NParams = TypeVar("NParams", bound=int) +NParamsComponent = TypeVar("NParamsComponent", bound=int) +V = TypeVar("V", bound="Variational") + +# Vectors +ArrayNDims: TypeAlias = np.ndarray[tuple[NDims], np.dtype[np.floating]] +ArrayNParams: TypeAlias = np.ndarray[tuple[NParams], np.dtype[np.floating]] +ArrayNParamsComponent: TypeAlias = np.ndarray[tuple[NParamsComponent], np.dtype[np.floating]] +ArrayNSamples: TypeAlias = np.ndarray[tuple[NSamples], np.dtype[np.floating]] + +# Matrices +Array1XNParams: TypeAlias = np.ndarray[tuple[Literal[1], NParams], np.dtype[np.floating]] +ArrayNDimsX1: TypeAlias = np.ndarray[tuple[NDims, Literal[1]], np.dtype[np.floating]] +ArrayNDimsXNDims: TypeAlias = np.ndarray[tuple[NDims, NDims], np.dtype[np.floating]] +ArrayNParamsXNParams: TypeAlias = np.ndarray[tuple[NParams, NParams], np.dtype[np.floating]] +ArrayNParamsXNSamples: TypeAlias = np.ndarray[tuple[NParams, NSamples], np.dtype[np.floating]] +ArrayNSamplesXNDims: TypeAlias = np.ndarray[tuple[NSamples, NDims], np.dtype[np.floating]] +ArrayNSamplesXNParams: TypeAlias = np.ndarray[tuple[NSamples, NParams], np.dtype[np.floating]] class Variational: """Base class for probability distributions for variational inference. Attributes: - dimension (int): dimension of the distribution + dimension: Dimension of the distribution + n_parameters: Number of variational parameters """ - def __init__(self, dimension): - """Initialize variational distribution.""" + def __init__(self, dimension: NDims, n_parameters: NParams) -> None: + """Initialize variational distribution. + + Args: + dimension: Dimension of the variational distribution + n_parameters: Number of variational parameters + """ self.dimension = dimension + self.n_parameters = n_parameters @abc.abstractmethod - def reconstruct_distribution_parameters(self, variational_parameters): + def construct_variational_parameters(self, *args: Any) -> ArrayNParams: + """Construct variational parameters from distribution parameters. + + Args: + args: Distribution parameters + + Returns: + Variational parameters + """ + + @abc.abstractmethod + def reconstruct_distribution_parameters(self, variational_parameters: ArrayNParams) -> Any: """Reconstruct distribution parameters from variational parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters + + Returns: + Distribution parameters """ @abc.abstractmethod - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draws* samples from distribution. Args: - variational_parameters (np.ndarray): variational parameters (1 x n_params) - n_draws (int): Number of samples + variational_parameters: Variational parameters + n_draws: Number of samples + + Returns: + Drawn samples """ @abc.abstractmethod - def logpdf(self, variational_parameters, x): - """Evaluate the natural logarithm of the logpdf at sample. + def logpdf( + self, + variational_parameters: ArrayNParams, + x: ArrayNSamplesXNDims, + ) -> ArrayNSamples: + """Evaluate the natural logarithm of the PDF. Args: - variational_parameters (np.ndarray): variational parameters (1 x n_params) - x (np.ndarray): Locations to evaluate (n_samples x n_dim) + variational_parameters: Variational parameters + x: Locations to evaluate + + Returns: + Log-PDF values """ @abc.abstractmethod - def pdf(self, variational_parameters, x): - """Evaluate the probability density function (pdf) at sample. + def pdf( + self, + variational_parameters: ArrayNParams, + x: ArrayNSamplesXNDims, + ) -> ArrayNSamples: + """Evaluate the probability density function (PDF). Args: - variational_parameters (np.ndarray): variational parameters (1 x n_params) - x (np.ndarray): Locations to evaluate (n_samples x n_dim) + variational_parameters: Variational parameters + x: Locations to evaluate + + Returns: + PDF values """ @abc.abstractmethod - def grad_params_logpdf(self, variational_parameters, x): - """Logpdf gradient w.r.t. the variational parameters. + def grad_params_logpdf( + self, + variational_parameters: ArrayNParams, + x: ArrayNSamplesXNDims, + ) -> ArrayNParamsXNSamples: + """Log-PDF gradient w.r.t. the variational parameters. Evaluated at samples *x*. Also known as the score function. Args: - variational_parameters (np.ndarray): variational parameters (1 x n_params) - x (np.ndarray): Locations to evaluate (n_samples x n_dim) + variational_parameters: Variational parameters + x: Locations to evaluate + + Returns: + Gradient of the log-PDF w.r.t. the variational parameters """ @abc.abstractmethod - def fisher_information_matrix(self, variational_parameters): - """Compute the fisher information matrix. + def fisher_information_matrix( + self, variational_parameters: ArrayNParams + ) -> ArrayNParamsXNParams: + """Compute the Fisher information matrix. Depends on the variational distribution for the given parameterization. Args: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + variational_parameters: Variational parameters + + Returns: + Fisher information matrix """ @abc.abstractmethod - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: """Initialize variational parameters. Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected. Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ @abc.abstractmethod - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ diff --git a/src/queens/variational_distributions/full_rank_normal.py b/src/queens/variational_distributions/full_rank_normal.py index e0006df10..5f3505103 100644 --- a/src/queens/variational_distributions/full_rank_normal.py +++ b/src/queens/variational_distributions/full_rank_normal.py @@ -14,12 +14,28 @@ # """Full-Rank Normal Variational Distribution.""" +from typing import cast + import numpy as np import scipy from numba import njit from queens.utils.logger_settings import log_init_args -from queens.variational_distributions._variational_distribution import Variational +from queens.variational_distributions._variational_distribution import ( + Array1XNParams, + ArrayNDims, + ArrayNDimsX1, + ArrayNDimsXNDims, + ArrayNParams, + ArrayNParamsXNParams, + ArrayNParamsXNSamples, + ArrayNSamples, + ArrayNSamplesXNDims, + ArrayNSamplesXNParams, + NDims, + NSamples, + Variational, +) class FullRankNormal(Variational): @@ -37,20 +53,20 @@ class FullRankNormal(Variational): The Journal of Machine Learning Research 18.1 (2017): 430-474. Attributes: - n_parameters (int): Number of parameters used in the parameterization. + n_parameters: Number of parameters used in the parameterization. """ @log_init_args - def __init__(self, dimension): + def __init__(self, dimension: NDims) -> None: """Initialize variational distribution. Args: - dimension (int): dimension of the RV + dimension: Dimension of the RV """ - super().__init__(dimension) - self.n_parameters = (dimension * (dimension + 1)) // 2 + dimension + n_parameters = (dimension * (dimension + 1)) // 2 + dimension + super().__init__(dimension, n_parameters) - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: r"""Initialize variational parameters. Default initialization: @@ -60,11 +76,10 @@ def initialize_variational_parameters(self, random=False): :math:`\mu=Uniform(-0.1,0.1)` :math:`L=diag(Uniform(0.9,1.1))` where :math:`\Sigma=LL^T` Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected. Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ if random: cholesky_covariance = np.eye(self.dimension) + 0.1 * ( @@ -84,16 +99,17 @@ def initialize_variational_parameters(self, random=False): return variational_parameters - @staticmethod - def construct_variational_parameters(mean, covariance): + def construct_variational_parameters( # pylint: disable=arguments-differ + self, mean: ArrayNDimsX1 | ArrayNDims, covariance: ArrayNDimsXNDims + ) -> ArrayNParams: """Construct the variational parameters from mean and covariance. Args: - mean (np.ndarray): Mean values of the distribution (n_dim x 1) - covariance (np.ndarray): Covariance matrix of the distribution (n_dim x n_dim) + mean: Mean values of the distribution + covariance: Covariance matrix of the distribution Returns: - variational_parameters (np.ndarray): Variational parameters + Variational parameters """ if len(mean) == len(covariance): cholesky_covariance = np.linalg.cholesky(covariance) @@ -109,16 +125,33 @@ def construct_variational_parameters(mean, covariance): ) return variational_parameters - def reconstruct_distribution_parameters(self, variational_parameters, return_cholesky=False): + def reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> tuple[ArrayNDimsX1, ArrayNDimsXNDims]: + """Reconstruct mean value and covariance. + + Args: + variational_parameters: Variational parameters + Returns: + Mean value of the distribution + Covariance of the distribution + """ + mean, cov, _ = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters + ) + return mean, cov + + def reconstruct_distribution_parameters_with_cholesky( + self, variational_parameters: ArrayNParams + ) -> tuple[ArrayNDimsX1, ArrayNDimsXNDims, ArrayNDimsXNDims]: """Reconstruct mean value, covariance and its Cholesky decomposition. Args: - variational_parameters (np.ndarray): Variational parameters - return_cholesky (bool, optional): Return the L if desired + variational_parameters: Variational parameters Returns: - mean (np.ndarray): Mean value of the distribution (n_dim x 1) - cov (np.ndarray): Covariance of the distribution (n_dim x n_dim) - L (np.ndarray): Cholesky decomposition of the covariance matrix (n_dim x n_dim) + Mean value of the distribution + Covariance of the distribution + Cholesky decomposition of the covariance matrix """ mean = variational_parameters[: self.dimension].reshape(-1, 1) cholesky_covariance_array = variational_parameters[self.dimension :] @@ -127,54 +160,50 @@ def reconstruct_distribution_parameters(self, variational_parameters, return_cho cholesky_covariance[idx] = cholesky_covariance_array cov = np.matmul(cholesky_covariance, cholesky_covariance.T) - if return_cholesky: - return mean, cov, cholesky_covariance + return cast(ArrayNDimsX1, mean), cov, cholesky_covariance - return mean, cov - - def _grad_reconstruct_distribution_parameters(self): + def _grad_reconstruct_distribution_parameters(self) -> Array1XNParams: """Gradient of the parameter reconstruction. Returns: - grad_reconstruct_params (np.ndarray): Gradient vector of the reconstruction - w.r.t. the variational parameters + Gradient vector of the reconstruction w.r.t. the variational parameters """ grad_reconstruct_params = np.ones((1, self.n_parameters)) - return grad_reconstruct_params + return cast(Array1XNParams, grad_reconstruct_params) - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draw* samples from the variational distribution. Args: - variational_parameters (np.ndarray): Variational parameters - n_draws (int): Number of samples to draw + variational_parameters: Variational parameters + n_draws: Number of samples to draw Returns: - samples (np.ndarray): Row-wise samples of the variational distribution + Samples """ - mean, _, cholesky = self.reconstruct_distribution_parameters( - variational_parameters, return_cholesky=True + mean, _, cholesky = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters ) sample = np.dot(cholesky, np.random.randn(self.dimension, n_draws)).T + mean.reshape(1, -1) return sample - def logpdf(self, variational_parameters, x): - """Logpdf evaluated using the at samples *x*. + def logpdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Log-PDF evaluated at the samples *x*. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - logpdf (np.ndarray): Row vector of the logpdfs + Log-PDF values """ - mean, cov, cholesky = self.reconstruct_distribution_parameters( - variational_parameters, return_cholesky=True + mean, cov, cholesky = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters ) x = np.atleast_2d(x) u = np.linalg.solve(cov, (x.T - mean)) - def col_dot_prod(x, y): + def col_dot_prod(x: np.ndarray, y: np.ndarray) -> np.ndarray: return np.sum(x * y, axis=0) logpdf = ( @@ -184,35 +213,37 @@ def col_dot_prod(x, y): ) return logpdf.flatten() - def pdf(self, variational_parameters, x): - """Pdf of evaluated at given samples *x*. + def pdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """PDF of evaluated at given samples *x*. - First computes the logpdf, which is numerically more stable for exponential distributions. + First computes the log-PDF, which is numerically more stable for exponential distributions. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - pdf (np.ndarray): Row vector of the pdfs + Row vector of the PDF values """ pdf = np.exp(self.logpdf(variational_parameters, x)) return pdf - def grad_params_logpdf(self, variational_parameters, x): - """Logpdf gradient w.r.t. to the variational parameters. + def grad_params_logpdf( + self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims + ) -> ArrayNParamsXNSamples: + """Log-PDF gradient w.r.t. to the variational parameters. Evaluated at samples *x*. Also known as the score function. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - score (np.ndarray): Column-wise scores + Column-wise scores """ - mean, cov, cholesky = self.reconstruct_distribution_parameters( - variational_parameters, return_cholesky=True + mean, cov, cholesky = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters ) x = np.atleast_2d(x) # Helper variable @@ -236,17 +267,21 @@ def grad_params_logpdf(self, variational_parameters, x): score = np.vstack((dlogpdf_dmu, dlogpdf_dsigma)) return score - def total_grad_params_logpdf(self, variational_parameters, standard_normal_sample_batch): - """Total logpdf reparameterization gradient. + def total_grad_params_logpdf( + self, + variational_parameters: ArrayNParams, + standard_normal_sample_batch: ArrayNSamplesXNDims, + ) -> ArrayNSamplesXNParams: + """Total log-PDF reparameterization gradient. - Total logpdf reparameterization gradient w.r.t. the variational parameters. + Total log-PDF reparameterization gradient w.r.t. the variational parameters. Args: - variational_parameters (np.ndarray): Variational parameters - standard_normal_sample_batch (np.ndarray): Standard normal distributed sample batch + variational_parameters: Variational parameters + standard_normal_sample_batch: Standard normal distributed sample batch Returns: - total_grad (np.ndarray): Total Logpdf reparameterization gradient + Total log-PDF reparameterization gradient """ idx = np.tril_indices(self.dimension, k=0, m=self.dimension) cholesky_diagonal_idx = np.where(np.equal(*idx))[0] + self.dimension @@ -254,22 +289,20 @@ def total_grad_params_logpdf(self, variational_parameters, standard_normal_sampl total_grad[:, cholesky_diagonal_idx] = -1 / variational_parameters[cholesky_diagonal_idx] return total_grad - def grad_sample_logpdf(self, variational_parameters, sample_batch): - """Computes the gradient of the logpdf w.r.t. to the *x*. + def grad_sample_logpdf( + self, variational_parameters: ArrayNParams, sample_batch: ArrayNSamplesXNDims + ) -> ArrayNSamplesXNDims: + """Computes the gradient of the log-PDF w.r.t. to the sample *x*. Args: - variational_parameters (np.ndarray): Variational parameters - sample_batch (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + sample_batch: Row-wise samples Returns: - gradients_batch (np.ndarray): Gradients of the log-pdf w.r.t. the - sample *x*. The first dimension of the - array corresponds to the different samples. - The second dimension to different dimensions - within one sample. (Third dimension is empty - and just added to keep slices two-dimensional.) + Gradients of the log-pdf w.r.t. the sample *x*. The first dimension of the array + corresponds to the different samples. The second dimension to different dimensions + within one sample. """ - # pylint: disable-next=unbalanced-tuple-unpacking mean, cov = self.reconstruct_distribution_parameters(variational_parameters) gradient_lst = [] for sample in sample_batch: @@ -280,20 +313,22 @@ def grad_sample_logpdf(self, variational_parameters, sample_batch): gradients_batch = np.array(gradient_lst) return gradients_batch.reshape(sample_batch.shape) - def fisher_information_matrix(self, variational_parameters): + def fisher_information_matrix( + self, variational_parameters: ArrayNParams + ) -> ArrayNParamsXNParams: """Compute the Fisher information matrix analytically. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - FIM (np.ndarray): Matrix (num parameters x num parameters) + Fisher information matrix """ - _, cov, cholesky = self.reconstruct_distribution_parameters( - variational_parameters, return_cholesky=True + _, cov, cholesky = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters ) - def fim_blocks(dimension): + def fim_blocks(dimension: int) -> tuple[np.ndarray, np.ndarray]: """Compute the blocks of the FIM.""" mu_block = np.linalg.inv(cov + 1e-8 * np.eye(len(cov))) n_params_chol = (dimension * (dimension + 1)) // 2 @@ -324,16 +359,14 @@ def fim_blocks(dimension): return scipy.linalg.block_diag(mu_block, sigma_block) - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters - + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ - # pylint: disable-next=unbalanced-tuple-unpacking mean, cov = self.reconstruct_distribution_parameters(variational_parameters) export_dict = { "type": "fullrank_Normal", @@ -343,38 +376,42 @@ def export_dict(self, variational_parameters): } return export_dict - def conduct_reparameterization(self, variational_parameters, n_samples): + def conduct_reparameterization( + self, variational_parameters: ArrayNParams, n_samples: NSamples + ) -> tuple[ArrayNSamplesXNDims, ArrayNSamplesXNDims]: """Conduct a reparameterization. Args: - variational_parameters (np.ndarray): Array with variational parameters - n_samples (int): Number of samples for current batch + variational_parameters: Array with variational parameters + n_samples: Number of samples for current batch Returns: - samples_mat (np.ndarray): Array of actual samples from the variational - distribution + Actual samples from the variational distribution + Standard normal distributed samples used for the reparameterization """ standard_normal_sample_batch = np.random.normal(0, 1, size=(n_samples, self.dimension)) - mean, _, cholesky = self.reconstruct_distribution_parameters( - variational_parameters, return_cholesky=True + mean, _, cholesky = self.reconstruct_distribution_parameters_with_cholesky( + variational_parameters ) samples_mat = mean + np.dot(cholesky, standard_normal_sample_batch.T) return samples_mat.T, standard_normal_sample_batch def grad_params_reparameterization( - self, variational_parameters, standard_normal_sample_batch, upstream_gradient - ): + self, + variational_parameters: ArrayNParams, + standard_normal_sample_batch: ArrayNSamplesXNDims, + upstream_gradient: ArrayNSamplesXNDims, + ) -> ArrayNSamplesXNParams: r"""Calculate the gradient of the reparameterization. Args: - variational_parameters (np.ndarray): Variational parameters - standard_normal_sample_batch (np.ndarray): Standard normal distributed sample batch - upstream_gradient (np.array): Upstream gradient + variational_parameters: Variational parameters + standard_normal_sample_batch: Standard normal distributed sample batch + upstream_gradient: Upstream gradient Returns: - gradient (np.ndarray): Gradient of the upstream function w.r.t. the variational - parameters. + Gradient of the upstream function w.r.t. the variational parameters. **Note:** We assume that *grad_reconstruct_params* is a row-vector containing the partial diff --git a/src/queens/variational_distributions/joint.py b/src/queens/variational_distributions/joint.py index 7ec2caa51..c8a92306d 100644 --- a/src/queens/variational_distributions/joint.py +++ b/src/queens/variational_distributions/joint.py @@ -14,13 +14,32 @@ # """Joint Variational Distribution.""" +from typing import Generic, Iterator, TypeAlias, TypeVar + import numpy as np import scipy - -from queens.variational_distributions._variational_distribution import Variational - - -class Joint(Variational): +from numpy.typing import ArrayLike + +from queens.variational_distributions._variational_distribution import ( + ArrayNParams, + ArrayNParamsComponent, + ArrayNParamsXNParams, + ArrayNParamsXNSamples, + ArrayNSamples, + ArrayNSamplesXNDims, + NDims, + NSamples, + V, + Variational, +) + +NDimsComponent = TypeVar("NDimsComponent", bound=int) +ArrayNSamplesXNDimsComponent: TypeAlias = np.ndarray[ # pylint: disable=invalid-name + tuple[NSamples, NDimsComponent], np.dtype[np.floating] +] + + +class Joint(Variational, Generic[V]): r"""Joint variational distribution class. This distribution allows to join distributions in an independent fashion: @@ -30,32 +49,29 @@ class Joint(Variational): is a generalization of the mean field distribution Attributes: - distributions (list): List of variational distribution objects for the different - independent distributions. - n_parameters (int): Total number of parameters used in the parameterization. - distributions_n_parameters (np.ndarray): Number of parameters per distribution - distributions_dimension (np.ndarray): Number of dimension per distribution + distributions: Variational distribution objects for the different independent distributions. + n_parameters: Total number of parameters used in the parameterization. + distributions_n_parameters: Number of parameters per distribution + distributions_dimension: Number of dimension per distribution """ - def __init__(self, distributions, dimension): + def __init__(self, distributions: list[V], dimension: NDims) -> None: """Initialize joint distribution. Args: - dimension (int): Dimension of the random variable - distributions (list): List of variational distribution objects for the different - independent distributions. + distributions: Variational distribution objects for the different independent + distributions. + dimension: Dimension of the random variable """ - super().__init__(dimension) self.distributions = distributions - self.distributions_n_parameters = np.array( - [distribution.n_parameters for distribution in distributions] + [distribution.n_parameters for distribution in self.distributions] ).astype(int) - self.n_parameters = int(np.sum(self.distributions_n_parameters)) + super().__init__(dimension, n_parameters=int(np.sum(self.distributions_n_parameters))) self.distributions_dimension = np.array( - [distribution.dimension for distribution in distributions] + [distribution.dimension for distribution in self.distributions] ).astype(int) if dimension != np.sum(self.distributions_dimension): @@ -64,17 +80,16 @@ def __init__(self, distributions, dimension): f"dimensions of the subdistributions {np.sum(self.distributions_dimension)}" ) - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: r"""Initialize variational parameters. The distribution initialization is handle by the component itself. Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ variational_parameters = np.concatenate( [ @@ -85,25 +100,29 @@ def initialize_variational_parameters(self, random=False): return variational_parameters - def construct_variational_parameters(self, distributions_parameters_list): + def construct_variational_parameters( # pylint: disable=arguments-differ + self, distributions_parameters: list + ) -> ArrayNParams: """Construct the variational parameters from the distribution list. Args: - distributions_parameters_list (list): List of the parameters of the distributions + distributions_parameters: Parameters of the distributions Returns: - variational_parameters (np.ndarray): Variational parameters + Variational parameters """ variational_parameters = [] for parameters, distribution in zip( - distributions_parameters_list, self.distributions, strict=True + distributions_parameters, self.distributions, strict=True ): variational_parameters.append( distribution.construct_variational_parameters(*parameters) ) return np.concatenate(variational_parameters) - def _construct_distributions_variational_parameters(self, variational_parameters): + def _construct_distributions_variational_parameters( + self, variational_parameters: ArrayNParams + ) -> list[ArrayNParamsComponent]: """Reconstruct the parameters of the distributions. Creates a list containing the variational parameters of the different components. @@ -111,27 +130,28 @@ def _construct_distributions_variational_parameters(self, variational_parameters The list is nested, each entry correspond to the parameters of a distribution. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - variational_parameters_list (list): List of the variational parameters of the components + Variational parameters of the components """ variational_parameters_list = split_array_by_chunk_sizes( variational_parameters, self.distributions_n_parameters ) return variational_parameters_list - def reconstruct_distribution_parameters(self, variational_parameters): + def reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> list[list[tuple[list | np.ndarray]]]: """Reconstruct the parameters of distributions. The list is nested, each entry correspond to the parameters of a distribution. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - distribution_parameters_list (list): List of the distribution parameters of the - components + Distribution parameters of the components """ distribution_parameters_list = [] @@ -141,19 +161,20 @@ def reconstruct_distribution_parameters(self, variational_parameters): distribution_parameters_list.append( distribution.reconstruct_distribution_parameters(parameters) ) - return [distribution_parameters_list] - def _zip_variational_parameters_distributions(self, variational_parameters): + def _zip_variational_parameters_distributions( + self, variational_parameters: ArrayNParams + ) -> Iterator[tuple[ArrayNParamsComponent, V]]: """Zip parameters and distributions. This helper function creates a generator for variational parameters and subdistribution. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - zip: of variational parameters and distributions + Zip of variational parameters and distributions """ return zip( split_array_by_chunk_sizes(variational_parameters, self.distributions_n_parameters), @@ -161,18 +182,20 @@ def _zip_variational_parameters_distributions(self, variational_parameters): strict=True, ) - def _zip_variational_parameters_distributions_samples(self, variational_parameters, samples): + def _zip_variational_parameters_distributions_samples( + self, variational_parameters: ArrayNParams, samples: ArrayNSamplesXNDims + ) -> Iterator[tuple[ArrayNParamsComponent, ArrayNSamplesXNDimsComponent, V]]: """Zip parameters, samples and distributions. This helper function creates a generator for variational parameters, samples and subdistribution. Args: - variational_parameters (np.ndarray): Variational parameters - samples (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + samples: Row-wise samples Returns: - zip: of variational parameters, samples and distributions + Zip of variational parameters, samples and distributions """ return zip( split_array_by_chunk_sizes(variational_parameters, self.distributions_n_parameters), @@ -181,15 +204,15 @@ def _zip_variational_parameters_distributions_samples(self, variational_paramete strict=True, ) - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draw* samples from the variational distribution. Args: - variational_parameters (np.ndarray): Variational parameters - n_draws (int): Number of samples to draw + variational_parameters: Variational parameters + n_draws: Number of samples to draw Returns: - samples (np.ndarray): Row wise samples of the variational distribution + Samples """ sample_array = [] for parameters, distribution in self._zip_variational_parameters_distributions( @@ -198,17 +221,17 @@ def draw(self, variational_parameters, n_draws=1): sample_array.append(distribution.draw(parameters, n_draws)) return np.column_stack(sample_array) - def logpdf(self, variational_parameters, x): - """Logpdf evaluated using the variational parameters at samples *x*. + def logpdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Log-PDF evaluated using the variational parameters at samples *x*. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - logpdf (np.ndarray): Row vector of the logpdfs + Row vector of the Log-PDF values """ - logpdf = 0 + logpdf = np.zeros(x.shape[0], dtype=float) for ( parameters, samples, @@ -217,32 +240,34 @@ def logpdf(self, variational_parameters, x): logpdf += distribution.logpdf(parameters, samples) return logpdf - def pdf(self, variational_parameters, x): + def pdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: """Pdf evaluated using the variational parameters at given samples `x`. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - pdf (np.ndarray): Row vector of the pdfs + Row vector of the PDF values """ pdf = np.exp(self.logpdf(variational_parameters, x)) return pdf - def grad_params_logpdf(self, variational_parameters, x): - """Logpdf gradient w.r.t. the variational parameters. + def grad_params_logpdf( + self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims + ) -> ArrayNParamsXNSamples: + """Log-PDF gradient w.r.t. the variational parameters. Evaluated at samples *x*. Also known as the score function. Is a general implementation using the score functions of the components. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - score (np.ndarray): Column-wise scores + Column-wise scores """ score = [] for ( @@ -254,14 +279,16 @@ def grad_params_logpdf(self, variational_parameters, x): return np.row_stack(score) - def fisher_information_matrix(self, variational_parameters): + def fisher_information_matrix( + self, variational_parameters: ArrayNParams + ) -> ArrayNParamsXNParams: """Approximate the Fisher information matrix using Monte Carlo. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - FIM (np.ndarray): Matrix (num parameters x num parameters) + Fisher information matrix """ fim = [] for parameters, distribution in self._zip_variational_parameters_distributions( @@ -271,14 +298,14 @@ def fisher_information_matrix(self, variational_parameters): return scipy.linalg.block_diag(*fim) - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ export_dict = { "type": "joint", @@ -294,15 +321,15 @@ def export_dict(self, variational_parameters): return export_dict -def split_array_by_chunk_sizes(array, chunk_sizes): +def split_array_by_chunk_sizes(array: np.ndarray, chunk_sizes: ArrayLike) -> list: """Split up array by a list of chunk sizes. Args: - array (np.ndarray): Array to be split - chunk_sizes (np.ndarray): List of chunk sizes + array: Array to be split + chunk_sizes: Chunk sizes Returns: - list: with the chunks + Chunks of the array """ if array.ndim > 2: raise ValueError( diff --git a/src/queens/variational_distributions/mean_field_normal.py b/src/queens/variational_distributions/mean_field_normal.py index db0e0626a..dcfe3c402 100644 --- a/src/queens/variational_distributions/mean_field_normal.py +++ b/src/queens/variational_distributions/mean_field_normal.py @@ -14,10 +14,26 @@ # """Mean-Field Normal Variational Distribution.""" +from typing import cast + import numpy as np from queens.utils.logger_settings import log_init_args -from queens.variational_distributions._variational_distribution import Variational +from queens.variational_distributions._variational_distribution import ( + Array1XNParams, + ArrayNDims, + ArrayNDimsX1, + ArrayNDimsXNDims, + ArrayNParams, + ArrayNParamsXNParams, + ArrayNParamsXNSamples, + ArrayNSamples, + ArrayNSamplesXNDims, + ArrayNSamplesXNParams, + NDims, + NSamples, + Variational, +) class MeanFieldNormal(Variational): @@ -32,20 +48,19 @@ class MeanFieldNormal(Variational): The Journal of Machine Learning Research 18.1 (2017): 430-474. Attributes: - n_parameters (int): Number of parameters used in the parameterization. + n_parameters: Number of parameters used in the parameterization. """ @log_init_args - def __init__(self, dimension): + def __init__(self, dimension: NDims) -> None: """Initialize variational distribution. Args: - dimension (int): Dimension of RV. + dimension: Dimension of random variable. """ - super().__init__(dimension) - self.n_parameters = 2 * dimension + super().__init__(dimension, n_parameters=2 * dimension) - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: r"""Initialize variational parameters. Default initialization: @@ -55,11 +70,10 @@ def initialize_variational_parameters(self, random=False): :math:`\mu=Uniform(-0.1,0.1)` and :math:`\sigma^2=Uniform(0.9,1.1)` Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ if random: variational_parameters = np.hstack( @@ -73,16 +87,17 @@ def initialize_variational_parameters(self, random=False): return variational_parameters - @staticmethod - def construct_variational_parameters(mean, covariance): + def construct_variational_parameters( # pylint: disable=arguments-differ + self, mean: ArrayNDimsX1 | ArrayNDims, covariance: ArrayNDimsXNDims + ) -> ArrayNParams: """Construct the variational parameters from mean and covariance. Args: - mean (np.ndarray): Mean values of the distribution (n_dim x 1) - covariance (np.ndarray): Covariance matrix of the distribution (n_dim x n_dim) + mean: Mean values of the distribution + covariance: Covariance matrix of the distribution Returns: - variational_parameters (np.ndarray): Variational parameters + Variational parameters """ if len(mean) == len(covariance): variational_parameters = np.hstack((mean.flatten(), 0.5 * np.log(np.diag(covariance)))) @@ -93,46 +108,47 @@ def construct_variational_parameters(mean, covariance): ) return variational_parameters - def reconstruct_distribution_parameters(self, variational_parameters): + def reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> tuple[ArrayNDimsX1, ArrayNDimsXNDims]: """Reconstruct mean and covariance from the variational parameters. Args: - variational_parameters (np.ndarray): Variational parameters - + variational_parameters: Variational parameters Returns: - mean (np.ndarray): Mean value of the distribution (n_dim x 1) - cov (np.ndarray): Covariance matrix of the distribution (n_dim x n_dim) + Mean value of the distribution + Covariance matrix of the distribution """ - mean, cov = ( - variational_parameters[: self.dimension], - np.exp(2 * variational_parameters[self.dimension :]), - ) - return mean.reshape(-1, 1), np.diag(cov) - - def _grad_reconstruct_distribution_parameters(self, variational_parameters): + mean = variational_parameters[: self.dimension].reshape(-1, 1) + covariance_vector = np.exp(2 * variational_parameters[self.dimension :]) + covariance = np.diag(covariance_vector) + return cast(ArrayNDimsX1, mean), covariance + + def _grad_reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> Array1XNParams: """Gradient of the parameter reconstruction. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - grad_reconstruct_params (np.ndarray): Gradient vector of the reconstruction - w.r.t. the variational parameters + Gradient vector of the reconstruction w.r.t. the variational parameters """ grad_mean = np.ones((1, self.dimension)) grad_std = (np.exp(variational_parameters[self.dimension :])).reshape(1, -1) grad_reconstruct_params = np.hstack((grad_mean, grad_std)) return grad_reconstruct_params - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draw* samples from the variational distribution. Args: - variational_parameters (np.ndarray): Variational parameters - n_draws (int): Number of samples to draw + variational_parameters: Variational parameters + n_draws: Number of samples to draw Returns: - samples (np.ndarray): Row-wise samples of the variational distribution + Samples """ mean, cov = self.reconstruct_distribution_parameters(variational_parameters) samples = np.random.randn(n_draws, self.dimension) * np.sqrt(np.diag(cov)).reshape( @@ -140,59 +156,61 @@ def draw(self, variational_parameters, n_draws=1): ) + mean.reshape(1, -1) return samples - def logpdf(self, variational_parameters, x): - """Logpdf evaluated using the variational parameters at samples `x`. + def logpdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Log-PDF evaluated using the variational parameters at samples `x`. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - logpdf (np.ndarray): Row vector of the logpdfs + Row vector of the Log-PDF values """ mean, cov = self.reconstruct_distribution_parameters(variational_parameters) - mean = mean.flatten() + mean_flat = mean.flatten() cov = np.diag(cov) x = np.atleast_2d(x) logpdf = ( -0.5 * self.dimension * np.log(2 * np.pi) - np.sum(variational_parameters[self.dimension :]) - - 0.5 * np.sum((x - mean) ** 2 / cov, axis=1) + - 0.5 * np.sum((x - mean_flat) ** 2 / cov, axis=1) ) return logpdf.flatten() - def pdf(self, variational_parameters, x): - """Pdf of the variational distribution evaluated at samples *x*. + def pdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """PDF of the variational distribution evaluated at samples *x*. - First computes the logpdf, which is numerically more stable for exponential distributions. + First computes the log-PDF, which is numerically more stable for exponential distributions. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - pdf (np.ndarray): Row vector of the pdfs + Row vector of the PDF values """ pdf = np.exp(self.logpdf(variational_parameters, x)) return pdf - def grad_params_logpdf(self, variational_parameters, x): - """Logpdf gradient w.r.t. the variational parameters. + def grad_params_logpdf( + self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims + ) -> ArrayNParamsXNSamples: + """Log-PDF gradient w.r.t. the variational parameters. Evaluated at samples *x*. Also known as the score function. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - score (np.ndarray): Column-wise scores + Column-wise scores """ mean, cov = self.reconstruct_distribution_parameters(variational_parameters) - mean = mean.flatten() + mean_flat = mean.flatten() cov = np.diag(cov) - dlogpdf_dmu = (x - mean) / cov - dlogpdf_dsigma = (x - mean) ** 2 / cov - np.ones(x.shape) + dlogpdf_dmu = (x - mean_flat) / cov + dlogpdf_dsigma = (x - mean_flat) ** 2 / cov - np.ones(x.shape) score = np.concatenate( [ dlogpdf_dmu.T.reshape(self.dimension, len(x)), @@ -201,35 +219,39 @@ def grad_params_logpdf(self, variational_parameters, x): ) return score - def total_grad_params_logpdf(self, variational_parameters, standard_normal_sample_batch): - """Total logpdf reparameterization gradient. + def total_grad_params_logpdf( + self, + variational_parameters: ArrayNParams, + standard_normal_sample_batch: ArrayNSamplesXNDims, + ) -> ArrayNSamplesXNParams: + """Total log-PDF reparameterization gradient. - Total logpdf reparameterization gradient w.r.t. the variational parameters. + Total log-PDF reparameterization gradient w.r.t. the variational parameters. Args: - variational_parameters (np.ndarray): Variational parameters - standard_normal_sample_batch (np.ndarray): Standard normal distributed sample batch + variational_parameters: Variational parameters + standard_normal_sample_batch: Standard normal distributed sample batch Returns: - total_grad (np.ndarray): Total Logpdf reparameterization gradient + Total log-PDF reparameterization gradient """ total_grad = np.zeros((standard_normal_sample_batch.shape[0], variational_parameters.size)) total_grad[:, self.dimension :] = -1.0 return total_grad - def grad_sample_logpdf(self, variational_parameters, sample_batch): - """Computes the gradient of the logpdf w.r.t. to the *x*. + def grad_sample_logpdf( + self, variational_parameters: ArrayNParams, sample_batch: ArrayNSamplesXNDims + ) -> ArrayNSamplesXNDims: + """Computes the gradient of the log-PDF w.r.t. to the sample *x*. Args: - variational_parameters (np.ndarray): Variational parameters - sample_batch (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + sample_batch: Row-wise samples Returns: - gradients_batch (np.ndarray): Gradients of the log-pdf w.r.t. the - sample *x*. The first dimension of the array corresponds to - the different samples. The second dimension to different dimensions - within one sample. (Third dimension is empty and just added to - keep slices two dimensional.) + Gradients of the log-PDF w.r.t. the sample *x*. The first dimension of the array + corresponds to the different samples. The second dimension to different dimensions + within one sample. """ mean, cov = self.reconstruct_distribution_parameters(variational_parameters) gradients_batch = -(sample_batch - mean.reshape(1, self.dimension)) / np.diag(cov).reshape( @@ -237,27 +259,29 @@ def grad_sample_logpdf(self, variational_parameters, sample_batch): ) return gradients_batch - def fisher_information_matrix(self, variational_parameters): + def fisher_information_matrix( + self, variational_parameters: ArrayNParams + ) -> ArrayNParamsXNParams: r"""Compute the Fisher information matrix analytically. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - FIM (np.ndarray): Matrix (n_parameters x n_parameters) + Fisher information matrix """ fisher_diag = np.exp(-2 * variational_parameters[self.dimension :]) fisher_diag = np.hstack((fisher_diag, 2 * np.ones(self.dimension))) return np.diag(fisher_diag) - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ mean, cov = self.reconstruct_distribution_parameters(variational_parameters) sd = cov**0.5 @@ -270,18 +294,18 @@ def export_dict(self, variational_parameters): } return export_dict - def conduct_reparameterization(self, variational_parameters, n_samples): + def conduct_reparameterization( + self, variational_parameters: ArrayNParams, n_samples: NSamples + ) -> tuple[ArrayNSamplesXNDims, ArrayNSamplesXNDims]: """Conduct a reparameterization. Args: - variational_parameters (np.ndarray): Array with variational parameters - n_samples (int): Number of samples for current batch + variational_parameters: Array with variational parameters + n_samples: Number of samples for current batch Returns: - * samples_mat (np.ndarray): Array of actual samples from the - variational distribution - * standard_normal_sample_batch (np.ndarray): Standard normal - distributed sample batch + Actual samples from the variational distribution + Standard normal distributed sample batch """ standard_normal_sample_batch = np.random.normal(0, 1, size=(n_samples, self.dimension)) mean, cov = self.reconstruct_distribution_parameters(variational_parameters) @@ -290,18 +314,20 @@ def conduct_reparameterization(self, variational_parameters, n_samples): return samples_mat, standard_normal_sample_batch def grad_params_reparameterization( - self, variational_parameters, standard_normal_sample_batch, upstream_gradient - ): + self, + variational_parameters: ArrayNParams, + standard_normal_sample_batch: ArrayNSamplesXNDims, + upstream_gradient: ArrayNSamplesXNDims, + ) -> ArrayNSamplesXNParams: r"""Calculate the gradient of the reparameterization. Args: - variational_parameters (np.ndarray): Variational parameters - standard_normal_sample_batch (np.ndarray): Standard normal distributed sample batch - upstream_gradient (np.array): Upstream gradient + variational_parameters: Variational parameters + standard_normal_sample_batch: Standard normal distributed sample batch + upstream_gradient: Upstream gradient Returns: - gradient (np.ndarray): Gradient of the upstream function w.r.t. the variational - parameters. + Gradient of the upstream function w.r.t. the variational parameters. Note: We assume that *grad_reconstruct_params* is a row-vector containing the partial diff --git a/src/queens/variational_distributions/mixture_model.py b/src/queens/variational_distributions/mixture_model.py index 8941b07ee..dda774ba2 100644 --- a/src/queens/variational_distributions/mixture_model.py +++ b/src/queens/variational_distributions/mixture_model.py @@ -14,12 +14,30 @@ # """Mixture Model Variational Distribution.""" -import numpy as np - -from queens.variational_distributions._variational_distribution import Variational +from typing import Generic, Iterable, TypeAlias, TypeVar +import numpy as np -class MixtureModel(Variational): +from queens.variational_distributions._variational_distribution import ( + ArrayNParams, + ArrayNParamsComponent, + ArrayNParamsXNParams, + ArrayNParamsXNSamples, + ArrayNSamples, + ArrayNSamplesXNDims, + NDims, + NSamples, + V, + Variational, +) + +NComponents = TypeVar("NComponents", bound=int) +ArrayNComponents: TypeAlias = np.ndarray[ # pylint: disable=invalid-name + tuple[NComponents], np.dtype[np.floating] +] + + +class MixtureModel(Variational, Generic[V]): r"""Mixture model variational distribution class. Every component is a member of the same distribution family. Uses the parameterization: @@ -32,25 +50,24 @@ class MixtureModel(Variational): This allows the weight parameters :math:`\lambda_{weights}` to be unconstrained. Attributes: - n_components (int): Number of mixture components. + n_components: Number of mixture components. base_distribution: Variational distribution object for the components. - n_parameters (int): Number of parameters used in the parameterization. + n_parameters: Number of parameters used in the parameterization. """ - def __init__(self, base_distribution, dimension, n_components): + def __init__(self, base_distribution: V, dimension: NDims, n_components: NComponents) -> None: """Initialize mixture model. Args: - dimension (int): Dimension of the random variable - n_components (int): Number of mixture components base_distribution: Variational distribution object for the components + dimension: Dimension of the random variable + n_components: Number of mixture components """ - super().__init__(dimension) + super().__init__(dimension, n_parameters=n_components * base_distribution.n_parameters) self.n_components = n_components self.base_distribution = base_distribution - self.n_parameters = n_components * base_distribution.n_parameters - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: r"""Initialize variational parameters. Default weights initialization: @@ -63,11 +80,10 @@ def initialize_variational_parameters(self, random=False): The component initialization is handle by the component itself. Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ variational_parameters_components = ( self.base_distribution.initialize_variational_parameters(random) @@ -87,25 +103,29 @@ def initialize_variational_parameters(self, random=False): return np.concatenate([variational_parameters_components, variational_parameters_weights]) - def construct_variational_parameters(self, component_parameters_list, weights): + def construct_variational_parameters( # pylint: disable=arguments-differ + self, parameters_per_component: list[Iterable[np.ndarray]], weights: ArrayNComponents + ) -> ArrayNParams: """Construct the variational parameters from the probabilities. Args: - component_parameters_list (list): List of the component parameters of the components - weights (np.ndarray): Probabilities of the distribution + parameters_per_component: Distribution parameters per component + weights: Probabilities of the distribution Returns: - variational_parameters (np.ndarray): Variational parameters + Variational parameters """ variational_parameters = [] - for component_parameters in component_parameters_list: + for parameters in parameters_per_component: variational_parameters.append( - self.base_distribution.construct_variational_parameters(*component_parameters) + self.base_distribution.construct_variational_parameters(*parameters) ) variational_parameters.append(np.log(weights).flatten()) return np.concatenate(variational_parameters) - def _construct_component_variational_parameters(self, variational_parameters): + def _construct_component_variational_parameters( + self, variational_parameters: ArrayNParams + ) -> tuple[list[ArrayNParamsComponent], ArrayNComponents]: """Reconstruct the weights and parameters of the mixture components. Creates a list containing the variational parameters of the different components. @@ -113,11 +133,11 @@ def _construct_component_variational_parameters(self, variational_parameters): The list is nested, each entry correspond to the parameters of a component. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - variational_parameters_list (list): List of the variational parameters of the components - weights (np.ndarray): Weights of the mixture + Variational parameters of the components + Weights of the mixture """ n_parameters_comp = self.base_distribution.n_parameters variational_parameters_list = [] @@ -131,18 +151,19 @@ def _construct_component_variational_parameters(self, variational_parameters): weights = weights / np.sum(weights) return variational_parameters_list, weights - def reconstruct_distribution_parameters(self, variational_parameters): + def reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> tuple[list[tuple[list | np.ndarray]], ArrayNComponents]: """Reconstruct the weights and parameters of the mixture components. The list is nested, each entry correspond to the parameters of a component. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - distribution_parameters_list (list): List of the distribution parameters of the - components - weights (np.ndarray): Weights of the mixture + Distribution parameters of the components + Weights of the mixture """ n_parameters_comp = self.base_distribution.n_parameters distribution_parameters_list = [] @@ -159,7 +180,7 @@ def reconstruct_distribution_parameters(self, variational_parameters): weights = weights / np.sum(weights) return distribution_parameters_list, weights - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draw* samples from the variational distribution. Uses a two-step process: @@ -167,29 +188,29 @@ def draw(self, variational_parameters, n_draws=1): 2. Sample from the selected component Args: - variational_parameters (np.ndarray): Variational parameters - n_draws (int): Number of samples to draw + variational_parameters: Variational parameters + n_draws: Number of samples to draw Returns: - samples (np.ndarray): Row wise samples of the variational distribution + Samples """ - parameters_list, weights = self._construct_component_variational_parameters( + parameters, weights = self._construct_component_variational_parameters( variational_parameters ) - samples = [] + samples_lst = [] for _ in range(n_draws): # Select component to draw from component = np.argmax(np.random.multinomial(1, weights)) # Draw a sample of this component - sample = self.base_distribution.draw(parameters_list[component], 1) - samples.append(sample) - samples = np.concatenate(samples, axis=0) + sample = self.base_distribution.draw(parameters[component], 1) + samples_lst.append(sample) + samples = np.concatenate(samples_lst, axis=0) return samples - def logpdf(self, variational_parameters, x): - """Logpdf evaluated using the variational parameters at samples *x*. + def logpdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Log-PDF evaluated using the variational parameters at samples *x*. - Is a general implementation using the logpdf function of the components. Uses the + Is a general implementation using the log-PDF function of the components. Uses the log-sum-exp trick [1] in order to reduce floating point issues. References: @@ -197,55 +218,57 @@ def logpdf(self, variational_parameters, x): Review for Statisticians, Journal of the American Statistical Association, 112:518 Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - logpdf (np.ndarray): Row vector of the logpdfs + Row vector of the Log-PDF values """ - parameters_list, weights = self._construct_component_variational_parameters( + parameters, weights = self._construct_component_variational_parameters( variational_parameters ) - logpdf = [] + logpdf_lst = [] x = np.atleast_2d(x) # Parameter for the log-sum-exp trick max_logpdf = -np.inf * np.ones(len(x)) for j in range(self.n_components): - logpdf.append(np.log(weights[j]) + self.base_distribution.logpdf(parameters_list[j], x)) - max_logpdf = np.maximum(max_logpdf, logpdf[-1]) - logpdf = np.array(logpdf) - np.tile(max_logpdf, (self.n_components, 1)) + logpdf_lst.append(np.log(weights[j]) + self.base_distribution.logpdf(parameters[j], x)) + max_logpdf = np.maximum(max_logpdf, logpdf_lst[-1]) + logpdf = np.array(logpdf_lst) - np.tile(max_logpdf, (self.n_components, 1)) logpdf = np.sum(np.exp(logpdf), axis=0) logpdf = np.log(logpdf) + max_logpdf return logpdf - def pdf(self, variational_parameters, x): + def pdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: """Pdf evaluated using the variational parameters at given samples `x`. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - pdf (np.ndarray): Row vector of the pdfs + Row vector of the PDF values """ pdf = np.exp(self.logpdf(variational_parameters, x)) return pdf - def grad_params_logpdf(self, variational_parameters, x): - """Logpdf gradient w.r.t. the variational parameters. + def grad_params_logpdf( + self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims + ) -> ArrayNParamsXNSamples: + """Log-PDF gradient w.r.t. the variational parameters. Evaluated at samples *x*. Also known as the score function. Is a general implementation using the score functions of the components. Args: - variational_parameters (np.ndarray): Variational parameters - x (np.ndarray): Row-wise samples + variational_parameters: Variational parameters + x: Row-wise samples Returns: - score (np.ndarray): Column-wise scores + Column-wise scores """ - parameters_list, weights = self._construct_component_variational_parameters( + parameters, weights = self._construct_component_variational_parameters( variational_parameters ) x = np.atleast_2d(x) @@ -258,9 +281,9 @@ def grad_params_logpdf(self, variational_parameters, x): logpdf = self.logpdf(variational_parameters, x) for j in range(self.n_components): # coefficient for the score term of every component - precoeff = np.exp(self.base_distribution.logpdf(parameters_list[j], x) - logpdf) + precoeff = np.exp(self.base_distribution.logpdf(parameters[j], x) - logpdf) # Score function of the jth component - score_comp = self.base_distribution.grad_params_logpdf(parameters_list[j], x) + score_comp = self.base_distribution.grad_params_logpdf(parameters[j], x) component_block.append( weights[j] * np.tile(precoeff, (len(score_comp), 1)) * score_comp ) @@ -270,34 +293,37 @@ def grad_params_logpdf(self, variational_parameters, x): score = np.vstack((np.concatenate(component_block, axis=0), weights_block)) return score - def fisher_information_matrix(self, variational_parameters, n_samples=10000): + def fisher_information_matrix( + self, variational_parameters: ArrayNParams, n_samples: int = 10000 + ) -> ArrayNParamsXNParams: """Approximate the Fisher information matrix using Monte Carlo. Args: - variational_parameters (np.ndarray): Variational parameters - n_samples (int, optional): number of samples for a MC FIM estimation + variational_parameters: Variational parameters + n_samples: Number of samples for a MC FIM estimation Returns: - FIM (np.ndarray): Matrix (num parameters x num parameters) + Fisher information matrix """ samples = self.draw(variational_parameters, n_samples) scores = self.grad_params_logpdf(variational_parameters, samples) - fim = 0 + n_var_params = scores.shape[0] + fim = np.zeros((n_var_params, n_var_params)) for j in range(n_samples): fim = fim + np.outer(scores[:, j], scores[:, j]) fim = fim / n_samples return fim - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ - parameters_list, weights = self._construct_component_variational_parameters( + parameters, weights = self._construct_component_variational_parameters( variational_parameters ) export_dict = { @@ -309,7 +335,7 @@ def export_dict(self, variational_parameters): } # Loop over the components for j in range(self.n_components): - component_dict = self.base_distribution.export_dict(parameters_list[j]) + component_dict = self.base_distribution.export_dict(parameters[j]) component_key = "component_" + str(j) export_dict.update({component_key: component_dict}) return export_dict diff --git a/src/queens/variational_distributions/particle.py b/src/queens/variational_distributions/particle.py index cb2b89559..fb833cd5d 100644 --- a/src/queens/variational_distributions/particle.py +++ b/src/queens/variational_distributions/particle.py @@ -14,10 +14,20 @@ # """Particle Variational Distribution.""" +from collections.abc import Sequence, Sized + import numpy as np from queens.distributions.particle import Particle as ParticleDistribution -from queens.variational_distributions._variational_distribution import Variational +from queens.variational_distributions._variational_distribution import ( + ArrayNParams, + ArrayNParamsXNParams, + ArrayNParamsXNSamples, + ArrayNSamples, + ArrayNSamplesXNDims, + NSamples, + Variational, +) class Particle(Variational): @@ -27,31 +37,36 @@ class Particle(Variational): :math:`p_i=p(\lambda_i)=\frac{\exp(\lambda_i)}{\sum_k exp(\lambda_k)}` Attributes: - particles_obj (Particle): Particle distribution object - dimension (int): Number of random variables + particles_obj: Particle distribution object + dimension: Number of random variables """ - def __init__(self, sample_space): - """Initialize variational distribution.""" + def __init__(self, sample_space: np.ndarray | Sequence[Sized]) -> None: + """Initialize variational distribution. + + Args: + sample_space: Sample space of the variational distribution + """ self.particles_obj = ParticleDistribution(np.ones(len(sample_space)), sample_space) - super().__init__(self.particles_obj.dimension) - self.n_parameters = len(sample_space) + super().__init__(self.particles_obj.dimension, n_parameters=len(sample_space)) - def construct_variational_parameters(self, probabilities, sample_space): + def construct_variational_parameters( # pylint: disable=arguments-differ + self, probabilities: ArrayNParams, sample_space: np.ndarray | Sequence[Sized] + ) -> ArrayNParams: """Construct the variational parameters from the probabilities. Args: - probabilities (np.ndarray): Probabilities of the distribution - sample_space (np.ndarray): Sample space of the distribution + probabilities: Probabilities of the distribution + sample_space: Sample space of the distribution Returns: - variational_parameters (np.ndarray): Variational parameters + Variational parameters """ self.particles_obj = ParticleDistribution(probabilities, sample_space) variational_parameters = np.log(probabilities).flatten() return variational_parameters - def initialize_variational_parameters(self, random=False): + def initialize_variational_parameters(self, random: bool = False) -> ArrayNParams: r"""Initialize variational parameters. Default initialization: @@ -62,11 +77,10 @@ def initialize_variational_parameters(self, random=False): distribution with :math:`N_\text{experiments}` Args: - random (bool, optional): If True, a random initialization is used. Otherwise the - default is selected + random: If True, a random initialization is used. Otherwise the default is selected Returns: - variational_parameters (np.ndarray): variational parameters (1 x n_params) + Variational parameters """ if random: variational_parameters = ( @@ -78,61 +92,66 @@ def initialize_variational_parameters(self, random=False): return variational_parameters - def reconstruct_distribution_parameters(self, variational_parameters): + def reconstruct_distribution_parameters( + self, variational_parameters: ArrayNParams + ) -> tuple[ArrayNParams, np.ndarray]: """Reconstruct probabilities from the variational parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - probabilities (np.ndarray): Probabilities of the distribution + Probabilities of the distribution + Sample space of the distribution """ probabilities = np.exp(variational_parameters) probabilities /= np.sum(probabilities) self.particles_obj = ParticleDistribution(probabilities, self.particles_obj.sample_space) return probabilities, self.particles_obj.sample_space - def draw(self, variational_parameters, n_draws=1): + def draw(self, variational_parameters: ArrayNParams, n_draws: NSamples) -> ArrayNSamplesXNDims: """Draw *n_draws* samples from distribution. Args: - variational_parameters (np.ndarray): Variational parameters of the distribution - n_draws (int): Number of samples + variational_parameters: Variational parameters of the distribution + n_draws: Number of samples Returns: - samples (np.ndarray): samples (n_draws x n_dim) + Samples """ self.reconstruct_distribution_parameters(variational_parameters) return self.particles_obj.draw(n_draws) - def logpdf(self, variational_parameters, x): - """Evaluate the natural logarithm of the logpdf at sample. + def logpdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Evaluate the natural logarithm of the PDF. Args: - variational_parameters (np.ndarray): Variational parameters of the distribution - x (np.ndarray): Locations at which to evaluate the distribution (n_samples x n_dim) + variational_parameters: Variational parameters of the distribution + x: Locations at which to evaluate the distribution Returns: - logpdf (np.ndarray): Logpdfs at the locations x + Log-PDF values at the locations x """ self.reconstruct_distribution_parameters(variational_parameters) return self.particles_obj.logpdf(x) - def pdf(self, variational_parameters, x): - """Evaluate the probability density function (pdf) at sample. + def pdf(self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims) -> ArrayNSamples: + """Evaluate the probability density function (PDF). Args: - variational_parameters (np.ndarray): Variational parameters of the distribution - x (np.ndarray): Locations at which to evaluate the distribution (n_samples x n_dim) + variational_parameters: Variational parameters of the distribution + x: Locations at which to evaluate the distribution Returns: - logpdf (np.ndarray): Pdfs at the locations x + Row vector of the PDF values """ self.reconstruct_distribution_parameters(variational_parameters) return self.particles_obj.pdf(x) - def grad_params_logpdf(self, variational_parameters, x): - r"""Logpdf gradient w.r.t. the variational parameters. + def grad_params_logpdf( + self, variational_parameters: ArrayNParams, x: ArrayNSamplesXNDims + ) -> ArrayNParamsXNSamples: + r"""Log-PDF gradient w.r.t. the variational parameters. Evaluated at samples *x*. Also known as the score function. @@ -140,11 +159,11 @@ def grad_params_logpdf(self, variational_parameters, x): :math:`\nabla_{\lambda_i}\ln p(\theta_j | \lambda)=\delta_{ij}-p_i` Args: - variational_parameters (np.ndarray): Variational parameters of the distribution - x (np.ndarray): Locations at which to evaluate the distribution (n_samples x n_dim) + variational_parameters: Variational parameters of the distribution + x: Locations at which to evaluate the distribution Returns: - score_function (np.ndarray): Score functions at the locations x + Score functions at the locations x """ self.reconstruct_distribution_parameters(variational_parameters) index = np.array( @@ -162,30 +181,32 @@ def grad_params_logpdf(self, variational_parameters, x): # Get the samples return sample_scores[index].T - def fisher_information_matrix(self, variational_parameters): - r"""Compute the fisher information matrix. + def fisher_information_matrix( + self, variational_parameters: ArrayNParams + ) -> ArrayNParamsXNParams: + r"""Compute the Fisher information matrix. For the given parameterization, the Fisher information yields: :math:`\text{FIM}_{ij}=\delta_{ij} p_i -p_i p_j` Args: - variational_parameters (np.ndarray): Variational parameters of the distribution + variational_parameters: Variational parameters of the distribution Returns: - fim (np.ndarray): Fisher information matrix (n_params x n_params) + Fisher information matrix """ probabilities, _ = self.reconstruct_distribution_parameters(variational_parameters) fim = np.diag(probabilities) - np.outer(probabilities, probabilities) return fim - def export_dict(self, variational_parameters): + def export_dict(self, variational_parameters: ArrayNParams) -> dict: """Create a dict of the distribution based on the given parameters. Args: - variational_parameters (np.ndarray): Variational parameters + variational_parameters: Variational parameters Returns: - export_dict (dictionary): Dict containing distribution information + Dictionary containing distribution information """ self.reconstruct_distribution_parameters(variational_parameters) export_dict = { diff --git a/src/queens_interfaces/fourc/README.md b/src/queens_interfaces/fourc/README.md index 734f7d751..4862c5bcb 100644 --- a/src/queens_interfaces/fourc/README.md +++ b/src/queens_interfaces/fourc/README.md @@ -1,10 +1,23 @@ # 4C -This package contains drivers and utilities realted to the for multiphysics code [4C](https://github.com/4C-multiphysics/4C). We like them and we work closely with them. +This package contains drivers and utilities related to the multiphysics code +[4C](https://github.com/4C-multiphysics/4C). We like them and we work closely with them. ## Material random field interface -In order to create random material field in combintation with 4C, we require the package [fourcipp](https://github.com/4C-multiphysics/fourcipp). Therefore install QUEENS via (in the QUEENS main directory): +In order to create random material fields in combination with 4C, QUEENS requires the package +[fourcipp](https://github.com/4C-multiphysics/fourcipp). For a regular source install, use the +`fourc` extra: + +```bash +python -m pip install ".[fourc]" ``` -pip install -e .[dev,fourc] + +For Pixi project-based workflow, use the `all` environment +that includes the 4C interface dependencies without development tools: +```bash +pixi install --environment all +pixi run -e all install-editable ``` -(You can omit the `dev` if you don't require the additional development packages). +For development, use the `dev` Pixi environment that includes the `fourc` feature. + +For more setup details, see the top-level [README.md](https://github.com/queens-py/queens/blob/main/README.md). diff --git a/src/queens_interfaces/fourc/fourc_requirements.txt b/src/queens_interfaces/fourc/fourc_requirements.txt deleted file mode 100644 index ea6e568bc..000000000 --- a/src/queens_interfaces/fourc/fourc_requirements.txt +++ /dev/null @@ -1 +0,0 @@ -fourcipp diff --git a/src/queens_interfaces/fourc/random_material_preprocessor.py b/src/queens_interfaces/fourc/random_material_preprocessor.py index adc91f7d1..e243dfe2f 100644 --- a/src/queens_interfaces/fourc/random_material_preprocessor.py +++ b/src/queens_interfaces/fourc/random_material_preprocessor.py @@ -13,6 +13,7 @@ # see . # """4C random material fields preprocessor.""" + from pathlib import Path import numpy as np @@ -22,7 +23,8 @@ except ImportError as exc: raise ImportError( "The required packages to construct random fields in QUEENS for 4C are not installed." - " Please install them via \n pip install -e .[fourc]" + " Install QUEENS with the 'fourc' extra, e.g. `python -m pip install \".[fourc]\"`, " + "or use a Pixi environment with the fourc feature such as `dev` or `all`." ) from exc diff --git a/test_utils/get_queens_example_from_readme.py b/test_utils/get_queens_example_from_readme.py index d2295e9e3..eed10d281 100644 --- a/test_utils/get_queens_example_from_readme.py +++ b/test_utils/get_queens_example_from_readme.py @@ -14,10 +14,9 @@ # """Extract QUEENS example from the readme.""" - from pathlib import Path -from queens.utils.path import relative_path_from_root +from test_utils.path import relative_path_from_root def extract_from_markdown_file_by_marker(marker_name, md_file): diff --git a/test_utils/integration_tests.py b/test_utils/integration_tests.py index ef5af0c14..9a3fa5322 100644 --- a/test_utils/integration_tests.py +++ b/test_utils/integration_tests.py @@ -34,7 +34,12 @@ def assert_monte_carlo_iterator_results(results, expected_mean, expected_var): def assert_surrogate_model_output( - output, mean_ref, var_ref, grad_mean_ref=None, grad_var_ref=None, decimals=(2, 2, 2, 2) + output, + mean_ref, + var_ref, + grad_mean_ref=None, + grad_var_ref=None, + decimals=(2, 2, 2, 2), ): """Assert the equality of the output with the provided reference values. diff --git a/test_utils/path.py b/test_utils/path.py new file mode 100644 index 000000000..3d65d8317 --- /dev/null +++ b/test_utils/path.py @@ -0,0 +1,42 @@ +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2024-2025, QUEENS contributors. +# +# This file is part of QUEENS. +# +# QUEENS is free software: you can redistribute it and/or modify it under the terms of the GNU +# Lesser General Public License as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. QUEENS is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You +# should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, +# see . +# +"""Path helpers for the QUEENS test suite. + +These helpers resolve paths in the repository checkout for tests and +tutorials, including tests that build and install QUEENS from a wheel. +Runtime QUEENS code must not import this module; runtime path helpers +belong in ``queens.utils.path``. +""" + +from pathlib import Path + +PATH_TO_ROOT = Path(__file__).parents[1] + + +def relative_path_from_root(relative_path: str) -> Path: + """Create relative path from root directory. + + As an example to create: *src/queens/folder/file.A* . + + Call *relative_path_from_root("src/queens/folder/file.A")* . + + Args: + relative_path: Path starting from the root directory + + Returns: + Absolute path to the file + """ + full_path = PATH_TO_ROOT / relative_path + return full_path diff --git a/test_utils/tutorial_tests.py b/test_utils/tutorial_tests.py index e42d1ab84..de447bdb0 100644 --- a/test_utils/tutorial_tests.py +++ b/test_utils/tutorial_tests.py @@ -14,6 +14,43 @@ # """Utility methods used by the tutorial tests.""" +from collections import Counter +from itertools import chain +from pathlib import Path + +import pytest + +from test_utils.path import relative_path_from_root + + +def inject_notebook_execution_context(tb, notebook_dir): + """Inject the notebook directory as Python path and working directory. + + Args: + tb (testbook): testbook object for inserting code into the notebook + notebook_dir (str | Path): Directory containing the notebook + + Returns: + None + """ + tb.inject( + f""" + import os + import sys + from pathlib import Path + notebook_dir = Path({str(notebook_dir)!r}) + repo_root = next( + path for path in (notebook_dir, *notebook_dir.parents) + if (path / "pyproject.toml").exists() + ) + for path in (notebook_dir, repo_root): + if str(path) not in sys.path: + sys.path.insert(0, str(path)) + os.chdir(notebook_dir) + """, + before=0, + ) + def inject_mock_base_dir(tb, tmp_path): """Inject a mock base directory for testing notebooks. @@ -35,3 +72,125 @@ def inject_mock_base_dir(tb, tmp_path): """, before=0, ) + + +TUTORIAL_NOTEBOOKS_BY_MARKER = { + "tutorial_tests": [ + relative_path_from_root("tutorials/1_grid_iterator_rosenbrock.ipynb").as_posix(), + relative_path_from_root( + "tutorials/2_uncertainty_propagation_and_quantification.ipynb" + ).as_posix(), + ], + "tutorial_tests_fourc": [ + relative_path_from_root( + "tutorials/3_orchestrating_4c_simulations/3_orchestrating_4c_simulations.ipynb" + ).as_posix(), + relative_path_from_root( + "tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/" + "4_quantifying_uncertainty_due_to_heterogeneous_material_fields.ipynb" + ).as_posix(), + ], + "tutorial_tests_remote": [ + relative_path_from_root( + "tutorials/5_grid_iterator_4c_remote/5_grid_iterator_4c_remote.ipynb" + ).as_posix(), + ], +} +ALL_TUTORIAL_NOTEBOOKS = tuple( + sorted(path.as_posix() for path in relative_path_from_root(Path("tutorials")).rglob("*.ipynb")) +) + + +def _format_paths(paths): + """Format paths for collection error messages.""" + return "\n".join(f" - {path}" for path in sorted(paths)) + + +def _duplicate_paths(paths): + """Return paths that occur more than once.""" + return sorted(path for path, count in Counter(paths).items() if count > 1) + + +def _validate_tutorial_notebook_markers(): + """Ensure every tutorial notebook has at least one explicit marker.""" + discovered_notebooks = set(ALL_TUTORIAL_NOTEBOOKS) + marked_notebooks = set(chain.from_iterable(TUTORIAL_NOTEBOOKS_BY_MARKER.values())) + missing_notebooks = discovered_notebooks - marked_notebooks + stale_notebooks = marked_notebooks - discovered_notebooks + base_notebooks = set(TUTORIAL_NOTEBOOKS_BY_MARKER["tutorial_tests"]) + specialized_notebooks = set( + chain.from_iterable( + notebook_paths + for marker_name, notebook_paths in TUTORIAL_NOTEBOOKS_BY_MARKER.items() + if marker_name != "tutorial_tests" + ) + ) + overlapping_base_notebooks = base_notebooks & specialized_notebooks + + duplicate_marker_assignments = { + marker_name: duplicates + for marker_name, notebook_paths in TUTORIAL_NOTEBOOKS_BY_MARKER.items() + if (duplicates := _duplicate_paths(notebook_paths)) + } + + if not ( + missing_notebooks + or stale_notebooks + or overlapping_base_notebooks + or duplicate_marker_assignments + ): + return + + error_parts = ["Tutorial notebook marker assignments are out of sync."] + if missing_notebooks: + error_parts.append( + "Add marker assignments for these notebooks:\n" f"{_format_paths(missing_notebooks)}" + ) + if stale_notebooks: + error_parts.append( + "Remove marker assignments for missing notebooks:\n" f"{_format_paths(stale_notebooks)}" + ) + if overlapping_base_notebooks: + error_parts.append( + "Remove tutorial_tests from notebooks with specialized tutorial markers:\n" + f"{_format_paths(overlapping_base_notebooks)}" + ) + if duplicate_marker_assignments: + duplicate_entries = [ + f"{marker_name}: {notebook_path}" + for marker_name, notebook_paths in duplicate_marker_assignments.items() + for notebook_path in notebook_paths + ] + error_parts.append( + "Remove duplicate marker assignments:\n" f"{_format_paths(duplicate_entries)}" + ) + + raise pytest.UsageError("\n\n".join(error_parts)) + + +def marker_names_for_notebook(notebook_path): + """Return marker names assigned to a tutorial notebook.""" + notebook_path = Path(notebook_path).as_posix() + return [ + marker_name + for marker_name, notebook_paths in TUTORIAL_NOTEBOOKS_BY_MARKER.items() + if notebook_path in notebook_paths + ] + + +def markers_for_notebook(notebook_path): + """Return pytest markers assigned to a tutorial notebook.""" + return [ + getattr(pytest.mark, marker_name) + for marker_name in marker_names_for_notebook(notebook_path) + ] + + +def notebook_param(notebook_path): + """Return a pytest parameter for a tutorial notebook.""" + notebook_path = Path(notebook_path).as_posix() + return pytest.param( + notebook_path, + marks=markers_for_notebook(notebook_path), + id=notebook_path, + ) diff --git a/tests/README.md b/tests/README.md index f1e215c60..aa3eb4d8b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -15,7 +15,14 @@ Therefore, we test the QUEENS code base - Whenever possible, use [pytest fixtures](https://docs.pytest.org/en/latest/explanation/fixtures.html) to parameterize tests. ## :running_woman: Running tests -QUEENS is tested using [pytest](https://docs.pytest.org/en/stable/index.html). For a comprehensive list of pytest commands, see [here](https://docs.pytest.org/en/stable/how-to/usage.html). Some additional useful commands to test QUEENS are listed in the following: +QUEENS is tested using [pytest](https://docs.pytest.org/en/stable/index.html). For local +development, run tests through the Pixi development environment, for example: + +```bash +pixi run -e dev pytest +``` + +For a comprehensive list of pytest commands, see [here](https://docs.pytest.org/en/stable/how-to/usage.html). Some additional useful commands to test QUEENS are listed in the following: | Test | Command | | ----------------------------- | --------------------------------------------- | @@ -32,11 +39,23 @@ In QUEENS, tests are organized using pytest markers. This allows you to run all | ------------------------------- | ----------------------------------- | | Unit tests | `pytest -m unit_tests` | | Integration tests | `pytest -m integration_tests` | +| Convergence tests | `pytest -m convergence_tests` | | 4C integration test (see below) | `pytest -m integration_tests_fourc` | +| Tutorial tests | `pytest -m tutorial_tests` | +| 4C tutorial tests | `pytest -m tutorial_tests_fourc` | +| Remote tutorial tests | `pytest -m tutorial_tests_remote` | | List markers | `pytest --markers` | +### Adding tutorial notebook tests +All tutorial notebooks under `tutorials/` are discovered recursively. When adding a new notebook, +add its relative path to exactly one list in +`tests/tutorial_tests/tutorial_tests_markers.py::TUTORIAL_NOTEBOOKS_BY_MARKER`: use +`tutorial_tests` for regular tutorials, `tutorial_tests_fourc` for tutorials requiring 4C, and +`tutorial_tests_remote` for tutorials requiring remote resources. Pytest collection fails if a +notebook has no marker assignment. + ### :four_leaf_clover: Integration tests with 4C -For the integration tests in QUEENS that require the multiphysics simulation framework [4C](https://github.com/4C-multiphysics/4C), the user needs to create a **symbolic link** to the 4C-executable and store it under `/config`: +For the integration tests in QUEENS that require the multiphysics simulation framework [4C](https://github.com/4C-multiphysics/4C), the user needs to create a **symbolic link** to the 4C-executable and store it under `/config`: ``` -ln -s /config/4C_build +ln -s /config/4C_build ``` diff --git a/tests/conftest.py b/tests/conftest.py index ca44b1952..f7bf4dbc7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -25,7 +25,8 @@ from queens.global_settings import GlobalSettings from queens.utils import config_directories from queens.utils.logger_settings import reset_logging -from queens.utils.path import relative_path_from_root +from test_utils.path import relative_path_from_root +from test_utils.tutorial_tests import TUTORIAL_NOTEBOOKS_BY_MARKER _logger = logging.getLogger(__name__) @@ -120,13 +121,22 @@ def pytest_collection_modifyitems(items): # Pytest markers are set individually in each cluster integration test continue elif "integration_tests/" in item.nodeid: + if check_item_for_marker(item, "convergence_tests"): + continue + item.add_marker(pytest.mark.integration_tests) # Add default max_time_for_test if none was set if not check_item_for_marker(item, "max_time_for_test"): item.add_marker(pytest.mark.max_time_for_test(10)) elif "tutorial_tests/" in item.nodeid: - item.add_marker(pytest.mark.tutorial_tests) + + has_tutorial_marker = any( + check_item_for_marker(item, marker_name) + for marker_name in TUTORIAL_NOTEBOOKS_BY_MARKER + ) + if not has_tutorial_marker: + item.add_marker(pytest.mark.tutorial_tests) # Add default max_time_for_test if none was set if not check_item_for_marker(item, "max_time_for_test"): diff --git a/tests/integration_tests/cluster/test_dask_cluster.py b/tests/integration_tests/cluster/test_cluster.py similarity index 64% rename from tests/integration_tests/cluster/test_dask_cluster.py rename to tests/integration_tests/cluster/test_cluster.py index 1c1aaa7df..32e53af00 100644 --- a/tests/integration_tests/cluster/test_dask_cluster.py +++ b/tests/integration_tests/cluster/test_cluster.py @@ -14,7 +14,6 @@ # """Test remote 4C simulations with ensight data-processor.""" -import getpass import json import logging import os @@ -24,8 +23,8 @@ import numpy as np import pytest +from testbook import testbook -import queens.schedulers.cluster as cluster_scheduler # pylint: disable=consider-using-from-import from queens.data_processors.pvd_file import PvdFile from queens.distributions.uniform import Uniform from queens.drivers import Jobscript @@ -34,10 +33,11 @@ from queens.models.simulation import Simulation from queens.parameters.parameters import Parameters from queens.schedulers.cluster import Cluster +from queens.utils.config_directories import experiment_directory from queens.utils.io import load_result -from queens.utils.path import relative_path_from_root from queens.utils.remote_operations import RemoteConnection from test_utils.integration_tests import fourc_build_path_from_home +from test_utils.path import relative_path_from_root _logger = logging.getLogger(__name__) @@ -46,6 +46,8 @@ BRUTEFORCE_CLUSTER_TYPE = "bruteforce" CHARON_CLUSTER_TYPE = "charon" +PYTEST_BASE_DIR_CLUSTER = "~/queens-tests" + @pytest.mark.parametrize( "cluster", @@ -56,101 +58,14 @@ ], indirect=True, ) -class TestDaskCluster: +class TestCluster: """Test class collecting all test with Dask jobqueue clusters and 4C. - NOTE: we use a class here since our fixture are set to autouse, but we only want to call them - for these tests. + NOTE: we use a class here to parametrize each tests with the different clusters. """ - def pytest_base_directory_on_cluster(self): - """Remote directory containing several pytest runs.""" - return "$HOME/queens-tests" - - @pytest.fixture(name="queens_base_directory_on_cluster") - def fixture_queens_base_directory_on_cluster(self, pytest_id): - """Remote directory containing all experiments of a single pytest run. - - This directory is conceptually equivalent to the usual base - directory for non-pytest runs, i.e., production experiments. The - goal is to separate the testing data from production data of the - user. - """ - return self.pytest_base_directory_on_cluster() + f"/{pytest_id}" - - @pytest.fixture(name="mock_experiment_dir", autouse=True) - def fixture_mock_experiment_dir( - self, monkeypatch, cluster_settings, queens_base_directory_on_cluster - ): - """Mock the experiment directory of a test on the cluster. - - NOTE: It is necessary to mock the whole experiment_directory method. - Otherwise, the mock is not loaded properly remote. - This is in contrast to the local mocking where it suffices to mock - config_directories.BASE_DATA_DIR. - Note that we also rely on this local mock here! - """ - - def patch_experiments_directory(experiment_name, experiment_base_directory=None): - """Base directory for all experiments on the computing machine.""" - if experiment_base_directory is None: - experiment_base_directory = Path( - queens_base_directory_on_cluster.replace("$HOME", str(Path.home())) - ) - else: - raise ValueError( - "This mock function does not support specifying 'experiment_base_directory'. " - "It must be called with 'experiment_base_directory=None'." - ) - experiments_dir = experiment_base_directory / experiment_name - return experiments_dir, experiments_dir.exists() - - monkeypatch.setattr(cluster_scheduler, "experiment_directory", patch_experiments_directory) - _logger.debug("Mocking of dask experiment_directory was successful.") - _logger.debug( - "dask experiment_directory is mocked to '%s/' on %s@%s", - queens_base_directory_on_cluster, - cluster_settings["user"], - cluster_settings["host"], - ) - - return patch_experiments_directory - - @pytest.fixture(name="experiment_dir") - def fixture_experiment_dir(self, test_name, remote_connection, mock_experiment_dir): - """Fixture providing the remote experiment directory.""" - experiment_dir, _ = remote_connection.run_function(mock_experiment_dir, test_name, None) - return experiment_dir - - @pytest.fixture(name="_create_experiment_dir") - def fixture_create_experiment_dir(self, remote_connection, experiment_dir): - """Fixture providing the remote experiment directory.""" - - def create_experiment_dir_and_assert_it_exists(): - """Create experiment directory on remote and assert it exists.""" - os.mkdir(experiment_dir) - return experiment_dir.exists() - - assert remote_connection.run_function(create_experiment_dir_and_assert_it_exists) - - @pytest.fixture(name="cluster_kwargs") - def fixture_cluster_kwargs(self, cluster_settings, remote_connection, test_name): - """Keyword arguments to initialize the cluster scheduler.""" - return { - "workload_manager": cluster_settings["workload_manager"], - "walltime": "00:10:00", - "num_jobs": 1, - "min_jobs": 1, - "num_procs": 1, - "num_nodes": 1, - "remote_connection": remote_connection, - "cluster_internal_address": cluster_settings["cluster_internal_address"], - "experiment_name": test_name, - "queue": cluster_settings.get("queue"), - "job_script_prologue": cluster_settings.get("job_script_prologue"), - } - - def test_new_experiment_dir(self, cluster_kwargs, remote_connection, experiment_dir): + @staticmethod + def test_new_experiment_dir(cluster_kwargs, remote_connection, experiment_dir): """Test cluster init when experiment dir does not exist.""" experiment_dir_exists = remote_connection.run_function(experiment_dir.exists) assert not experiment_dir_exists @@ -160,12 +75,14 @@ def test_new_experiment_dir(self, cluster_kwargs, remote_connection, experiment_ experiment_dir_exists = remote_connection.run_function(experiment_dir.exists) assert experiment_dir_exists - def test_overwriting_existing_experiment_dir(self, cluster_kwargs, _create_experiment_dir): + @staticmethod + def test_overwriting_existing_experiment_dir(cluster_kwargs, _create_experiment_dir): """Test cluster init when overwriting experiment dir via flag.""" Cluster(**cluster_kwargs, overwrite_existing_experiment=True) + @staticmethod def test_no_prompt_input_for_existing_experiment_dir( - self, cluster_kwargs, mocker, _create_experiment_dir + cluster_kwargs, mocker, _create_experiment_dir ): """Test cluster init when not overwriting experiment dir via flag. @@ -178,8 +95,9 @@ def test_no_prompt_input_for_existing_experiment_dir( Cluster(**cluster_kwargs, overwrite_existing_experiment=False) assert exit_info.value.code == 1 + @staticmethod def test_empty_prompt_input_for_existing_experiment_dir( - self, cluster_kwargs, mocker, _create_experiment_dir + cluster_kwargs, mocker, _create_experiment_dir ): """Test cluster init when not overwriting experiment dir via flag. @@ -193,9 +111,10 @@ def test_empty_prompt_input_for_existing_experiment_dir( Cluster(**cluster_kwargs, overwrite_existing_experiment=False) assert exit_info.value.code == 1 + @staticmethod @pytest.mark.parametrize("user_input", ["y", "yes"]) def test_y_prompt_input_for_existing_experiment_dir( - self, cluster_kwargs, mocker, user_input, _create_experiment_dir + cluster_kwargs, mocker, user_input, _create_experiment_dir ): """Test cluster init when not overwriting experiment dir via flag. @@ -245,32 +164,30 @@ def experiment_dir_exists_and_contents(experiment_dir): ): assert file_before == file_after + @staticmethod def test_fourc_mc_cluster( - self, third_party_inputs, - cluster_settings, cluster_kwargs, remote_connection, - fourc_cluster_path, + basic_jobscript_kwargs, fourc_example_expected_output, global_settings, tmp_path, ): """Test remote 4C simulations with DASK jobqueue and MC iterator. - Test for remote 4C simulations on a remote cluster in combination - with + Test for remote 4C simulations on a remote cluster in combination with - DASK jobqueue cluster - Monte-Carlo (MC) iterator - - 4C ensight data-processor. + - PVD data processor. Args: third_party_inputs (Path): Path to the 4C input files - cluster_settings (dict): Cluster settings cluster_kwargs (dict): Keyword arguments to initialize the cluster scheduler remote_connection (RemoteConnection): Remote connection object - fourc_cluster_path (Path): paths to 4C executable on the cluster + basic_jobscript_kwargs (dict): Basic keyword arguments to initialize the jobscript + driver that are constant for all cluster tests fourc_example_expected_output (np.ndarray): Expected output for the MC samples global_settings (GlobalSettings): object containing experiment name and tmp_path tmp_path (Path): Temporary path for storing remote data locally @@ -293,10 +210,8 @@ def test_fourc_mc_cluster( driver = Jobscript( parameters=parameters, input_templates=fourc_input_file_template, - jobscript_template=cluster_settings["jobscript_template"], - executable=fourc_cluster_path, data_processor=data_processor, - extra_options={"cluster_script": cluster_settings["cluster_script_path"]}, + **basic_jobscript_kwargs, ) model = Simulation(scheduler=scheduler, driver=driver) iterator = MonteCarlo( @@ -320,7 +235,7 @@ def test_fourc_mc_cluster( scheduler.copy_files_from_experiment_dir(local_data_path) # The remote data has to be deleted before the assertion - self.delete_simulation_data(remote_connection) + delete_old_simulation_data(remote_connection) # assert statements np.testing.assert_array_almost_equal( @@ -342,21 +257,68 @@ def test_fourc_mc_cluster( # The extracted local data should match the expected output np.testing.assert_array_almost_equal(local_data, fourc_example_expected_output, decimal=6) - def delete_simulation_data(self, remote_connection): - """Delete simulation data on the cluster. + @staticmethod + @testbook( + relative_path_from_root( + "tutorials/5_grid_iterator_4c_remote/5_grid_iterator_4c_remote.ipynb" + ), + ) + def test_4c_remote_tutorial( + tb, + tmp_path, + test_name, + basic_jobscript_kwargs, + remote_connection_kwargs, + minimal_cluster_kwargs, + ): + """Test for tutorial 3: Remote 4C simulation with grid iterator. - This approach deletes test simulation data older than seven days - Args: - remote_connection (RemoteConnection): connection to remote cluster. + The notebook is run with injected lines of code to replace + placeholders. It is checked that the replaced dict entries + already exist in the notebook. """ - # Delete data from tests older then 1 week - command = ( - "find " - + str(self.pytest_base_directory_on_cluster()) - + " -mindepth 1 -maxdepth 1 -mtime +7 -type d -exec rm -rv {} \\;" + kwargs_dicts = [basic_jobscript_kwargs, remote_connection_kwargs, minimal_cluster_kwargs] + dict_names = [ + "jobscript_driver_kwargs", + "remote_connection_kwargs", + "cluster_scheduler_kwargs", + ] + + injected_cell = """from pathlib import PosixPath""" + + for kwargs_dict, dict_name in zip(kwargs_dicts, dict_names): + dict_name_injected = f"{dict_name}_injected" + injected_cell += f""" +{dict_name_injected} = {kwargs_dict} +if not {dict_name}.keys() == {dict_name_injected}.keys(): + raise KeyError( + f"The keys of the injected dictionary are not the same as the keys of the " + f"placeholder dictionary in the notebook.\\n" + f"Injected keys: {{{dict_name_injected}.keys()}}\\n" + f"Placeholder keys: {{{dict_name}.keys()}}" + ) +{dict_name} = {dict_name_injected} + """ + + # replace placeholder dicts + tb.inject(injected_cell, after=6, run=False) + # replace experiment name and output dir + tb.inject( + f"experiment_name = {test_name!r}\noutput_dir = {tmp_path!r}", + after=8, + run=False, ) - result = remote_connection.run(command, in_stream=False) - _logger.debug("Deleting old simulation data:\n%s", result.stdout) + # assert expected output + tb.inject( + "np.testing.assert_allclose(max_displacement_magnitude_per_run, " + "[0.17606783, 0.22969808, 0.27944426, 0.22969808, 0.2782447, 0.32395894, 0.27944426, " + "0.32395894, 0.36635981])", + after=14, + run=False, + ) + + # run the notebook + tb.execute() @dataclass(frozen=True) @@ -399,7 +361,6 @@ class ClusterConfig: cluster_script_path=Path("/lnm/share/donottouch.sh"), ) - BRUTEFORCE_CONFIG = ClusterConfig( name="bruteforce", host="bruteforce.lnm.ed.tum.de", @@ -409,6 +370,7 @@ class ClusterConfig: default_python_path="$HOME/anaconda/miniconda/envs/queens/bin/python", cluster_script_path=Path("/lnm/share/donottouch.sh"), ) + CHARON_CONFIG = ClusterConfig( name="charon", host="charon.bauv.unibw-muenchen.de", @@ -427,11 +389,7 @@ class ClusterConfig: } -# CLUSTER TESTS ------------------------------------------------------------------------------------ -@pytest.fixture(name="user", scope="session") -def fixture_user(): - """Name of user calling the test suite.""" - return getpass.getuser() +# CLUSTER TESTS FIXTURES --------------------------------------------------------------------------- @pytest.fixture(name="remote_user", scope="session") @@ -449,6 +407,19 @@ def fixture_gateway(pytestconfig): return gateway +@pytest.fixture(name="remote_python", scope="session") +def fixture_remote_python(pytestconfig): + """Path to the Python environment on remote host.""" + return pytestconfig.getoption("remote_python") + + +@pytest.fixture(name="remote_queens_repository", scope="session") +def fixture_remote_queens_repository(pytestconfig): + """Path to the queens repository on remote host.""" + remote_queens = pytestconfig.getoption("remote_queens_repository", skip=True) + return remote_queens + + @pytest.fixture(name="cluster", scope="session") def fixture_cluster(request): """Name of the cluster to run a test on. @@ -459,44 +430,34 @@ def fixture_cluster(request): return request.param -@pytest.fixture(name="cluster_settings", scope="session") -def fixture_cluster_settings( - cluster, remote_user, gateway, remote_python, remote_queens_repository -): - """All cluster settings.""" - settings = CLUSTER_CONFIGS.get(cluster).dict() - _logger.debug("raw cluster config: %s", settings) - settings["cluster"] = cluster - settings["user"] = remote_user - settings["remote_python"] = remote_python - settings["remote_queens_repository"] = remote_queens_repository - settings["gateway"] = gateway - return settings +@pytest.fixture(name="cluster_config", scope="session") +def fixture_cluster_config(cluster): + """The cluster configuration for the given cluster.""" + config = CLUSTER_CONFIGS.get(cluster).dict() + _logger.debug("Cluster config: %s", config) + return config -@pytest.fixture(name="remote_python", scope="session") -def fixture_remote_python(pytestconfig): - """Path to the Python environment on remote host.""" - return pytestconfig.getoption("remote_python") +@pytest.fixture(name="remote_connection_kwargs", scope="session") +def fixture_remote_connection_kwargs( + cluster_config, remote_user, remote_python, remote_queens_repository, gateway +): + """Keyword arguments to initialize the remote connection.""" + remote_connection_kwargs = { + "host": cluster_config["host"], + "user": remote_user, + "remote_python": remote_python, + "remote_queens_repository": remote_queens_repository, + "gateway": gateway, + } + _logger.debug("Remote connection kwargs: %s", remote_connection_kwargs) + return remote_connection_kwargs @pytest.fixture(name="remote_connection", scope="session") -def fixture_remote_connection(cluster_settings): +def fixture_remote_connection(remote_connection_kwargs): """A fabric connection to a remote host.""" - return RemoteConnection( - host=cluster_settings["host"], - user=cluster_settings["user"], - remote_python=cluster_settings["remote_python"], - remote_queens_repository=cluster_settings["remote_queens_repository"], - gateway=cluster_settings["gateway"], - ) - - -@pytest.fixture(name="remote_queens_repository", scope="session") -def fixture_remote_queens_repository(pytestconfig): - """Path to the queens repository on remote host.""" - remote_queens = pytestconfig.getoption("remote_queens_repository", skip=True) - return remote_queens + return RemoteConnection(**remote_connection_kwargs) @pytest.fixture(name="fourc_cluster_path", scope="session") @@ -515,3 +476,101 @@ def fixture_fourc_cluster_path(remote_connection): Path(find_result.stdout.rstrip()) return fourc + + +@pytest.fixture(name="experiment_base_dir_cluster", scope="session") +def fixture_experiment_base_dir_cluster(pytest_id): + """Remote directory containing all experiments of a single pytest run. + + This directory is conceptually equivalent to the usual base + directory for non-pytest runs, i.e., production experiments. The + goal is to separate the testing data from production data of the + user. + """ + return PYTEST_BASE_DIR_CLUSTER + f"/{pytest_id}" + + +@pytest.fixture(name="experiment_dir") +def fixture_experiment_dir(global_settings, remote_connection, experiment_base_dir_cluster): + """Fixture providing the remote experiment directory.""" + experiment_dir, _ = remote_connection.run_function( + experiment_directory, + global_settings.experiment_name, + experiment_base_dir_cluster, + ) + return experiment_dir + + +@pytest.fixture(name="_create_experiment_dir") +def fixture_create_experiment_dir(remote_connection, experiment_dir): + """Fixture providing the remote experiment directory.""" + + def create_experiment_dir_and_assert_it_exists(): + """Create experiment directory on remote and assert it exists.""" + os.mkdir(experiment_dir) + return experiment_dir.exists() + + assert remote_connection.run_function(create_experiment_dir_and_assert_it_exists) + + +@pytest.fixture(name="minimal_cluster_kwargs", scope="session") +def fixture_minimal_cluster_kwargs(cluster_config, experiment_base_dir_cluster): + """Basic keyword arguments to initialize the cluster scheduler. + + These kwargs are constant for all cluster tests. + """ + return { + "workload_manager": cluster_config["workload_manager"], + "queue": cluster_config.get("queue"), + "cluster_internal_address": cluster_config["cluster_internal_address"], + "experiment_base_dir": experiment_base_dir_cluster, + "job_script_prologue": cluster_config.get("job_script_prologue"), + } + + +@pytest.fixture(name="cluster_kwargs") +def fixture_cluster_kwargs(minimal_cluster_kwargs, remote_connection, test_name): + """Keyword arguments to initialize the cluster scheduler.""" + return minimal_cluster_kwargs | { + "walltime": "00:10:00", + "num_jobs": 1, + "min_jobs": 1, + "num_procs": 1, + "num_nodes": 1, + "remote_connection": remote_connection, + "experiment_name": test_name, + } + + +@pytest.fixture(name="basic_jobscript_kwargs", scope="session") +def fixture_basic_jobscript_kwargs(cluster_config, fourc_cluster_path): + """Basic keyword arguments to initialize the jobscript driver. + + These kwargs are constant for all cluster tests. + """ + return { + "jobscript_template": cluster_config["jobscript_template"], + "executable": fourc_cluster_path, + "extra_options": {"cluster_script": cluster_config["cluster_script_path"]}, + } + + +# CLUSTER TESTS FUNCTIONS -------------------------------------------------------------------------- + + +def delete_old_simulation_data(remote_connection): + """Delete old simulation data on the cluster. + + This approach deletes test simulation data older than seven days. + + Args: + remote_connection (RemoteConnection): connection to remote cluster. + """ + # Delete data from tests older than 1 week + command = ( + "find " + + PYTEST_BASE_DIR_CLUSTER + + " -mindepth 1 -maxdepth 1 -mtime +7 -type d -exec rm -rv {} \\;" + ) + result = remote_connection.run(command, in_stream=False) + _logger.debug("Deleting old simulation data:\n%s", result.stdout) diff --git a/tests/integration_tests/fourc/conftest.py b/tests/integration_tests/fourc/conftest.py index 41484cf33..1a6c3e5e2 100644 --- a/tests/integration_tests/fourc/conftest.py +++ b/tests/integration_tests/fourc/conftest.py @@ -40,6 +40,6 @@ def fixture_setup_symbolic_links_fourc(fourc_link): "4C! \n" "You can create the necessary symbolic link on Linux via:\n" "-------------------------------------------------------------------------\n" - "ln -s /config/4C_build\n" + "ln -s /config/4C_build\n" "-------------------------------------------------------------------------\n" ) from error diff --git a/tests/integration_tests/iterators/test_bmfia.py b/tests/integration_tests/iterators/test_bmfia.py index f9602284c..1901809b6 100644 --- a/tests/integration_tests/iterators/test_bmfia.py +++ b/tests/integration_tests/iterators/test_bmfia.py @@ -277,7 +277,7 @@ def test_bmfia_rpvi_gaussian_neural_network_park91a( nodes_per_hidden_layer_lst=[5, 5], nugget_std=1e-05, num_epochs=1, - optimizer_seed=42, + seed=42, refinement_epochs_decay=0.7, verbosity_on=True, ) @@ -411,7 +411,7 @@ def fixture_expected_variational_cov(): @pytest.fixture(name="expected_variational_mean_nn") def fixture_expected_variational_mean_nn(): """Expected variational mean.""" - exp_var_mean = np.array([0.19221321, 0.33134219]).reshape(-1, 1) + exp_var_mean = np.array([0.5416671, 0.48222166]).reshape(-1, 1) return exp_var_mean @@ -419,5 +419,5 @@ def fixture_expected_variational_mean_nn(): @pytest.fixture(name="expected_variational_cov_nn") def fixture_expected_variational_cov_nn(): """Expected variational covariance.""" - exp_var_cov = np.array([[0.01245263, 0.0], [0.0, 0.01393423]]) + exp_var_cov = np.array([[0.07173655, 0.0], [0.0, 0.08576683]]) return exp_var_cov diff --git a/tests/integration_tests/iterators/test_elementary_effects.py b/tests/integration_tests/iterators/test_elementary_effects.py index b11be2e00..9fc514665 100644 --- a/tests/integration_tests/iterators/test_elementary_effects.py +++ b/tests/integration_tests/iterators/test_elementary_effects.py @@ -75,21 +75,21 @@ def test_elementary_effects_ishigami90(global_settings): results = load_result(global_settings.result_file(".pickle")) _logger.info(results) - assert results["sensitivity_indices"]["mu"][0] == pytest.approx(15.46038594, abs=1e-7) + assert results["sensitivity_indices"]["mu"][0] == pytest.approx(17.68763290, abs=1e-7) assert results["sensitivity_indices"]["mu"][1] == pytest.approx(0.0, abs=1e-7) - assert results["sensitivity_indices"]["mu"][2] == pytest.approx(0.0, abs=1e-7) + assert results["sensitivity_indices"]["mu"][2] == pytest.approx(7.13332892, abs=1e-7) - assert results["sensitivity_indices"]["mu_star"][0] == pytest.approx(15.460385940, abs=1e-7) + assert results["sensitivity_indices"]["mu_star"][0] == pytest.approx(17.68763290, abs=1e-7) assert results["sensitivity_indices"]["mu_star"][1] == pytest.approx(1.47392000, abs=1e-7) - assert results["sensitivity_indices"]["mu_star"][2] == pytest.approx(5.63434321, abs=1e-7) + assert results["sensitivity_indices"]["mu_star"][2] == pytest.approx(7.13332892, abs=1e-7) - assert results["sensitivity_indices"]["sigma"][0] == pytest.approx(15.85512257, abs=1e-7) + assert results["sensitivity_indices"]["sigma"][0] == pytest.approx(18.77919823, abs=1e-7) assert results["sensitivity_indices"]["sigma"][1] == pytest.approx(1.70193622, abs=1e-7) - assert results["sensitivity_indices"]["sigma"][2] == pytest.approx(9.20084394, abs=1e-7) + assert results["sensitivity_indices"]["sigma"][2] == pytest.approx(8.59288836, abs=1e-7) - assert results["sensitivity_indices"]["mu_star_conf"][0] == pytest.approx(13.53414548, abs=1e-7) + assert results["sensitivity_indices"]["mu_star_conf"][0] == pytest.approx(15.77224320, abs=1e-7) assert results["sensitivity_indices"]["mu_star_conf"][1] == pytest.approx(0.0, abs=1e-7) - assert results["sensitivity_indices"]["mu_star_conf"][2] == pytest.approx(5.51108773, abs=1e-7) + assert results["sensitivity_indices"]["mu_star_conf"][2] == pytest.approx(7.31091870, abs=1e-7) def test_elementary_effects_sobol( @@ -157,16 +157,16 @@ def fixture_expected_result_mu(): """Expected Mu result.""" expected_result_mu = np.array( [ - 25.8299150077341, - 19.28297176050532, - -14.092164789704626, - 5.333475971922498, - -11.385141403296364, - 13.970208961715421, - -3.0950202483238303, - 0.6672725255532903, - 7.2385092339309445, - -7.7664016980947075, + -2.601323663226073, + 20.68200584795835, + -7.759411231057245, + 4.7269015243468875, + -20.447764722050515, + 11.587939260262727, + 4.915003189487776, + -0.46675060195474005, + -3.5192417525555633, + -9.817808539704242, ] ) return expected_result_mu @@ -177,16 +177,16 @@ def fixture_expected_result_mu_star(): """Expected Mu star result.""" expected_result_mu_star = np.array( [ - 29.84594504725642, - 21.098173537614855, - 16.4727722348437, - 26.266876218598668, - 16.216603266281044, - 18.051629859410895, - 3.488313966697564, - 2.7128638920479147, - 7.671230484535577, - 10.299932289624746, + 9.58548627110508, + 23.298593393925685, + 13.031380571529553, + 6.551052192131895, + 23.87075909458303, + 13.493005422109425, + 8.636826684475931, + 0.804169417762858, + 3.845539815618292, + 10.185803340670184, ] ) return expected_result_mu_star @@ -197,16 +197,16 @@ def fixture_expected_result_sigma(): """Expected sigma result.""" expected_result_sigma = np.array( [ - 53.88783786787971, - 41.02192670857979, - 29.841807478998156, - 43.33349033575829, - 29.407676882180404, - 31.679653142831512, - 5.241491105224932, - 4.252334015139214, - 10.38274186974731, - 18.83046700807382, + 14.126073686851976, + 44.84025953013619, + 18.830571404935803, + 11.90755387463754, + 40.15919099245428, + 24.661511275785948, + 14.530785408431987, + 1.0111455153120015, + 5.494502535418954, + 17.68875251673258, ] ) return expected_result_sigma diff --git a/tests/integration_tests/iterators/test_hamiltonian_monte_carlo.py b/tests/integration_tests/iterators/test_hamiltonian_monte_carlo.py index 87764db26..5db87298f 100644 --- a/tests/integration_tests/iterators/test_hamiltonian_monte_carlo.py +++ b/tests/integration_tests/iterators/test_hamiltonian_monte_carlo.py @@ -15,7 +15,6 @@ """Integration test for the HMC iterator.""" import numpy as np -import pytest from mock import patch from queens.distributions.normal import Normal @@ -29,6 +28,9 @@ from queens.utils.experimental_data_reader import ExperimentalDataReader from queens.utils.io import load_result +SAMPLER_STAT_RTOL = 1e-5 +SAMPLER_STAT_ATOL = 1e-8 + def test_hamiltonian_monte_carlo_gaussian( tmp_path, @@ -36,7 +38,43 @@ def test_hamiltonian_monte_carlo_gaussian( _create_experimental_data_zero, global_settings, ): - """Test case for hmc iterator.""" + """Test HMC sampling for a Gaussian-Gaussian Bayesian inference problem. + + The test samples from a two-dimensional posterior with Gaussian prior and Gaussian + likelihood. Since both prior and likelihood are Gaussian, the posterior is Gaussian + again. The prior is + + x ~ N(mu_0, Sigma_0), + mu_0 = [-2, 2]^T, + Sigma_0 = [[1, 0], [0, 1]]. + + The likelihood is evaluated at the observed value y = [0, 0]^T with + + y | x ~ N(x, Sigma_L), + Sigma_L = [[1, 1/2], [1/2, 1]]. + + Therefore, + + Sigma_p = (Sigma_0^{-1} + Sigma_L^{-1})^{-1} + = [[7/15, 2/15], [2/15, 7/15]], + + mu_p = Sigma_p (Sigma_0^{-1} mu_0 + Sigma_L^{-1} y) + = Sigma_p mu_0 + = [-2/3, 2/3]^T. + + The converged Markov chain should therefore approximate + + E[x | y] = [-2/3, 2/3]^T, + Var[x | y] = [7/15, 7/15], + Std[x | y] = [sqrt(7/15), sqrt(7/15)]. + + Note: + This behaviour is achieved by patching the Gaussian likelihood model + evaluation and gradient with ``target_density_gaussian_2d_with_grad``. + Instead of evaluating against the experimental data, the likelihood is + replaced by a fixed analytic Gaussian log-density corresponding to the + target distribution described above. + """ # Parameters x1 = Normal(mean=[-2.0, 2.0], covariance=[[1.0, 0.0], [0.0, 1.0]]) parameters = Parameters(x1=x1) @@ -76,7 +114,15 @@ def test_hamiltonian_monte_carlo_gaussian( # Load results results = load_result(global_settings.result_file(".pickle")) - assert results["mean"].mean(axis=0) == pytest.approx( - np.array([0.19363280864587615, -1.1303341362165935]) + np.testing.assert_allclose( + results["mean"].mean(axis=0), + np.array([0.2560446683451819, -1.311343427417079]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, + ) + np.testing.assert_allclose( + results["var"].mean(axis=0), + np.array([0, 0]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, ) - assert results["var"].mean(axis=0) == pytest.approx([0, 0]) diff --git a/tests/integration_tests/iterators/test_latin_hypercube_sampling.py b/tests/integration_tests/iterators/test_latin_hypercube_sampling.py index a54ad7ff5..9267878d3 100644 --- a/tests/integration_tests/iterators/test_latin_hypercube_sampling.py +++ b/tests/integration_tests/iterators/test_latin_hypercube_sampling.py @@ -17,6 +17,7 @@ The test is based on the low-fidelity Borehole function. """ +import numpy as np import pytest from queens.distributions.uniform import Uniform @@ -62,13 +63,36 @@ def test_latin_hypercube_sampling_borehole83(global_settings): # Load results results = load_result(global_settings.result_file(".pickle")) - assert results["mean"] == pytest.approx(62.05240444441511) - assert results["var"] == pytest.approx(1371.7554224384000) + np.testing.assert_allclose(results["mean"], 61.910468085219456, rtol=1e-6, atol=1e-12) + np.testing.assert_allclose(results["var"], 1336.5420586597304, rtol=1e-6, atol=1e-12) @pytest.mark.max_time_for_test(20) def test_latin_hypercube_sampling_branin78(global_settings): - """Test case for latin hyper cube iterator.""" + """Test Latin hypercube sampling for the high-fidelity Branin function. + + The test samples the high-fidelity Branin benchmark function + + f(x_1, x_2) = + (-1.275 x_1^2 / pi^2 + 5 x_1 / pi + x_2 - 6)^2 + + (10 - 5 / (4 pi)) cos(x_1) + 10 + + with independent uniform input distributions + + x_1 ~ U[-5, 10], + x_2 ~ U[0, 15]. + + For these distributions, the exact moments are analytically defined by + + E[f] = 1 / 15^2 int_{-5}^{10} int_0^{15} f(x_1, x_2) dx_2 dx_1 + = 54.3071982719085, + + Var[f] = 1 / 15^2 int_{-5}^{10} int_0^{15} (f(x_1, x_2) - E[f])^2 dx_2 dx_1 + = 2626.687312415944. + + The assertions below check the deterministic sample statistics of the seeded + Latin hypercube run, not the exact distribution moments. + """ # Parameters x1 = Uniform(lower_bound=-5, upper_bound=10) x2 = Uniform(lower_bound=0, upper_bound=15) @@ -94,5 +118,5 @@ def test_latin_hypercube_sampling_branin78(global_settings): # Load results results = load_result(global_settings.result_file(".pickle")) - assert results["mean"] == pytest.approx(53.17279969296224) - assert results["var"] == pytest.approx(2581.6502630157715) + np.testing.assert_allclose(results["mean"], 54.25531895299926, rtol=1e-6, atol=1e-12) + np.testing.assert_allclose(results["var"], 2483.786406285974, rtol=1e-6, atol=1e-12) diff --git a/tests/integration_tests/iterators/test_metropolis_hastings_pymc.py b/tests/integration_tests/iterators/test_metropolis_hastings_pymc.py index 76b5ab4bd..22a7fd830 100644 --- a/tests/integration_tests/iterators/test_metropolis_hastings_pymc.py +++ b/tests/integration_tests/iterators/test_metropolis_hastings_pymc.py @@ -15,7 +15,6 @@ """Integration test for the Metropolis Hastings PyMC iterator.""" import numpy as np -import pytest from mock import patch from example_simulator_functions.gaussian_logpdf import gaussian_2d_logpdf @@ -30,11 +29,50 @@ from queens.utils.experimental_data_reader import ExperimentalDataReader from queens.utils.io import load_result +SAMPLER_STAT_RTOL = 1e-5 +SAMPLER_STAT_ATOL = 1e-8 + def test_metropolis_hastings_pymc_gaussian( tmp_path, _create_experimental_data_zero, global_settings ): - """Test case for mh iterator.""" + """Test MH sampling for a Gaussian-Gaussian Bayesian inference problem. + + The test samples from a two-dimensional posterior with Gaussian prior and Gaussian + likelihood. Since both prior and likelihood are Gaussian, the posterior is Gaussian + again. The prior is + + x ~ N(mu_0, Sigma_0), + mu_0 = [-2, 2]^T, + Sigma_0 = [[1, 0], [0, 1]]. + + The likelihood is evaluated at the observed value y = [0, 0]^T with + + y | x ~ N(x, Sigma_L), + Sigma_L = [[1, 1/2], [1/2, 1]]. + + Therefore, + + Sigma_p = (Sigma_0^{-1} + Sigma_L^{-1})^{-1} + = [[7/15, 2/15], [2/15, 7/15]], + + mu_p = Sigma_p (Sigma_0^{-1} mu_0 + Sigma_L^{-1} y) + = Sigma_p mu_0 + = [-2/3, 2/3]^T. + + The converged Markov chain should therefore approximate + + E[x | y] = [-2/3, 2/3]^T, + Var[x | y] = [7/15, 7/15], + Std[x | y] = [sqrt(7/15), sqrt(7/15)]. + + Note: + This behaviour is achieved by patching the Gaussian likelihood model + evaluation with ``target_density`` below. Instead of evaluating against + the experimental data, the likelihood is replaced by a fixed analytic + Gaussian log-density corresponding to the target distribution described + above. + """ # Parameters x1 = Normal(mean=[-2.0, 2.0], covariance=[[1.0, 0.0], [0.0, 1.0]]) parameters = Parameters(x1=x1) @@ -74,10 +112,18 @@ def test_metropolis_hastings_pymc_gaussian( # Load results results = load_result(global_settings.result_file(".pickle")) - assert results["mean"].mean(axis=0) == pytest.approx( - np.array([-0.5680310153118374, 0.9247536392514567]) + np.testing.assert_allclose( + results["mean"].mean(axis=0), + np.array([-0.3783841506648389, 1.1993237016123788]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, + ) + np.testing.assert_allclose( + results["var"].mean(axis=0), + np.array([0.2750466882590994, 1.2853678554541608]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, ) - assert results["var"].mean(axis=0) == pytest.approx([0.13601070852470507, 0.6672200465857734]) def target_density(self, samples): # pylint: disable=unused-argument diff --git a/tests/integration_tests/iterators/test_nuts.py b/tests/integration_tests/iterators/test_nuts.py index 5fd4107f5..dae1c9e39 100644 --- a/tests/integration_tests/iterators/test_nuts.py +++ b/tests/integration_tests/iterators/test_nuts.py @@ -30,6 +30,9 @@ from queens.utils.experimental_data_reader import ExperimentalDataReader from queens.utils.io import load_result +SAMPLER_STAT_RTOL = 1e-5 +SAMPLER_STAT_ATOL = 1e-8 + def test_nuts_gaussian( tmp_path, @@ -37,7 +40,43 @@ def test_nuts_gaussian( _create_experimental_data, global_settings, ): - """Test case for nuts iterator.""" + """Test NUTS sampling for a Gaussian-Gaussian Bayesian inference problem. + + The test samples from a two-dimensional posterior with Gaussian prior and Gaussian + likelihood. Since both prior and likelihood are Gaussian, the posterior is Gaussian + again. The prior is + + x ~ N(mu_0, Sigma_0), + mu_0 = [-2, 2]^T, + Sigma_0 = [[1, 0], [0, 1]]. + + The likelihood is evaluated at the observed value y = [0, 0]^T with + + y | x ~ N(x, Sigma_L), + Sigma_L = [[1, 1/2], [1/2, 1]]. + + Therefore, + + Sigma_p = (Sigma_0^{-1} + Sigma_L^{-1})^{-1} + = [[7/15, 2/15], [2/15, 7/15]], + + mu_p = Sigma_p (Sigma_0^{-1} mu_0 + Sigma_L^{-1} y) + = Sigma_p mu_0 + = [-2/3, 2/3]^T. + + The converged Markov chain should therefore approximate + + E[x | y] = [-2/3, 2/3]^T, + Var[x | y] = [7/15, 7/15], + Std[x | y] = [sqrt(7/15), sqrt(7/15)]. + + Note: + This behaviour is achieved by patching the Gaussian likelihood model + evaluation and gradient with ``target_density_gaussian_2d_with_grad``. + Instead of evaluating against the experimental data, the likelihood is + replaced by a fixed analytic Gaussian log-density corresponding to the + target distribution described above. + """ # Parameters x1 = Normal(mean=[-2.0, 2.0], covariance=[[1.0, 0.0], [0.0, 1.0]]) parameters = Parameters(x1=x1) @@ -77,10 +116,18 @@ def test_nuts_gaussian( # Load results results = load_result(global_settings.result_file(".pickle")) - assert results["mean"].mean(axis=0) == pytest.approx( - np.array([-0.2868793496608573, 0.6474274597130008]) + np.testing.assert_allclose( + results["mean"].mean(axis=0), + np.array([-1.0964337346677933, 0.9148542463484473]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, + ) + np.testing.assert_allclose( + results["var"].mean(axis=0), + np.array([0.33594238408352364, 1.053294709724648]), + rtol=SAMPLER_STAT_RTOL, + atol=SAMPLER_STAT_ATOL, ) - assert results["var"].mean(axis=0) == pytest.approx([0.08396277217936474, 0.10836256575521087]) @pytest.fixture(name="_create_experimental_data") diff --git a/tests/integration_tests/iterators/test_polynomial_chaos.py b/tests/integration_tests/iterators/test_polynomial_chaos.py index 60f11e420..3fa0484f0 100644 --- a/tests/integration_tests/iterators/test_polynomial_chaos.py +++ b/tests/integration_tests/iterators/test_polynomial_chaos.py @@ -18,13 +18,24 @@ from queens.distributions.uniform import Uniform from queens.drivers.function import Function -from queens.iterators.polynomial_chaos import PolynomialChaos +from queens.iterators.polynomial_chaos import ( + PolynomialChaos, + has_macos_numpoly_reshape_mismatch, +) from queens.main import run_iterator from queens.models.simulation import Simulation from queens.parameters.parameters import Parameters from queens.schedulers.pool import Pool from queens.utils.io import load_result +pytestmark = pytest.mark.skipif( + has_macos_numpoly_reshape_mismatch(), + reason=( + "Skipped on macOS only for the known downstream numpoly/NumPy mismatch: " + "numpoly < 1.3.9 calls numpy.reshape(..., newshape=...), which this NumPy rejects." + ), +) + def test_polynomial_chaos_pseudo_spectral_borehole(global_settings): """Test case for the PC iterator using a pseudo spectral approach.""" diff --git a/tests/integration_tests/iterators/test_rpvi.py b/tests/integration_tests/iterators/test_rpvi.py index e2960a39d..9c810246b 100644 --- a/tests/integration_tests/iterators/test_rpvi.py +++ b/tests/integration_tests/iterators/test_rpvi.py @@ -14,6 +14,9 @@ # """Integration tests for the RPVI iterator.""" +import shlex +import sys + import numpy as np import pandas as pd import pytest @@ -30,7 +33,6 @@ from queens.stochastic_optimizers import Adam from queens.utils.experimental_data_reader import ExperimentalDataReader from queens.utils.io import load_result -from queens.utils.run_subprocess import run_subprocess from queens.variational_distributions import FullRankNormal, MeanFieldNormal @@ -322,8 +324,7 @@ def fixture_write_custom_likelihood_model(module_path): @pytest.fixture(name="python_path") def fixture_python_path(): """Current python path.""" - _, _, stdout, _ = run_subprocess("which python") - return stdout.strip() + return shlex.quote(sys.executable) @pytest.fixture(name="rpvi_jobscript_template", scope="session") diff --git a/tests/integration_tests/iterators/test_sobol_index.py b/tests/integration_tests/iterators/test_sobol_index.py index 61992caec..52bd94df2 100644 --- a/tests/integration_tests/iterators/test_sobol_index.py +++ b/tests/integration_tests/iterators/test_sobol_index.py @@ -500,9 +500,10 @@ def test_sobol_index_gaussian_process_ishigami(global_settings): # Load results results = load_result(global_settings.result_file(".pickle")) - - expected_result_s1 = np.array([0.37365542, 0.49936914, -0.00039217]) - expected_result_s1_conf = np.array([0.14969221, 0.18936135, 0.0280309]) + expected_result_s1 = np.array([0.193787097947826, 0.2675180364120448, 0.19932439995176882]) + expected_result_s1_conf = np.array( + [0.13708917219403513, 0.16267484785491124, 0.1900657850535501] + ) np.testing.assert_allclose(results["sensitivity_indices"]["S1"], expected_result_s1, atol=1e-05) np.testing.assert_allclose( diff --git a/tests/integration_tests/iterators/test_sobol_index_gp_uncertainty.py b/tests/integration_tests/iterators/test_sobol_index_gp_uncertainty.py index 2e4a591f9..eb637855e 100644 --- a/tests/integration_tests/iterators/test_sobol_index_gp_uncertainty.py +++ b/tests/integration_tests/iterators/test_sobol_index_gp_uncertainty.py @@ -93,23 +93,71 @@ def test_sobol_index_gp_uncertainty_ishigami(global_settings): expected_s1 = np.array( [ - [0.30469190, 0.00014149, 0.00005653, 0.00016402, 0.02331390, 0.01473639, 0.02510155], - [0.38996188, 0.00039567, 0.00049108, 0.00003742, 0.03898644, 0.04343343, 0.01198891], - [0.00383826, 0.00030052, 0.00008825, 0.00044747, 0.03397690, 0.01841250, 0.04146019], + [ + 2.97063963e-01, + 1.32172811e-04, + 2.56038695e-05, + 1.93443666e-04, + 2.25330072e-02, + 9.91746996e-03, + 2.72599684e-02, + ], + [ + 4.31449233e-01, + 3.71441195e-04, + 2.00571162e-04, + 3.79370323e-04, + 3.77740130e-02, + 2.77576270e-02, + 3.81750635e-02, + ], + [ + 5.08066819e-03, + 1.64495536e-04, + 9.87514222e-05, + 2.26925997e-04, + 2.51376774e-02, + 1.94768971e-02, + 2.95250211e-02, + ], ] ) - expected_st = np.array( + expected_s2 = np.array( [ - [0.55816767, 0.00050181, 0.00001702, 0.00082728, 0.04390555, 0.00808476, 0.05637328], - [0.50645929, 0.00022282, 0.00022212, 0.00010188, 0.02925636, 0.02921057, 0.01978344], - [0.30344671, 0.00010415, 0.00011769, 0.00004659, 0.02000237, 0.02126261, 0.01337864], + [-0.0559034, 0.00195262, 0.00046626, 0.00267564, 0.08660769, 0.0423217, 0.10138234], + [0.1564238, 0.00096758, 0.00046437, 0.00107588, 0.06096652, 0.04223571, 0.06428802], + [0.02015287, 0.00084594, 0.00046812, 0.00079983, 0.05700563, 0.04240573, 0.05543033], ] ) - expected_s2 = np.array( + expected_st = np.array( [ - [0.00461299, 0.00215561, 0.00006615, 0.00352044, 0.09099820, 0.01594134, 0.11629120], - [0.19526686, 0.00147909, 0.00059668, 0.00169727, 0.07537822, 0.04787620, 0.08074639], - [0.06760761, 0.00004854, 0.00002833, 0.00007491, 0.01365552, 0.01043203, 0.01696364], + [ + 5.34063660e-01, + 6.81003214e-04, + 3.10790784e-04, + 7.27864573e-04, + 5.11472952e-02, + 3.45527133e-02, + 5.28778005e-02, + ], + [ + 5.15767502e-01, + 2.51197174e-04, + 1.61311940e-04, + 2.33854812e-04, + 3.10638632e-02, + 2.48932355e-02, + 2.99723811e-02, + ], + [ + 2.97958247e-01, + 2.80315660e-04, + 1.75633314e-04, + 2.56443896e-04, + 3.28149519e-02, + 2.59747597e-02, + 3.13866001e-02, + ], ] ) @@ -180,7 +228,9 @@ def test_sobol_index_gp_uncertainty_ishigami_third_order(global_settings): results = load_result(global_settings.result_file(".pickle")) expected_s3 = np.array( - [[0.23426643, 0.00801287, 0.00230968, 0.00729179, 0.17544544, 0.09419407, 0.16736517]] + [ + [0.13701495, 0.00729926, 0.00322222, 0.00587944, 0.1674509, 0.11125658, 0.15028514], + ] ) np.testing.assert_allclose(results["third_order"].values, expected_s3, atol=1e-05) @@ -244,19 +294,66 @@ def test_sobol_index_gp_uncertainty_mean_ishigami(global_settings): # Load results results = load_result(global_settings.result_file(".pickle")) - expected_s1 = np.array( [ - [0.28879163, 0.00022986, np.nan, 0.00022986, 0.02971550, np.nan, 0.02971550], - [0.45303182, 0.00000033, np.nan, 0.00000033, 0.00112608, np.nan, 0.00112608], - [0.07601656, 0.00000084, np.nan, 0.00000084, 0.00179415, np.nan, 0.00179415], + [ + 3.21085015e-01, + 6.84428797e-05, + np.nan, + 6.84428797e-05, + 1.62148236e-02, + np.nan, + 1.62148236e-02, + ], + [ + 5.08557775e-01, + 1.58781059e-03, + np.nan, + 1.58781059e-03, + 7.80993532e-02, + np.nan, + 7.80993532e-02, + ], + [ + 5.48899186e-02, + 9.71093479e-05, + np.nan, + 9.71093479e-05, + 1.93142839e-02, + np.nan, + 1.93142839e-02, + ], ] ) expected_st = np.array( [ - [0.47333086, 0.00093263, np.nan, 0.00093263, 0.05985535, np.nan, 0.05985535], - [0.48403078, 0.00000185, np.nan, 0.00000185, 0.00266341, np.nan, 0.00266341], - [0.23926036, 0.00003290, np.nan, 0.00003290, 0.01124253, np.nan, 0.01124253], + [ + 4.99688577e-01, + 5.86983409e-04, + np.nan, + 5.86983409e-04, + 4.74854988e-02, + np.nan, + 4.74854988e-02, + ], + [ + 5.40964137e-01, + 2.17464690e-04, + np.nan, + 2.17464690e-04, + 2.89029696e-02, + np.nan, + 2.89029696e-02, + ], + [ + 2.63508722e-01, + 4.39817083e-05, + np.nan, + 4.39817083e-05, + 1.29982276e-02, + np.nan, + 1.29982276e-02, + ], ] ) diff --git a/tests/integration_tests/models/test_gaussian_neural_network.py b/tests/integration_tests/models/test_gaussian_neural_network.py index 9c8168416..37978cf4c 100644 --- a/tests/integration_tests/models/test_gaussian_neural_network.py +++ b/tests/integration_tests/models/test_gaussian_neural_network.py @@ -33,7 +33,7 @@ def fixture_my_model(): adams_training_rate=0.001, batch_size=50, num_epochs=3000, - optimizer_seed=42, + seed=42, data_scaling="standard_scaler", nugget_std=1.0e-02, verbosity_on=False, @@ -41,31 +41,155 @@ def fixture_my_model(): return model -def test_gaussian_neural_network_one_dim(my_model): +X_TEST_ONE_DIM = np.linspace(-5, 5, 20).reshape(-1, 1) + + +def _one_dim_converged_reference_values(): + """Reference values for the converged one-dimensional sine test.""" + mean_ref, gradient_mean_ref = gradient_sinus_test_fun(X_TEST_ONE_DIM) + var_ref = np.zeros(mean_ref.shape) + gradient_variance_ref = np.zeros(gradient_mean_ref.shape) + + return mean_ref, var_ref, gradient_mean_ref, gradient_variance_ref + + +def _one_dim_trained_reference_values(): + """Reference values for the regular one-dimensional integration test.""" + mean_ref = np.array( + [ + [1.05701616], + [0.91936273], + [0.69505582], + [0.28266456], + [-0.23943175], + [-0.69876824], + [-0.96818476], + [-0.96579658], + [-0.71190977], + [-0.26098673], + [0.26902289], + [0.70484324], + [0.96753779], + [0.96312091], + [0.69956277], + [0.24406864], + [-0.27454099], + [-0.72444972], + [-0.96964804], + [-0.9596871], + ] + ) + var_ref = np.array( + [ + [2.41518859e-03], + [1.81828461e-03], + [1.17050295e-03], + [5.85351970e-04], + [2.77973113e-04], + [1.52831862e-04], + [9.70890580e-05], + [7.15952948e-05], + [6.14416636e-05], + [5.74559826e-05], + [5.57975187e-05], + [5.50417619e-05], + [5.46976234e-05], + [5.45183656e-05], + [5.44144290e-05], + [5.43489094e-05], + [5.43056093e-05], + [5.42796753e-05], + [5.42634170e-05], + [5.42580518e-05], + ] + ) + gradient_mean_ref = np.array( + [ + [-0.21565741], + [-0.32315805], + [-0.56097067], + [-1.01188688], + [-0.95944631], + [-0.73350695], + [-0.23375639], + [0.24355919], + [0.73050255], + [0.94720195], + [0.96924751], + [0.79680802], + [0.21733357], + [-0.24895149], + [-0.74798671], + [-0.96806014], + [-0.95030714], + [-0.71774647], + [-0.22157872], + [0.19674541], + ] + ) + + gradient_variance_ref = np.array( + [ + [-1.04206286e-03], + [-1.20268649e-03], + [-1.23064309e-03], + [-8.95813142e-04], + [-3.57500360e-04], + [-1.50596134e-04], + [-7.30025367e-05], + [-2.97073841e-05], + [-1.16857120e-05], + [-4.58430637e-06], + [-2.10000706e-06], + [-9.23209819e-07], + [-4.54364139e-07], + [-2.54516917e-07], + [-1.49894128e-07], + [-1.02965997e-07], + [-6.36046574e-08], + [-3.75338863e-08], + [-2.20058965e-08], + [-2.47589079e-09], + ] + ) + + return mean_ref, var_ref, gradient_mean_ref, gradient_variance_ref + + +@pytest.mark.parametrize( + ("n_train", "reference_values", "decimals"), + [ + pytest.param( + 25, _one_dim_trained_reference_values(), (2, 2, 2, 1), id="integration-reference" + ), + pytest.param( + 1000, + _one_dim_converged_reference_values(), + (2, 4, 0, 8), + marks=pytest.mark.convergence_tests, + id="convergence-reference", + ), + ], +) +def test_gaussian_neural_network_one_dim(my_model, n_train, reference_values, decimals): """Test one dimensional gaussian nn.""" - n_train = 25 x_train = np.linspace(-5, 5, n_train).reshape(-1, 1) y_train = sinus_test_fun(x_train) my_model.setup(x_train, y_train) my_model.train() - # evaluate the testing/benchmark function at testing inputs - x_test = np.linspace(-5, 5, 200).reshape(-1, 1) - mean_ref, gradient_mean_ref = gradient_sinus_test_fun(x_test) - var_ref = np.zeros(mean_ref.shape) + x_test = X_TEST_ONE_DIM + mean_ref, var_ref, gradient_mean_ref, gradient_variance_ref = reference_values # --- get the mean and variance of the model (no gradient call here) --- output = my_model.predict(x_test) - assert_surrogate_model_output(output, mean_ref, var_ref) + assert_surrogate_model_output(output, mean_ref, var_ref, decimals=decimals) # -- now call the gradient function of the model--- output = my_model.predict(x_test, gradient_bool=True) - - gradient_variance_ref = np.zeros(gradient_mean_ref.shape) - decimals = (1, 2, 1, 2) assert_surrogate_model_output( - output, mean_ref, var_ref, gradient_mean_ref, gradient_variance_ref, decimals + output, mean_ref, var_ref, gradient_mean_ref, gradient_variance_ref, decimals=decimals ) diff --git a/tests/integration_tests/models/test_logpdf_gaussian_process.py b/tests/integration_tests/models/test_logpdf_gaussian_process.py index 8ff5a07f9..b2a892189 100644 --- a/tests/integration_tests/models/test_logpdf_gaussian_process.py +++ b/tests/integration_tests/models/test_logpdf_gaussian_process.py @@ -161,5 +161,10 @@ def test_logpdf_gaussian_process_park91a( mean = np.average(particles, weights=weights, axis=0) std = np.average((particles - mean) ** 2, weights=weights, axis=0) ** (1 / 2) - np.testing.assert_allclose(mean, expected_mean[approx_type], rtol=5e-2) + if approx_type == "GPMAP-I": + # Keep the Ubuntu reference while allowing the observed macOS/JAX variation. + np.testing.assert_allclose(mean[0], expected_mean[approx_type][0], rtol=5e-2) + np.testing.assert_allclose(mean[1], expected_mean[approx_type][1], rtol=1.6e-1) + else: + np.testing.assert_allclose(mean, expected_mean[approx_type], rtol=5e-2) np.testing.assert_allclose(std, expected_std[approx_type], rtol=5e-1) diff --git a/tests/integration_tests/readme_example/test_readme_example.py b/tests/integration_tests/readme_example/test_readme_example.py index 81e0f91ce..7c33b7a6c 100644 --- a/tests/integration_tests/readme_example/test_readme_example.py +++ b/tests/integration_tests/readme_example/test_readme_example.py @@ -14,7 +14,10 @@ # """Test the readme QUEENS example.""" -from queens.utils.run_subprocess import run_subprocess +import os +import subprocess +import sys + from test_utils.get_queens_example_from_readme import get_queens_example_from_readme @@ -32,9 +35,18 @@ def test_readme_example(tmp_path): script_path.write_text(example_source) # Run the script - process_returncode, _, _, _ = run_subprocess( - f"python {script_path}", raise_error_on_subprocess_failure=False + environment = os.environ.copy() + environment["MPLCONFIGDIR"] = str(tmp_path / "matplotlib") + process = subprocess.run( + [sys.executable, str(script_path)], + check=False, + capture_output=True, + env=environment, + text=True, ) - # Check for an exit code - assert not process_returncode + assert process.returncode == 0, ( + f"README example failed with exit code {process.returncode}.\n" + f"stdout:\n{process.stdout}\n" + f"stderr:\n{process.stderr}" + ) diff --git a/tests/tutorial_tests/test_1_grid_iterator_rosenbrock.py b/tests/tutorial_tests/test_1_grid_iterator_rosenbrock.py index dbc510f94..aeb2cc948 100644 --- a/tests/tutorial_tests/test_1_grid_iterator_rosenbrock.py +++ b/tests/tutorial_tests/test_1_grid_iterator_rosenbrock.py @@ -17,26 +17,30 @@ import numpy as np from testbook import testbook -from test_utils.tutorial_tests import inject_mock_base_dir +from test_utils.path import relative_path_from_root +from test_utils.tutorial_tests import inject_mock_base_dir, markers_for_notebook + +NOTEBOOK_PATH = relative_path_from_root("tutorials/1_grid_iterator_rosenbrock.ipynb") + +pytestmark = markers_for_notebook(NOTEBOOK_PATH) @testbook( - "tutorials/1_grid_iterator_rosenbrock.ipynb", + NOTEBOOK_PATH, ) def test_output_tutorial_1(tb, tmp_path): """Parameterized test case for tutorial 1: Grid Iterator Rosenbrock. - The notebook is run with injected lines of codes for testing - that the final results are as expected. + The notebook is run with injected lines of codes for testing that + the final results are as expected. """ optimal_fun = 2.957935e-11 optimal_x = np.array([0.99999463, 0.99998915]).tolist() - # inject testing cells tb.inject( - """np.testing.assert_allclose(X1, X1_QUEENS) -np.testing.assert_allclose(X2, X2_QUEENS) -np.testing.assert_allclose(Z, Z_QUEENS)""", + "np.testing.assert_allclose(X1, X1_QUEENS)\n" + "np.testing.assert_allclose(X2, X2_QUEENS)\n" + "np.testing.assert_allclose(Z, Z_QUEENS)", after=28, run=False, ) diff --git a/tests/tutorial_tests/test_2_uncertainty_propagation_and_quantification.py b/tests/tutorial_tests/test_2_uncertainty_propagation_and_quantification.py index 233668da3..a8419ccf6 100644 --- a/tests/tutorial_tests/test_2_uncertainty_propagation_and_quantification.py +++ b/tests/tutorial_tests/test_2_uncertainty_propagation_and_quantification.py @@ -17,18 +17,26 @@ import numpy as np from testbook import testbook -from test_utils.tutorial_tests import inject_mock_base_dir +from test_utils.path import relative_path_from_root +from test_utils.tutorial_tests import inject_mock_base_dir, markers_for_notebook + +NOTEBOOK_PATH = relative_path_from_root( + "tutorials/2_uncertainty_propagation_and_quantification.ipynb" +) + +pytestmark = markers_for_notebook(NOTEBOOK_PATH) @testbook( - "tutorials/2_uncertainty_propagation_and_quantification.ipynb", + NOTEBOOK_PATH, timeout=-1, ) def test_output_tutorial_2(tb, tmp_path): - """Parameterized test case for tutorial 2: Uncertainty Propagation and Quantification. + """Parameterized test case for tutorial 2. - The notebook is run with injected lines of codes for testing - that the final results are as expected. + The tutorial is on Uncertainty Propagation and Quantification. The + notebook is run with injected lines of codes for testing that the + final results are as expected. """ mu = np.array([0.006638095218949362, 0.0063343892089076466, 0.0021987605285805315]).tolist() x = np.array([0.203125, 0.5, 0.796875]).tolist() diff --git a/tests/tutorial_tests/test_tutorials.py b/tests/tutorial_tests/test_tutorials.py index 3c562aef4..5670e0a04 100644 --- a/tests/tutorial_tests/test_tutorials.py +++ b/tests/tutorial_tests/test_tutorials.py @@ -19,19 +19,30 @@ import pytest from testbook import testbook -from test_utils.tutorial_tests import inject_mock_base_dir +from test_utils.tutorial_tests import ( + ALL_TUTORIAL_NOTEBOOKS, + _validate_tutorial_notebook_markers, + inject_mock_base_dir, + inject_notebook_execution_context, + notebook_param, +) + +_validate_tutorial_notebook_markers() +TUTORIAL_NOTEBOOKS_WITH_DEDICATED_TESTS = { + path.stem.removeprefix("test_") + for path in Path("tests/tutorial_tests").glob("test_*.py") + if path.name != Path(__file__).name +} -# tested jupyter notebooks should be added to the list below + +# Notebooks with dedicated output assertions are collected in their own test modules. @pytest.mark.parametrize( "paths_to_tutorial_notebooks", [ - str(patch) - for patch in sorted(Path("tutorials").glob("*.ipynb")) - if patch.stem - not in { - t.stem.removeprefix("test_") for t in Path("tests/tutorial_tests").glob("test_*.py") - } + notebook_param(path) + for path in ALL_TUTORIAL_NOTEBOOKS + if Path(path).stem not in TUTORIAL_NOTEBOOKS_WITH_DEDICATED_TESTS ], ) def test_notebooks(tmp_path, paths_to_tutorial_notebooks): @@ -41,6 +52,9 @@ def test_notebooks(tmp_path, paths_to_tutorial_notebooks): any errors/assertions. """ with testbook(paths_to_tutorial_notebooks, timeout=-1) as tb: + notebook_dir = Path(paths_to_tutorial_notebooks).resolve().parent + inject_notebook_execution_context(tb, notebook_dir) + # Patch base_directory to avoid writing test data to user's home dir. # Note that tb.patch converts the mocked Path to a string, so we have to use tb.inject. inject_mock_base_dir(tb, tmp_path) diff --git a/tests/unit_tests/data_processors/test_csv_file.py b/tests/unit_tests/data_processors/test_csv_file.py index c86142bfe..55188194a 100644 --- a/tests/unit_tests/data_processors/test_csv_file.py +++ b/tests/unit_tests/data_processors/test_csv_file.py @@ -322,6 +322,18 @@ def test_filter_by_target_values(default_data_processor, default_raw_data): np.testing.assert_allclose(expected_data, processed_data) +def test_filter_by_target_values_no_value_within_tolerance( + default_data_processor, default_raw_data +): + """Test filter by target values without an index value within tol.""" + default_data_processor.filter_type = "by_target_values" + default_data_processor.filter_target_values = [0.07] + default_data_processor.filter_tol = 1e-3 + + with pytest.raises(RuntimeError, match="No index values found within tolerance"): + default_data_processor.filter_and_manipulate_raw_data(default_raw_data) + + def test_filter_by_row_index(default_data_processor, default_raw_data): """Test filter by row index.""" default_data_processor.filter_type = "by_row_index" diff --git a/tests/unit_tests/data_processors/test_txt_file.py b/tests/unit_tests/data_processors/test_txt_file.py index 49550b9bd..d732f3e9b 100644 --- a/tests/unit_tests/data_processors/test_txt_file.py +++ b/tests/unit_tests/data_processors/test_txt_file.py @@ -17,7 +17,7 @@ import pytest from queens.data_processors.txt_file import TxtFile -from queens.utils.path import relative_path_from_root +from test_utils.path import relative_path_from_root @pytest.fixture(name="dummy_txt_file", scope="session") diff --git a/tests/unit_tests/distributions/test_lognormal.py b/tests/unit_tests/distributions/test_lognormal.py index aa80928e1..faa0d8d1e 100644 --- a/tests/unit_tests/distributions/test_lognormal.py +++ b/tests/unit_tests/distributions/test_lognormal.py @@ -212,7 +212,6 @@ def test_cdf_lognormal_2d(lognormal_2d, mean_2d, covariance_2d, sample_pos_2d): ref_sol = scipy.stats.lognorm.cdf( sample_pos_2d[:, 0], scale=np.exp(mean_2d[0]), s=std[0] ) * scipy.stats.lognorm.cdf(sample_pos_2d[:, 1], scale=np.exp(mean_2d[1]), s=std[1]) - ref_sol[ref_sol == 0] = np.nan # Queens Log Normal is not defined for <=0. np.testing.assert_allclose(lognormal_2d.cdf(sample_pos_2d), ref_sol) diff --git a/tests/unit_tests/distributions/test_truncated_normal.py b/tests/unit_tests/distributions/test_truncated_normal.py new file mode 100644 index 000000000..a5760ca43 --- /dev/null +++ b/tests/unit_tests/distributions/test_truncated_normal.py @@ -0,0 +1,173 @@ +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2024-2025, QUEENS contributors. +# +# This file is part of QUEENS. +# +# QUEENS is free software: you can redistribute it and/or modify it under the terms of the GNU +# Lesser General Public License as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. QUEENS is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You +# should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, +# see . +# +"""Test-module for truncated normal distribution.""" + +import numpy as np +import pytest +import scipy.stats + +from queens.distributions.truncated_normal import TruncatedNormal + + +@pytest.fixture(name="sample_pos", params=[0.25, [0.1, 0.25, 0.4, 0.5]]) +def fixture_sample_pos(request): + """Sample position to be evaluated.""" + return np.array(request.param) + + +@pytest.fixture(name="normal_mean", scope="module") +def fixture_normal_mean(): + """Mean of the underlying normal distribution.""" + return 0.3 + + +@pytest.fixture(name="normal_std", scope="module") +def fixture_normal_std(): + """Standard deviation of the underlying normal distribution.""" + return 0.05 + + +@pytest.fixture(name="lower_bound", scope="module") +def fixture_lower_bound(): + """Lower bound of the distribution.""" + return 0.1 + + +@pytest.fixture(name="upper_bound", scope="module") +def fixture_upper_bound(): + """Upper bound of the distribution.""" + return 0.45 + + +@pytest.fixture(name="truncated_normal", scope="module") +def fixture_truncated_normal(normal_mean, normal_std, lower_bound, upper_bound): + """A truncated normal distribution.""" + return TruncatedNormal( + unbounded_mean=normal_mean, + unbounded_std=normal_std, + lower_bound=lower_bound, + upper_bound=upper_bound, + ) + + +@pytest.fixture(name="scipy_reference", scope="module") +def fixture_scipy_reference(normal_mean, normal_std, lower_bound, upper_bound): + """Reference scipy frozen truncnorm for comparison.""" + a = (lower_bound - normal_mean) / normal_std + b = (upper_bound - normal_mean) / normal_std + return scipy.stats.truncnorm(a, b, loc=normal_mean, scale=normal_std) + + +# ----------------------------------------------------------------------- +# ---------------------------- TESTS ------------------------------------ +# ----------------------------------------------------------------------- + + +def test_init_truncated_normal( + truncated_normal, normal_mean, normal_std, lower_bound, upper_bound, scipy_reference +): + """Test init method of TruncatedNormal distribution class.""" + assert truncated_normal.dimension == 1 + np.testing.assert_equal(truncated_normal.unbounded_mean, np.array(normal_mean).reshape(-1)) + np.testing.assert_equal(truncated_normal.unbounded_std, np.array(normal_std).reshape(-1)) + np.testing.assert_equal(truncated_normal.lower_bound, np.array(lower_bound).reshape(-1)) + np.testing.assert_equal(truncated_normal.upper_bound, np.array(upper_bound).reshape(-1)) + np.testing.assert_equal(truncated_normal.mean, scipy_reference.mean()) + np.testing.assert_equal(truncated_normal.covariance, scipy_reference.var()) + + +def test_init_truncated_normal_wrong_interval(normal_mean, normal_std): + """Test init with lower bound greater than upper bound.""" + with pytest.raises(ValueError, match=r"Lower bound must be smaller than upper bound*"): + TruncatedNormal( + unbounded_mean=normal_mean, + unbounded_std=normal_std, + lower_bound=0.5, + upper_bound=0.1, + ) + + +def test_init_truncated_normal_negative_std(normal_mean, lower_bound, upper_bound): + """Test init with non-positive std.""" + with pytest.raises(ValueError, match=r"The parameter \'unbounded_std\' has to be positive.*"): + TruncatedNormal( + unbounded_mean=normal_mean, + unbounded_std=-0.1, + lower_bound=lower_bound, + upper_bound=upper_bound, + ) + + +def test_init_truncated_normal_multivariate(normal_std, lower_bound, upper_bound): + """Test init with multivariate mean raises NotImplementedError.""" + with pytest.raises(NotImplementedError, match=r"Only one-dimensional*"): + TruncatedNormal( + unbounded_mean=[0.3, 0.4], + unbounded_std=normal_std, + lower_bound=lower_bound, + upper_bound=upper_bound, + ) + + +def test_cdf_truncated_normal(truncated_normal, sample_pos, scipy_reference): + """Test cdf method of truncated normal distribution class.""" + ref_sol = scipy_reference.cdf(sample_pos).reshape(-1) + np.testing.assert_equal(truncated_normal.cdf(sample_pos), ref_sol) + + +def test_draw_truncated_normal(truncated_normal, mocker): + """Test the draw method of truncated normal distribution.""" + sample = np.asarray(0.3).reshape(1, 1) + mocker.patch("scipy.stats._distn_infrastructure.rv_frozen.rvs", return_value=sample) + draw = truncated_normal.draw() + np.testing.assert_equal(draw, sample) + + +def test_logpdf_truncated_normal(truncated_normal, sample_pos, scipy_reference): + """Test logpdf method of truncated normal distribution class.""" + ref_sol = scipy_reference.logpdf(sample_pos).reshape(-1) + np.testing.assert_equal(truncated_normal.logpdf(sample_pos), ref_sol) + + +def test_pdf_truncated_normal(truncated_normal, sample_pos, scipy_reference): + """Test pdf method of truncated normal distribution class.""" + ref_sol = scipy_reference.pdf(sample_pos).reshape(-1) + np.testing.assert_equal(truncated_normal.pdf(sample_pos), ref_sol) + + +def test_grad_logpdf_truncated_normal(truncated_normal, normal_mean, normal_std, sample_pos): + """Test grad_logpdf against analytical formula -(x - mean) / std**2.""" + x = np.asarray(sample_pos).reshape(-1) + ref_sol = (normal_mean - x) / normal_std**2 + np.testing.assert_allclose(truncated_normal.grad_logpdf(sample_pos), ref_sol) + + +def test_grad_logpdf_matches_numerical(truncated_normal): + """Test grad_logpdf matches numerical differentiation of logpdf.""" + eps = 1e-6 + for xi in (0.2, 0.3, 0.4): + numerical = ( + truncated_normal.logpdf(np.array([xi + eps]))[0] + - truncated_normal.logpdf(np.array([xi - eps]))[0] + ) / (2 * eps) + analytical = truncated_normal.grad_logpdf(np.array([xi]))[0] + np.testing.assert_allclose(analytical, numerical, rtol=1e-5) + + +def test_ppf_truncated_normal(truncated_normal, scipy_reference): + """Test ppf method of truncated normal distribution class.""" + quantile = 0.5 + ref_sol = scipy_reference.ppf(quantile).reshape(-1) + np.testing.assert_equal(truncated_normal.ppf(quantile), ref_sol) diff --git a/tests/unit_tests/drivers/test_jobscript.py b/tests/unit_tests/drivers/test_jobscript.py index 8924dae86..33427573f 100644 --- a/tests/unit_tests/drivers/test_jobscript.py +++ b/tests/unit_tests/drivers/test_jobscript.py @@ -323,6 +323,28 @@ def test_nonzero_exit_code( ) +def test_nonzero_exit_code_includes_jobscript_log(parameters, input_template, job_options): + """Test that failed jobscript errors include the redirected log.""" + jobscript_driver = Jobscript( + parameters=parameters, + input_templates=input_template, + jobscript_template='echo "jobscript failed"; exit 1', + executable="", + raise_error_on_jobscript_failure=True, + ) + sample_dict = parameters.sample_as_dict(np.array([1, 2])) + sample = np.array(list(sample_dict.values())) + + with pytest.raises(SubprocessError, match="jobscript failed"): + jobscript_driver.run( + sample=sample, + job_id=job_options.job_id, + num_procs=job_options.num_procs, + experiment_dir=job_options.experiment_dir, + experiment_name=job_options.experiment_name, + ) + + def test_long_jobscript_template_str(parameters, input_template): """Test that a long jobscript template string does not raise an error.""" long_str = "dummy" * 100 diff --git a/tests/unit_tests/iterators/test_elementary_effects.py b/tests/unit_tests/iterators/test_elementary_effects.py index 92e40eb20..99ef4792c 100644 --- a/tests/unit_tests/iterators/test_elementary_effects.py +++ b/tests/unit_tests/iterators/test_elementary_effects.py @@ -49,22 +49,22 @@ def test_correct_sampling(default_elementary_effects_iterator): ref_vals = np.array( [ - [-1.04719755, 3.14159265, 3.14159265], - [3.14159265, 3.14159265, 3.14159265], - [3.14159265, 3.14159265, -1.04719755], - [3.14159265, -1.04719755, -1.04719755], - [-3.14159265, -1.04719755, -3.14159265], - [-3.14159265, 3.14159265, -3.14159265], - [-3.14159265, 3.14159265, 1.04719755], - [1.04719755, 3.14159265, 1.04719755], - [-3.14159265, -3.14159265, 1.04719755], - [-3.14159265, -3.14159265, -3.14159265], - [-3.14159265, 1.04719755, -3.14159265], - [1.04719755, 1.04719755, -3.14159265], - [3.14159265, 1.04719755, 3.14159265], - [3.14159265, -3.14159265, 3.14159265], + [1.04719755, -1.04719755, 3.14159265], + [1.04719755, 3.14159265, 3.14159265], + [-3.14159265, 3.14159265, 3.14159265], + [-3.14159265, 3.14159265, -1.04719755], + [3.14159265, -3.14159265, -3.14159265], + [3.14159265, 1.04719755, -3.14159265], + [-1.04719755, 1.04719755, -3.14159265], + [-1.04719755, 1.04719755, 1.04719755], [-1.04719755, -3.14159265, 3.14159265], - [-1.04719755, -3.14159265, -1.04719755], + [3.14159265, -3.14159265, 3.14159265], + [3.14159265, -3.14159265, -1.04719755], + [3.14159265, 1.04719755, -1.04719755], + [1.04719755, 1.04719755, 3.14159265], + [1.04719755, -3.14159265, 3.14159265], + [-3.14159265, -3.14159265, 3.14159265], + [-3.14159265, -3.14159265, -1.04719755], ] ) @@ -77,10 +77,12 @@ def test_correct_sensitivity_indices(default_elementary_effects_iterator): default_elementary_effects_iterator.core_run() si = default_elementary_effects_iterator.si - ref_mu = np.array([10.82845216, 0.0, -3.12439805]) - ref_mu_star = np.array([10.82845216, 7.87500000, 3.12439805]) - ref_mu_star_conf = np.array([5.49677290, 0.0, 5.26474752]) - ref_sigma = np.array([6.24879610, 9.09326673, 6.24879610]) + ref_mu = np.array([13.952850214926777, 3.9375000000003153, 3.1243980516682517]) + ref_mu_star = np.array([13.952850214926777, 7.875000000000625, 3.124398051669744]) + ref_mu_star_conf = np.array( + [6.8719813972395294e-15, 3.0060819460414646e-15, 5.3587332489494415] + ) + ref_sigma = np.array([3.24316904e-15, 7.87500000e00, 6.24879610e00]) np.testing.assert_allclose(si["mu"], ref_mu, 1e-07, 1e-07) np.testing.assert_allclose(si["mu_star"], ref_mu_star, 1e-07, 1e-07) diff --git a/tests/unit_tests/iterators/test_latin_hypercube_sampling.py b/tests/unit_tests/iterators/test_latin_hypercube_sampling.py index aebbf884f..3818211c6 100644 --- a/tests/unit_tests/iterators/test_latin_hypercube_sampling.py +++ b/tests/unit_tests/iterators/test_latin_hypercube_sampling.py @@ -42,30 +42,49 @@ def fixture_default_lhs_iterator( return my_iterator +@pytest.fixture(name="ref_lhs_result_iterator") +def fixture_ref_lhs_result_iterator(): + """Reference results for the default LHS iterator.""" + return np.array( + [ + [0.5401856501906925], + [4.305418063074407], + [6.218626875992211], + [-7.341084114985484], + [6.2263184418260975], + [5.992809151839016], + [8.676959923988381], + [2.187257549384814], + [6.521135693744268], + [6.0112492830277136], + ] + ) + + def test_correct_sampling(default_lhs_iterator): """Test if we get correct samples.""" # np.set_printoptions(precision=10) default_lhs_iterator.pre_run() # check if mean and std match - means_ref = np.array([-1.4546056001e-03, 5.4735307403e-03, 2.1664850171e00]) + means_ref = np.array([3.5708636985e-04, 9.4366122545e-03, 2.2065845877e00]) np.testing.assert_allclose( np.mean(default_lhs_iterator.samples, axis=0), means_ref, 1e-09, 1e-09 ) - std_ref = np.array([1.8157451781, 1.9914892803, 2.4282341125]) + std_ref = np.array([1.8152930704, 1.9637665236, 2.6752150172]) np.testing.assert_allclose(np.std(default_lhs_iterator.samples, axis=0), std_ref, 1e-09, 1e-09) # check if samples are identical too - ref_sample_first_row = np.array([-2.7374616292, -0.6146554017, 1.3925529817]) + ref_sample_first_row = np.array([-1.9557761949, 0.5130876432, 1.2407952238]) np.testing.assert_allclose( default_lhs_iterator.samples[0, :], ref_sample_first_row, 1e-07, 1e-07 ) -def test_correct_results(default_lhs_iterator, ref_result_iterator): +def test_correct_results(default_lhs_iterator, ref_lhs_result_iterator): """Test if we get correct results.""" default_lhs_iterator.pre_run() default_lhs_iterator.core_run() @@ -75,5 +94,5 @@ def test_correct_results(default_lhs_iterator, ref_result_iterator): # check if samples are identical too np.testing.assert_allclose( - default_lhs_iterator.output["result"][0:10], ref_result_iterator, 1e-09, 1e-09 + default_lhs_iterator.output["result"][0:10], ref_lhs_result_iterator, 1e-09, 1e-09 ) diff --git a/tests/unit_tests/utils/test_path_utils.py b/tests/unit_tests/utils/test_path_utils.py index 70aad0765..d7dab8e6c 100644 --- a/tests/unit_tests/utils/test_path_utils.py +++ b/tests/unit_tests/utils/test_path_utils.py @@ -18,19 +18,28 @@ import pytest +import queens from queens.utils.path import ( PATH_TO_QUEENS_SOURCE, - PATH_TO_ROOT, check_if_path_exists, create_folder_if_not_existent, is_empty, relative_path_from_queens_source, - relative_path_from_root, ) +from test_utils.path import PATH_TO_ROOT, relative_path_from_root THIS_PATH = Path(__file__).parent +def _write_pyproject(path, project_name): + """Write a minimal pyproject.toml with the given project name.""" + path.mkdir(parents=True, exist_ok=True) + (path / "pyproject.toml").write_text( + f'[project]\nname = "{project_name}"\n', + encoding="utf-8", + ) + + @pytest.fixture(name="path_to_root") def fixture_path_to_root(): """Path to root.""" @@ -40,7 +49,7 @@ def fixture_path_to_root(): @pytest.fixture(name="path_to_queens_source") def fixture_path_to_queens_source(): """Path to QUEENS source.""" - return THIS_PATH.parents[2] / "src/queens" + return Path(queens.__file__).parent def test_path_to_queens_source(path_to_queens_source): diff --git a/tests/unit_tests/variational_distributions/test_variational_distributions.py b/tests/unit_tests/variational_distributions/test_variational_distributions.py index a1d165fd9..a3c2694d9 100644 --- a/tests/unit_tests/variational_distributions/test_variational_distributions.py +++ b/tests/unit_tests/variational_distributions/test_variational_distributions.py @@ -248,7 +248,7 @@ def fixture_joint_reference_data(mean_field_reference_data, fullrank_reference_d def fixture_mixture_reference_data(mean_field_reference_data): """Reference data for the mixture distribution.""" distribution_1 = mean_field_reference_data.distribution - (mean_1, cov_1) = mean_field_reference_data.distribution_parameters + mean_1, cov_1 = mean_field_reference_data.distribution_parameters variational_parameters_1 = mean_field_reference_data.variational_parameters input_samples = mean_field_reference_data.input_samples diff --git a/tools/dependencies/check_pyproject_dependency_integrity.py b/tools/dependencies/check_pyproject_dependency_integrity.py new file mode 100644 index 000000000..7d6c52f3b --- /dev/null +++ b/tools/dependencies/check_pyproject_dependency_integrity.py @@ -0,0 +1,341 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2024-2025, QUEENS contributors. +# +# This file is part of QUEENS. +# +# QUEENS is free software: you can redistribute it and/or modify it under the terms of the GNU +# Lesser General Public License as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. QUEENS is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You +# should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, +# see . +# +"""Check consistency between PEP-style and pixi dependency declarations.""" + +import argparse +import difflib +import re +import sys +import tomllib +from pathlib import Path +from typing import Any + +META_EXTRA_PATTERN = re.compile(r"^queens\[(?P[A-Za-z0-9_.-]+)\]$") +PACKAGE_NAME_PATTERN = re.compile(r"^\s*([A-Za-z0-9_.-]+)") + + +def _load_pyproject(path: str) -> dict[str, Any]: + """Load pyproject.toml.""" + with Path(path).open("rb") as file: + return tomllib.load(file) + + +def _pixi_dependency_to_pep(name: str, spec: Any) -> str: + """Convert a pixi dependency entry to a PEP-style requirement string.""" + if isinstance(spec, str): + return name if spec in {"", "*"} else f"{name}{spec}" + + if isinstance(spec, dict): + if "git" in spec: + git_url = spec["git"] + if not str(git_url).startswith("git+"): + git_url = f"git+{git_url}" + return f"{name} @ {git_url}" + if "version" in spec: + version_spec = spec["version"] + return name if version_spec in {"", "*"} else f"{name}{version_spec}" + if "path" in spec: + editable = bool(spec.get("editable", False)) + if editable: + return f"{name} @ editable:{spec['path']}" + return f"{name} @ path:{spec['path']}" + + raise ValueError(f"Unsupported pixi dependency format for '{name}': {spec!r}") + + +def _combine_pixi_dependencies( + dependencies: dict[str, Any] | None, pypi_dependencies: dict[str, Any] | None +) -> list[tuple[str, Any]]: + """Combine conda and PyPI pixi dependencies (preserve order).""" + combined: list[tuple[str, Any]] = [] + if dependencies: + combined.extend(dependencies.items()) + if pypi_dependencies: + combined.extend(pypi_dependencies.items()) + return combined + + +def _diff_lines(expected: list[str], actual: list[str], name: str) -> str: + """Create a readable unified diff for two lists.""" + return "\n".join( + difflib.unified_diff( + expected, + actual, + fromfile=f"{name} (PEP)", + tofile=f"{name} (pixi)", + lineterm="", + ) + ) + + +def _extract_requirement_name(requirement: str) -> str: + """Extract the package name from a requirement string.""" + match = PACKAGE_NAME_PATTERN.match(requirement) + if match is None: + raise ValueError(f"Could not extract package name from requirement {requirement!r}") + return match.group(1) + + +def _compare_dependency_lists( + name: str, + pep_dependencies: list[str], + pixi_dependencies: list[tuple[str, Any]], + allowed_version_mismatches: set[str] | None = None, +) -> list[str]: + """Compare PEP dependency list to pixi dependency list.""" + allowed_version_mismatches = allowed_version_mismatches or set() + actual = [ + _pixi_dependency_to_pep(dep_name, dep_spec) for dep_name, dep_spec in pixi_dependencies + ] + + if len(pep_dependencies) != len(actual): + return [f"Dependency mismatch for '{name}':\n{_diff_lines(pep_dependencies, actual, name)}"] + + for index, (pep_requirement, pixi_requirement) in enumerate( + zip(pep_dependencies, actual, strict=True) + ): + pep_name = _extract_requirement_name(pep_requirement) + pixi_name = _extract_requirement_name(pixi_requirement) + if pep_name != pixi_name: + return [ + f"Dependency order/name mismatch for '{name}' at position {index}: " + f"{pep_name!r} != {pixi_name!r}\n{_diff_lines(pep_dependencies, actual, name)}" + ] + if pep_requirement != pixi_requirement and pep_name not in allowed_version_mismatches: + return [ + f"Dependency mismatch for '{name}':\n{_diff_lines(pep_dependencies, actual, name)}" + ] + + return [] + + +def _validate_base_dependencies( + pyproject: dict[str, Any], allowed_version_mismatches: set[str] | None = None +) -> list[str]: + """Validate matching base dependencies between PEP and pixi.""" + error_messages: list[str] = [] + + project = pyproject.get("project", {}) + pixi_base_feature = pyproject.get("tool", {}).get("pixi", {}).get("feature", {}).get("base", {}) + pixi_dependencies = pixi_base_feature.get("dependencies", {}) + pixi_pypi_dependencies = pixi_base_feature.get("pypi-dependencies", {}) + + ordered_conda = list(pixi_dependencies.items()) + + if not ordered_conda: + return ["[tool.pixi.feature.base] is empty; expected at least python and pip."] + + if ordered_conda[0][0] != "python": + error_messages.append( + "The first entry in [tool.pixi.feature.base.dependencies] must be 'python'." + ) + else: + requires_python = project.get("requires-python") + if ordered_conda[0][1] != requires_python: + error_messages.append( + "Mismatch between project.requires-python and " + "tool.pixi.feature.base.dependencies.python: " + f"{requires_python!r} != {ordered_conda[0][1]!r}" + ) + + if len(ordered_conda) < 2 or ordered_conda[1][0] != "pip": + error_messages.append( + "The second entry in [tool.pixi.feature.base.dependencies] must be 'pip'." + ) + + combined = _combine_pixi_dependencies(pixi_dependencies, pixi_pypi_dependencies) + if not combined: + return error_messages + + stripped_combined = [ + (name, spec) for name, spec in combined if name not in {"python", "pip", "queens"} + ] + pep_dependencies = project.get("dependencies", []) + error_messages.extend( + _compare_dependency_lists( + "project.dependencies", + pep_dependencies, + stripped_combined, + allowed_version_mismatches, + ) + ) + + return error_messages + + +def _is_meta_optional_dependency(requirements: list[str]) -> bool: + """Return whether an optional dependency group is a composed meta-extra.""" + return bool(requirements) and all( + META_EXTRA_PATTERN.fullmatch(requirement) for requirement in requirements + ) + + +def _validate_meta_optional_dependency( + name: str, + requirements: list[str], + optional_dependencies: dict[str, list[str]], + pixi_features: dict[str, Any], +) -> list[str]: + """Validate a composed optional dependency such as 'all'.""" + error_messages: list[str] = [] + referenced_extras = [ + match.group("extra") + for requirement in requirements + if (match := META_EXTRA_PATTERN.fullmatch(requirement)) + ] + + for referenced_extra in referenced_extras: + if referenced_extra not in optional_dependencies: + error_messages.append( + f"Meta optional dependency '{name}' references unknown extra '{referenced_extra}'." + ) + if referenced_extra not in pixi_features: + error_messages.append( + f"Meta optional dependency '{name}' references '{referenced_extra}', but no " + f"[tool.pixi.feature.{referenced_extra}] exists." + ) + + return error_messages + + +def _validate_feature_groups( + pyproject: dict[str, Any], allowed_version_mismatches: set[str] | None = None +) -> list[str]: + """Validate dependency groups and optional dependencies against pixi. + + For each dependency group and each optional-depedencies group a pixi + feature with identical requirements should exist. + """ + error_messages: list[str] = [] + pep_names: list[str] = [] + + dependency_groups = pyproject.get("dependency-groups", {}) + optional_dependencies = pyproject.get("project", {}).get("optional-dependencies", {}) + pixi_features = pyproject.get("tool", {}).get("pixi", {}).get("feature", {}) + + for name, pep_dependencies in dependency_groups.items(): + pep_names.append(name) + feature = pixi_features.get(name) + if feature is None: + error_messages.append( + f"Missing [tool.pixi.feature.{name}] for dependency group '{name}'." + ) + continue + pixi_dependencies_combined = _combine_pixi_dependencies( + feature.get("dependencies"), + feature.get("pypi-dependencies"), + ) + error_messages.extend( + _compare_dependency_lists( + f"dependency-groups.{name}", + pep_dependencies, + pixi_dependencies_combined, + allowed_version_mismatches, + ) + ) + + for name, pep_dependencies in optional_dependencies.items(): + if _is_meta_optional_dependency(pep_dependencies): + error_messages.extend( + _validate_meta_optional_dependency( + name, + pep_dependencies, + optional_dependencies, + pixi_features, + ) + ) + continue + + pep_names.append(name) + feature = pixi_features.get(name) + if feature is None: + error_messages.append( + f"Missing [tool.pixi.feature.{name}] for optional dependency group '{name}'." + ) + continue + pixi_dependencies_combined = _combine_pixi_dependencies( + feature.get("dependencies"), + feature.get("pypi-dependencies"), + ) + error_messages.extend( + _compare_dependency_lists( + f"project.optional-dependencies.{name}", + pep_dependencies, + pixi_dependencies_combined, + allowed_version_mismatches, + ) + ) + + # for each feature there should either be a dependency group or an optional dependency group + # except for some special features: + # 1. the base feature is covered by the project.dependencies + special_exception_features: list[str] = ["base"] + for feature_name in pixi_features.keys(): + if feature_name in pep_names or feature_name in special_exception_features: + continue + error_messages.append( + f"Missing either a pep dependency group or optional dependency '{feature_name}' " + f"for the pixi feature [tool.pixi.feature.{feature_name}]." + "" + ) + + return error_messages + + +def main() -> int: + """Validate pyproject.toml integrity.""" + parser = argparse.ArgumentParser( + description="Check consistency between PEP-style and pixi dependency declarations." + ) + parser.add_argument("--path", default="pyproject.toml", help="Path to pyproject.toml") + parser.add_argument( + "--allow-version-mismatch", + action="append", + default=None, + help=( + "Package name for which version mismatches are allowed as long as the package name " + "and position are identical between the PEP and pixi declarations." + ), + ) + args = parser.parse_args() + + try: + pyproject = _load_pyproject(args.path) + except (OSError, tomllib.TOMLDecodeError) as error: + print(f"Failed to load {args.path}: {error}", file=sys.stderr) + return 2 + + allowed_version_mismatches = set(args.allow_version_mismatch or []) + + error_messages = [] + error_messages.extend(_validate_base_dependencies(pyproject, allowed_version_mismatches)) + error_messages.extend(_validate_feature_groups(pyproject, allowed_version_mismatches)) + + if not error_messages: + print( + "Dependency declarations in pyproject.toml are consistent " + "between PEP and pixi sections." + ) + return 0 + + print("Dependency integrity check failed:\n", file=sys.stderr) + for error_message in error_messages: + print(f"- {error_message}\n", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/dependencies/diff_pyproject_dependency_declarations.py b/tools/dependencies/diff_pyproject_dependency_declarations.py new file mode 100644 index 000000000..78328e1e2 --- /dev/null +++ b/tools/dependencies/diff_pyproject_dependency_declarations.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2024-2025, QUEENS contributors. +# +# This file is part of QUEENS. +# +# QUEENS is free software: you can redistribute it and/or modify it under the terms of the GNU +# Lesser General Public License as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. QUEENS is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You +# should have received a copy of the GNU Lesser General Public License along with QUEENS. If not, +# see . +# +"""Diff dependency-related pyproject.toml declarations between two git refs.""" + +import argparse +import difflib +import json +import subprocess +import sys +import tomllib +from typing import Any + + +def _load_pyproject_sections(ref: str, path: str) -> dict[str, Any]: + """Load relevant dependency declarations from a git ref.""" + content = subprocess.check_output(["git", "show", f"{ref}:{path}"], text=False) + parsed = tomllib.loads(content.decode("utf-8")) + return { + "project.dependencies": parsed.get("project", {}).get("dependencies", []), + "dependency-groups": parsed.get("dependency-groups", {}), + "project.optional-dependencies": parsed.get("project", {}).get("optional-dependencies", {}), + "tool.pixi.workspace": parsed.get("tool", {}).get("pixi", {}).get("workspace", {}), + "tool.pixi.dependencies": parsed.get("tool", {}).get("pixi", {}).get("dependencies", {}), + "tool.pixi.pypi-dependencies": parsed.get("tool", {}) + .get("pixi", {}) + .get("pypi-dependencies", {}), + "tool.pixi.feature": parsed.get("tool", {}).get("pixi", {}).get("feature", {}), + } + + +def main() -> int: + """Run the diff and return a status code.""" + parser = argparse.ArgumentParser( + description="Compare dependency-related pyproject.toml declarations between two refs." + ) + parser.add_argument("--base-ref", required=True, help="Base git ref") + parser.add_argument("--head-ref", default="HEAD", help="Head git ref") + parser.add_argument("--path", default="pyproject.toml", help="Path to pyproject.toml") + args = parser.parse_args() + + try: + base_content = _load_pyproject_sections(args.base_ref, args.path) + head_content = _load_pyproject_sections(args.head_ref, args.path) + except subprocess.CalledProcessError as error: + print(error.stderr.decode("utf-8") if error.stderr else str(error), file=sys.stderr) + return 2 + + base_json = json.dumps(base_content, indent=2, sort_keys=True).splitlines() + head_json = json.dumps(head_content, indent=2, sort_keys=True).splitlines() + diff = list( + difflib.unified_diff( + base_json, + head_json, + fromfile=f"{args.base_ref}:{args.path}", + tofile=f"{args.head_ref}:{args.path}", + lineterm="", + ) + ) + + if not diff: + return 0 + + print("\n".join(diff)) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tutorial-requirements.in b/tutorial-requirements.in deleted file mode 100644 index 91de3b7a9..000000000 --- a/tutorial-requirements.in +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains all the requirements for QUEENS Tutorials. - -# Do not fix the version of a package if not strictly necessary. We use pip-tools in order to create a requirements.txt file where the version of the different packages are fixed to the latest stable version w.r.t. QUEENS. From time to time pip-tools is used to upgrade to the newer available versions. - -# Tutorials -scikit-fem -pyvista diff --git a/tutorial-requirements.txt b/tutorial-requirements.txt deleted file mode 100644 index 8b88b0933..000000000 --- a/tutorial-requirements.txt +++ /dev/null @@ -1,107 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --constraint=requirements.txt --output-file=tutorial-requirements.txt tutorial-requirements.in -# -certifi==2024.8.30 - # via - # -c requirements.txt - # requests -charset-normalizer==3.4.0 - # via - # -c requirements.txt - # requests -contourpy==1.3.0 - # via - # -c requirements.txt - # matplotlib -cycler==0.12.1 - # via - # -c requirements.txt - # matplotlib -fonttools==4.54.1 - # via - # -c requirements.txt - # matplotlib -idna==3.10 - # via - # -c requirements.txt - # requests -kiwisolver==1.4.7 - # via - # -c requirements.txt - # matplotlib -matplotlib==3.9.2 - # via - # -c requirements.txt - # pyvista - # vtk -numpy==1.26.4 - # via - # -c requirements.txt - # contourpy - # matplotlib - # pyvista - # scikit-fem - # scipy -packaging==24.1 - # via - # -c requirements.txt - # matplotlib - # pooch -pillow==11.0.0 - # via - # -c requirements.txt - # matplotlib - # pyvista -platformdirs==4.3.6 - # via - # -c requirements.txt - # pooch -pooch==1.8.2 - # via - # -c requirements.txt - # pyvista -pyparsing==3.2.0 - # via - # -c requirements.txt - # matplotlib -python-dateutil==2.9.0.post0 - # via - # -c requirements.txt - # matplotlib -pyvista==0.44.1 - # via - # -c requirements.txt - # -r tutorial-requirements.in -requests==2.32.3 - # via - # -c requirements.txt - # pooch -scikit-fem==11.0.0 - # via -r tutorial-requirements.in -scipy==1.14.1 - # via - # -c requirements.txt - # scikit-fem -scooby==0.10.0 - # via - # -c requirements.txt - # pyvista -six==1.16.0 - # via - # -c requirements.txt - # python-dateutil -typing-extensions==4.12.2 - # via - # -c requirements.txt - # pyvista -urllib3==2.2.3 - # via - # -c requirements.txt - # requests -vtk==9.3.1 - # via - # -c requirements.txt - # pyvista diff --git a/tutorials/2_uncertainty_propagation_and_quantification.ipynb b/tutorials/2_uncertainty_propagation_and_quantification.ipynb index 0ce8d9142..d2376d4df 100644 --- a/tutorials/2_uncertainty_propagation_and_quantification.ipynb +++ b/tutorials/2_uncertainty_propagation_and_quantification.ipynb @@ -477,7 +477,7 @@ " pdf = kde.pdf(u)\n", " pdf[0] = 0\n", " pdf[-1] = 0\n", - " pdf /= np.trapz(pdf, u)\n", + " pdf /= np.trapezoid(pdf, u)\n", " axes[0].plot(mesh.p[0, index[i]], mesh.p[1, index[i]], \"ks\")\n", " c_text = f\"({mesh.p.T[index[i]][0]}, {mesh.p.T[index[i]][1]})\"\n", " axes[0].text(mesh.p[0, index[i]], mesh.p[1, index[i]] + 0.02, c_text, ha=\"center\")\n", diff --git a/tutorials/3_orchestrating_4c_simulations/3_orchestrating_4c_simulations.ipynb b/tutorials/3_orchestrating_4c_simulations/3_orchestrating_4c_simulations.ipynb index 33fb940e7..6b11c296c 100644 --- a/tutorials/3_orchestrating_4c_simulations/3_orchestrating_4c_simulations.ipynb +++ b/tutorials/3_orchestrating_4c_simulations/3_orchestrating_4c_simulations.ipynb @@ -60,13 +60,13 @@ "source": [ "# Define some paths\n", "from pathlib import Path\n", + "import queens.utils.config_directories as config_directories\n", "from tutorials.utils import find_repo_root\n", "\n", - "home = Path.home()\n", "NOTEBOOK_DIR = Path.cwd()\n", "\n", "QUEENS_BASE_DIR = find_repo_root(NOTEBOOK_DIR)\n", - "QUEENS_EXPERIMENTS_DIR = home / \"queens-experiments\"\n", + "QUEENS_EXPERIMENTS_DIR = config_directories.base_directory()\n", "TUTORIAL_DIR = QUEENS_BASE_DIR / \"tutorials\" / \"3_orchestrating_4c_simulations\"" ] }, @@ -145,9 +145,9 @@ "\n", "As mentioned before, for 4C, these are already provided by the QUEENS community.\n", "\n", - "> Note: This tutorial assumes a working local 4C installation. Please create a symbolic link to your 4C build directory and store it under `/config/4C_build` via this command:\n", + "> Note: This tutorial assumes a working local 4C installation. Please create a symbolic link to your 4C build directory and store it under `/config/4C_build` via this command:\n", "> ```\n", - "> ln -s /config/4C_build\n", + "> ln -s /config/4C_build\n", "> ```" ] }, @@ -453,11 +453,13 @@ "n_grid_points_young = 4\n", "n_grid_points_poisson_ratio = 21\n", "\n", + "grid_experiment_name = f\"grid_{n_grid_points_young}x{n_grid_points_poisson_ratio}\"\n", + "\n", "grid_output = None\n", "if __name__ == \"__main__\":\n", " Path(\"grid\").mkdir(exist_ok=True)\n", " with GlobalSettings(\n", - " experiment_name=f\"grid_{n_grid_points_young}x{n_grid_points_poisson_ratio}\",\n", + " experiment_name=grid_experiment_name,\n", " output_dir=\"grid\",\n", " ) as gs:\n", " scheduler = Local(\n", @@ -566,7 +568,7 @@ "\n", "Since we are doing our computations locally, we use a `Local` scheduler. However, there is also a `Cluster` scheduler which is able to submit jobs on high performance clusters using `SLURM`, `PBS` etc.\n", "\n", - "The scheduler also creates the required folder structure for an experiment. The default value is set to `~/queens-experiments/`. For the grid iterator, it looks like this:\n", + "The scheduler also creates the required folder structure for an experiment. The default base directory is given by `config_directories.base_directory()`. For the grid iterator, it looks like this:\n", "```bash\n", "grid_4x21/\n", "├── 0\n", @@ -617,7 +619,7 @@ " for j in range(2):\n", " plotter.subplot(i, j)\n", " job_id = job_ids[i * 2 + j]\n", - " file_path = QUEENS_EXPERIMENTS_DIR / f\"grid_4x21/{job_id}/output/output-vtk-files/structure-00001.pvtu\"\n", + " file_path = QUEENS_EXPERIMENTS_DIR / f\"{grid_experiment_name}/{job_id}/output/output-vtk-files/structure-00001.pvtu\"\n", " plotter.add_text(f\"Job: {job_id}\")\n", " plot_results(file_path, plotter, f\"E={grid_points[job_id][0]}, nu={np.round(grid_points[job_id][1],decimals=4)}: Cauchy stress zz\\n\",)\n", " plotter.show()" diff --git a/tutorials/3_orchestrating_4c_simulations/plot_results.py b/tutorials/3_orchestrating_4c_simulations/plot_results.py index 11a720716..acfdfa87a 100644 --- a/tutorials/3_orchestrating_4c_simulations/plot_results.py +++ b/tutorials/3_orchestrating_4c_simulations/plot_results.py @@ -13,7 +13,10 @@ # see . # """Plotting functions for tutorial 3.""" + import os +from pathlib import Path +from typing import Any, cast os.environ["PYVISTA_OFF_SCREEN"] = "true" os.environ["VTK_DEFAULT_RENDER_WINDOW_OFFSCREEN"] = "1" @@ -21,7 +24,7 @@ import pyvista as pv -fe_mesh = pv.read("beam_coarse.exo") +fe_mesh = cast(pv.DataSet, cast(Any, pv.read(Path(__file__).with_name("beam_coarse.exo")))) def plot_results( diff --git a/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/4_quantifying_uncertainty_due_to_heterogeneous_material_fields.ipynb b/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/4_quantifying_uncertainty_due_to_heterogeneous_material_fields.ipynb index 2e84e48fc..23d943eee 100644 --- a/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/4_quantifying_uncertainty_due_to_heterogeneous_material_fields.ipynb +++ b/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/4_quantifying_uncertainty_due_to_heterogeneous_material_fields.ipynb @@ -111,6 +111,7 @@ "source": [ "# Define some paths\n", "from pathlib import Path\n", + "import queens.utils.config_directories as config_directories\n", "\n", "try:\n", " from tutorials.utils import find_repo_root\n", @@ -121,11 +122,10 @@ " sys.path.insert(0, str(REPO_ROOT))\n", " from tutorials.utils import find_repo_root\n", "\n", - "home = Path.home()\n", "NOTEBOOK_DIR = Path.cwd()\n", "\n", "QUEENS_BASE_DIR = find_repo_root(NOTEBOOK_DIR)\n", - "QUEENS_EXPERIMENTS_DIR = home / \"queens-experiments\"\n", + "QUEENS_EXPERIMENTS_DIR = config_directories.base_directory()\n", "INPUT_DIR = QUEENS_BASE_DIR / \"tests\" / \"input_files\" / \"third_party\" / \"fourc\"" ] }, @@ -212,9 +212,9 @@ "source": [ "As we can see, we set the material parameter to be constant in each element. We can think about this random field as a domain that has some type of defect where the mechanical properties are different.\n", "\n", - "> Note: This tutorial assumes a working local 4C installation. Please create a symbolic link to your 4C build directory and store it under `/config/4C_build` via this command:\n", + "> Note: This tutorial assumes a working local 4C installation. Please create a symbolic link to your 4C build directory and store it under `/config/4C_build` via this command:\n", "> ```\n", - "> ln -s /config/4C_build\n", + "> ln -s /config/4C_build\n", "> ```" ] }, diff --git a/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/plot_input_random_field.py b/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/plot_input_random_field.py index ba7e4e7dc..83c31d42d 100644 --- a/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/plot_input_random_field.py +++ b/tutorials/4_quantifying_uncertainty_due_to_heterogeneous_material_fields/plot_input_random_field.py @@ -13,6 +13,9 @@ # see . # """Plotting functions for tutorial 4.""" + +from typing import Any, cast + import matplotlib.pyplot as plt import numpy as np import pyvista as pv @@ -29,7 +32,7 @@ def plot_field(file_path: str, field: np.ndarray, ax: Axes3D, color_bar_title: s ax: 3D Matplotlib axis to plot into. color_bar_title: Label shown next to the color bar. """ - mesh = pv.read(file_path)[0][0] + mesh = cast(pv.DataSet, cast(Any, pv.read(file_path))[0][0]) mesh.cell_data["field"] = field cell_values = field diff --git a/tutorials/5_grid_iterator_4c_remote/5_grid_iterator_4c_remote.ipynb b/tutorials/5_grid_iterator_4c_remote/5_grid_iterator_4c_remote.ipynb new file mode 100644 index 000000000..3a0946df6 --- /dev/null +++ b/tutorials/5_grid_iterator_4c_remote/5_grid_iterator_4c_remote.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# 5. Remote Computing with 4C\n", + "\n", + "In this tutorial, you will use the `Grid` iterator to probe the response surface of a 4C model.\n", + "The 4C model simulates the uniaxial tensile test of a cube with variable traction forces on one of the surfaces.\n", + "The 4C simulations will run remotely on a cluster. \n", + "\n", + "> **Disclaimer:**\n", + "> You will only be able to execute the following notebook if you have access to a remote computing resource and fill in the placeholders accordingly." + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Set up the remote machine\n", + "\n", + "Remote computing with QUEENS is enabled via SSH port forwarding, so a few initial steps are necessary:\n", + "\n", + "1. Make sure both your local and your remote machine have an SSH key under `~/.ssh/id_rsa.pub`.\n", + " In case either of them does not have one yet, you can generate an SSH key on the respective machine via:\n", + "\n", + " ```bash\n", + " # execute on local or remote machine:\n", + " ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa\n", + " ```\n", + "\n", + "1. Connecting via SSH from the local to the remote machine needs to work without a password. \n", + " Therefore, you need to copy the public key of the local machine to the `authorized_keys` file of the remote machine:\n", + "\n", + " ```bash\n", + " # execute on local machine:\n", + " ssh-copy-id -i ~/.ssh/id_rsa.pub @\n", + " ```\n", + "\n", + "1. To enable passwordless access to the localhost on the remote machine itself, you also need to copy the ssh-key of the remote machine to its `authorized_keys` file:\n", + "\n", + " ```bash\n", + " # execute on remote machine:\n", + " cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys\n", + " ```\n", + "\n", + "> **Troubleshooting**:\n", + "> If you are still asked for your password after these steps, verify that:\n", + "> \n", + "> - The `~/.ssh` directory has permissions `700`.\n", + "> To set the permissions correctly, execute `chmod -R 700 ~/.ssh`.\n", + "> - The home directory on your remote machine has permissions `700`.\n", + "> To set the permissions correctly, execute `chmod 700 ~` on the remote machine.\n", + "\n", + "4. Clone the QUEENS repository on the remote machine.\n", + "\n", + "5. Install the same QUEENS environment that you are using on your local machine also on the remote machine (see [here](https://queens-py.github.io/queens/introduction.html#installation)). You will later have to pass the path to its python executable via `remote_python`.\n", + "\n", + "> **Subclassing**:\n", + "> If you want to run QUEENS remotely with custom classes that inherit from QUEENS objects, you need to ensure that these classes are available in the remote QUEENS environment.\n", + "> You can do this in one of the following ways:\n", + ">\n", + "> 1. *Recommended:* Include the custom classes in the local QUEENS repository. They will be automatically copied to the remote QUEENS repository at the start of the QUEENS runs.\n", + "> 2. Manually synchronize the custom classes between your local and your remote machine, e.g., via an additional repository and installing this repository in the remote QUEENS environment." + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Set up the QUEENS experiment\n", + "\n", + "In the following section, we will set up the QUEENS experiment for cluster usage:\n", + "\n", + "1. To evaluate 4C remotely on a cluster, use a `Jobscript` driver instead of a `Fourc` driver and adjust the paths:\n", + "\n", + " - `input_templates`: The local path to your 4C input template. QUEENS will copy it to the remote machine for you.\n", + " - `jobscript_template`: The local path to your jobscript template. For inspiration, check out our templates under `templates/jobscripts/`.\n", + " - `executable`: The absolute path to the 4C executable on the remote machine." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "jobscript_driver_kwargs = {\n", + " \"jobscript_template\": \"\",\n", + " \"executable\": \"\",\n", + " \"extra_options\": {}, # optional\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "2. Switch to the `Cluster` scheduler and set up a `RemoteConnection` for it:\n", + " - `remote_python`: The absolute path to the Python executable of your QUEENS Python environment on the remote machine.\n", + " You can check your available environments via `conda info --envs`.\n", + " The path typically looks like `/home///envs/queens/bin/python`.\n", + " - `remote_queens_repository`: The absolute path to your QUEENS repository on the remote machine." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "remote_connection_kwargs = {\n", + " \"host\": \"\",\n", + " \"user\": \"\",\n", + " \"remote_python\": \"\", \n", + " \"remote_queens_repository\": \"\",\n", + " \"gateway\": None, # optional\n", + "}\n", + "cluster_scheduler_kwargs = {\n", + " \"workload_manager\": \"\", \n", + " \"queue\": \"\",\n", + " \"cluster_internal_address\": \"\",\n", + " \"experiment_base_dir\": None, # optional\n", + " \"job_script_prologue\": None, # optional list of commands executed before starting a worker\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "### Run the example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "experiment_name = \"grid_iterator_4c_remote\"\n", + "output_dir = \"./\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "from queens.data_processors import PvdFile\n", + "from queens.distributions import Uniform\n", + "from queens.drivers import Jobscript\n", + "from queens.global_settings import GlobalSettings\n", + "from queens.iterators import Grid\n", + "from queens.main import run_iterator\n", + "from queens.models import Simulation\n", + "from queens.parameters.parameters import Parameters\n", + "from queens.schedulers import Cluster\n", + "from queens.utils.remote_operations import RemoteConnection\n", + "from test_utils.path import relative_path_from_root\n", + "\n", + "with GlobalSettings(\n", + " experiment_name=experiment_name, output_dir=output_dir, debug=False\n", + ") as gs:\n", + " # Parameters parameterizing a Neumann BC\n", + " parameter_1 = Uniform(lower_bound=0.0, upper_bound=1.0)\n", + " parameter_2 = Uniform(lower_bound=0.0, upper_bound=1.0)\n", + " parameters = Parameters(parameter_1=parameter_1, parameter_2=parameter_2)\n", + "\n", + " # The data processor extracts the displacement vectors (with x, y, z component) of all nodes at \n", + " # the last time step of the simulation\n", + " data_processor = PvdFile(\n", + " field_name=\"displacement\",\n", + " file_name_identifier=\"*.pvd\",\n", + " file_options_dict={},\n", + " )\n", + "\n", + " # Establish an SSH connection to the cluster\n", + " remote_connection = RemoteConnection(**remote_connection_kwargs) \n", + " \n", + " scheduler = Cluster(\n", + " experiment_name,\n", + " walltime=\"00:10:00\", \n", + " remote_connection=remote_connection, \n", + " num_jobs=9,\n", + " min_jobs=1,\n", + " num_procs=1, \n", + " num_nodes=1,\n", + " **cluster_scheduler_kwargs,\n", + " )\n", + "\n", + " # The driver handles the actual evaluation of 4C\n", + " driver = Jobscript(\n", + " parameters=parameters,\n", + " data_processor=data_processor,\n", + " input_templates=relative_path_from_root(\n", + " \"tutorials/5_grid_iterator_4c_remote/solid_runtime_hex8.4C.yaml\"\n", + " ), \n", + " **jobscript_driver_kwargs,\n", + " )\n", + " \n", + " model = Simulation(scheduler, driver)\n", + " \n", + " # Analysis setup\n", + " grid_design = {\n", + " \"parameter_1\": {\n", + " \"num_grid_points\": 3,\n", + " \"axis_type\": \"lin\",\n", + " \"data_type\": \"FLOAT\",\n", + " },\n", + " \"parameter_2\": {\n", + " \"num_grid_points\": 3,\n", + " \"axis_type\": \"lin\",\n", + " \"data_type\": \"FLOAT\",\n", + " },\n", + " }\n", + " iterator = Grid(\n", + " model,\n", + " parameters,\n", + " global_settings=gs,\n", + " grid_design=grid_design,\n", + " result_description={\"write_results\": True, \"plot_results\": False},\n", + " )\n", + "\n", + " # Run the analysis\n", + " run_iterator(iterator, gs)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Evaluate the results\n", + "\n", + "Look at the results and analyze them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from pathlib import Path\n", + "\n", + "from queens.utils.io import load_result\n", + "\n", + "# Load the results\n", + "result_file = Path(output_dir) / f\"{experiment_name}.pickle\"\n", + "results = load_result(result_file)\n", + "\n", + "# This yields the displacement components (x, y, z) for each of the 9 grid points on each node \n", + "# of each element \n", + "# (Here: 2 elements with 8 nodes each, the output is written for each element individually), \n", + "# so the resulting array is expected to have the shape (9, 16, 3)\n", + "raw_displacements = results[\"raw_output_data\"][\"result\"]\n", + "\n", + "# Compute the displacement magnitudes for each run on each node of each element.\n", + "# The resulting array has shape (9, 16).\n", + "point_wise_displacement_magnitudes = np.sqrt(np.sum(raw_displacements ** 2, axis=-1))\n", + "\n", + "# Finally, we compute the maximum displacement that was achieved in each run.\n", + "# The resulting array has shape (9,).\n", + "max_displacement_magnitude_per_run = np.max(point_wise_displacement_magnitudes, axis=1)\n", + "print(max_displacement_magnitude_per_run)" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## Where do I find all the data on the cluster?\n", + "\n", + "The data is stored -- equivalently to the local runs -- in a folder with the following nomenclature: \n", + "`$HOME/queens-experiments//`\n", + "\n", + "For example, you can find the data of the first simulation of this queens experiment in the folder `$HOME/queens-experiments/grid_iterator_4c_remote/1`\n", + "\n", + "Feel free to take a look around and to find the logged 4C console output of one of the simulations.\n", + "\n", + "> **Hint:**\n", + "> If you would like to copy (parts of) the data from the remote to the local machine, you can use the following command:\n", + ">\n", + "> `scheduler.copy_files_from_experiment_dir()`.\n", + ">\n", + "> Check out its documentation for more details." + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## Lessons learned\n", + "\n", + "You have learned how to run 4C simulations remotely on a cluster:\n", + "\n", + "1. Use a `Jobscript` driver and ensure correct paths to the executables:\n", + " - `path_to_executable` refers to a path on the cluster.\n", + " - `input_template` refers to a local path, making it very easy to adjust the file.\n", + "1. Use a `Cluster` scheduler and supply all necessary options.\n", + "1. The location of the QUEENS data on the cluster is `$HOME/queens-experiments`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "queens", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "nbsphinx": { + "execute": "never" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tutorials/5_grid_iterator_4c_remote/solid_runtime_hex8.4C.yaml b/tutorials/5_grid_iterator_4c_remote/solid_runtime_hex8.4C.yaml new file mode 100644 index 000000000..b9c687c71 --- /dev/null +++ b/tutorials/5_grid_iterator_4c_remote/solid_runtime_hex8.4C.yaml @@ -0,0 +1,79 @@ +TITLE: + - "This is a simple test that tests the extrapolation of stresses from Gauss points to nodes for " + - "a hex8 discretization" +PROBLEM TYPE: + PROBLEMTYPE: "Structure" +IO: + OUTPUT_SPRING: true + STRUCT_STRESS: "Cauchy" + STRUCT_STRAIN: "GL" + VERBOSITY: "Standard" +IO/RUNTIME VTK OUTPUT: + INTERVAL_STEPS: 1 + OUTPUT_DATA_FORMAT: ascii +IO/RUNTIME VTK OUTPUT/STRUCTURE: + OUTPUT_STRUCTURE: true + DISPLACEMENT: true + STRESS_STRAIN: true +SOLVER 1: + SOLVER: "Superlu" + NAME: "Structure_Solver" +STRUCTURAL DYNAMIC: + INT_STRATEGY: "Standard" + DYNAMICTYPE: "Statics" + TIMESTEP: 0.5 + NUMSTEP: 2 + MAXTIME: 1 + TOLDISP: 1e-09 + TOLRES: 1e-09 + LOADLIN: true + LINEAR_SOLVER: 1 +STRUCT NOX/Printing: + Inner Iteration: false + Outer Iteration StatusTest: false +MATERIALS: + - MAT: 1 + MAT_Struct_StVenantKirchhoff: + YOUNG: 100 + NUE: 0 + DENS: 0 +FUNCT1: + - COMPONENT: 0 + SYMBOLIC_FUNCTION_OF_SPACE_TIME: "(1+{{ parameter_1 }}*y+{{ parameter_2 }}*z)*t" +DESIGN SURF NEUMANN CONDITIONS: + - E: 2 + NUMDOF: 3 + ONOFF: [1, 0, 0] + VAL: [10, 0, 0] + FUNCT: [1, 0, 0] +DESIGN SURF DIRICH CONDITIONS: + - E: 1 + NUMDOF: 3 + ONOFF: [1, 1, 1] + VAL: [0, 0, 0] + FUNCT: [0, 0, 0] +DSURF-NODE TOPOLOGY: + - "NODE 3 DSURFACE 1" + - "NODE 1 DSURFACE 1" + - "NODE 4 DSURFACE 1" + - "NODE 2 DSURFACE 1" + - "NODE 10 DSURFACE 2" + - "NODE 12 DSURFACE 2" + - "NODE 9 DSURFACE 2" + - "NODE 11 DSURFACE 2" +NODE COORDS: + - "NODE 1 COORD 0.0 0.0 0.0" + - "NODE 2 COORD 0.0 1.0 0.0" + - "NODE 3 COORD 0.0 0.0 1.0" + - "NODE 4 COORD 0.0 1.0 1.0" + - "NODE 5 COORD 1.0 0.0 0.0" + - "NODE 6 COORD 1.0 1.0 0.0" + - "NODE 7 COORD 1.0 0.0 1.0" + - "NODE 8 COORD 1.0 1.0 1.0" + - "NODE 9 COORD 2.0 0.0 0.0" + - "NODE 10 COORD 2.0 1.0 0.0" + - "NODE 11 COORD 2.0 0.0 1.0" + - "NODE 12 COORD 2.0 1.0 1.0" +STRUCTURE ELEMENTS: + - "1 SOLID HEX8 1 5 6 2 3 7 8 4 MAT 1 KINEM nonlinear" + - "2 SOLID HEX8 5 9 10 6 7 11 12 8 MAT 1 KINEM nonlinear"