diff --git a/.all-contributorsrc b/.all-contributorsrc
deleted file mode 100644
index e5322c45..00000000
--- a/.all-contributorsrc
+++ /dev/null
@@ -1,355 +0,0 @@
-{
- "projectName": "array-api-extra",
- "projectOwner": "data-apis",
- "repoType": "github",
- "repoHost": "https://github.com",
- "files": [
- "README.md",
- "CONTRIBUTORS.md"
- ],
- "imageSize": 100,
- "commitType": "docs",
- "commitConvention": "angular",
- "contributorsPerLine": 7,
- "contributors": [
- {
- "login": "lucascolley",
- "name": "Lucas Colley",
- "avatar_url": "https://avatars.githubusercontent.com/u/51488791?v=4",
- "profile": "https://lucascolley.github.io/",
- "contributions": [
- "code",
- "doc",
- "example",
- "ideas",
- "infra",
- "maintenance",
- "tool",
- "test",
- "bug",
- "platform",
- "review",
- "talk",
- "mentoring"
- ]
- },
- {
- "login": "mdhaber",
- "name": "Matt Haberland",
- "avatar_url": "https://avatars.githubusercontent.com/u/6570539?v=4",
- "profile": "https://github.com/mdhaber",
- "contributions": [
- "code",
- "ideas",
- "test"
- ]
- },
- {
- "login": "j-bowhay",
- "name": "Jake Bowhay",
- "avatar_url": "https://avatars.githubusercontent.com/u/60778417?v=4",
- "profile": "https://github.com/j-bowhay",
- "contributions": [
- "code",
- "review",
- "tool"
- ]
- },
- {
- "login": "asmeurer",
- "name": "Aaron Meurer",
- "avatar_url": "https://avatars.githubusercontent.com/u/71486?v=4",
- "profile": "https://github.com/asmeurer",
- "contributions": [
- "review",
- "ideas",
- "infra"
- ]
- },
- {
- "login": "betatim",
- "name": "Tim Head",
- "avatar_url": "https://avatars.githubusercontent.com/u/1448859?v=4",
- "profile": "https://github.com/betatim",
- "contributions": [
- "ideas"
- ]
- },
- {
- "login": "kgryte",
- "name": "Athan",
- "avatar_url": "https://avatars.githubusercontent.com/u/2643044?v=4",
- "profile": "https://github.com/stdlib-js/stdlib",
- "contributions": [
- "review",
- "ideas"
- ]
- },
- {
- "login": "vnmabus",
- "name": "Carlos Ramos Carreño",
- "avatar_url": "https://avatars.githubusercontent.com/u/2364173?v=4",
- "profile": "https://github.com/vnmabus",
- "contributions": [
- "ideas"
- ]
- },
- {
- "login": "crusaderky",
- "name": "Guido Imperiale",
- "avatar_url": "https://avatars.githubusercontent.com/u/6213168?v=4",
- "profile": "https://github.com/crusaderky",
- "contributions": [
- "code",
- "doc",
- "tool",
- "test",
- "example",
- "bug",
- "ideas",
- "review",
- "maintenance"
- ]
- },
- {
- "login": "jorenham",
- "name": "Joren Hammudoglu",
- "avatar_url": "https://avatars.githubusercontent.com/u/6208662?v=4",
- "profile": "https://github.com/jorenham",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "thomasjpfan",
- "name": "Thomas J. Fan",
- "avatar_url": "https://avatars.githubusercontent.com/u/5402633?v=4",
- "profile": "https://www.thomasjpfan.com/",
- "contributions": [
- "ideas"
- ]
- },
- {
- "login": "izaid",
- "name": "Irwin Zaid",
- "avatar_url": "https://avatars.githubusercontent.com/u/482179?v=4",
- "profile": "https://github.com/izaid",
- "contributions": [
- "ideas"
- ]
- },
- {
- "login": "jakirkham",
- "name": "jakirkham",
- "avatar_url": "https://avatars.githubusercontent.com/u/3019665?v=4",
- "profile": "https://github.com/jakirkham",
- "contributions": [
- "code",
- "review"
- ]
- },
- {
- "login": "tupui",
- "name": "Pamphile Roy",
- "avatar_url": "https://avatars.githubusercontent.com/u/23188539?v=4",
- "profile": "https://github.com/tupui",
- "contributions": [
- "code"
- ]
- },
- {
- "login": "OmarManzoor",
- "name": "Omar Salman",
- "avatar_url": "https://avatars.githubusercontent.com/u/17495884?v=4",
- "profile": "https://github.com/OmarManzoor",
- "contributions": [
- "code",
- "doc",
- "bug",
- "test"
- ]
- },
- {
- "login": "rgommers",
- "name": "Ralf Gommers",
- "avatar_url": "https://avatars.githubusercontent.com/u/98330?v=4",
- "profile": "https://github.com/rgommers/",
- "contributions": [
- "ideas",
- "infra",
- "review"
- ]
- },
- {
- "login": "ogrisel",
- "name": "Olivier Grisel",
- "avatar_url": "https://avatars.githubusercontent.com/u/89061?v=4",
- "profile": "https://ogrisel.com",
- "contributions": [
- "code"
- ]
- },
- {
- "login": "ev-br",
- "name": "Evgeni Burovski",
- "avatar_url": "https://avatars.githubusercontent.com/u/2133832?v=4",
- "profile": "https://github.com/ev-br",
- "contributions": [
- "code",
- "doc"
- ]
- },
- {
- "login": "jakevdp",
- "name": "Jake Vanderplas",
- "avatar_url": "https://avatars.githubusercontent.com/u/781659?v=4",
- "profile": "http://www.vanderplas.com/",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "kotlinisland",
- "name": "kotlinisland",
- "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
- "profile": "https://github.com/KotlinIsland",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "detachhead",
- "name": "detachhead",
- "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
- "profile": "https://github.com/DetachHead",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "NeilGirdhar",
- "name": "Neil Girdhar",
- "avatar_url": "https://avatars.githubusercontent.com/u/730137?v=4",
- "profile": "https://github.com/NeilGirdhar",
- "contributions": [
- "code",
- "test",
- "review"
- ]
- },
- {
- "login": "lithomas1",
- "name": "Thomas Li",
- "avatar_url": "https://avatars.githubusercontent.com/u/47963215?v=4",
- "profile": "https://github.com/lithomas1",
- "contributions": [
- "bug",
- "tool"
- ]
- },
- {
- "login": "pearu",
- "name": "Pearu Peterson",
- "avatar_url": "https://avatars.githubusercontent.com/u/402156?v=4",
- "profile": "https://github.com/pearu",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "paddyroddy",
- "name": "Patrick J. Roddy",
- "avatar_url": "https://avatars.githubusercontent.com/u/15052188?v=4",
- "profile": "https://paddyroddy.github.io/",
- "contributions": [
- "code",
- "doc",
- "example",
- "test"
- ]
- },
- {
- "login": "amacati",
- "name": "Martin Schuck",
- "avatar_url": "https://avatars.githubusercontent.com/u/57562633?v=4",
- "profile": "https://amacati.github.io/",
- "contributions": [
- "ideas"
- ]
- },
- {
- "login": "Enderdead",
- "name": "Gauthier-Clerc François",
- "avatar_url": "https://avatars.githubusercontent.com/u/22777836?v=4",
- "profile": "https://github.com/Enderdead",
- "contributions": [
- "code",
- "test",
- "bug"
- ]
- },
- {
- "login": "adriagarp",
- "name": "Adrián García Pitarch",
- "avatar_url": "https://avatars.githubusercontent.com/u/96059447?v=4",
- "profile": "https://github.com/adriagarp",
- "contributions": [
- "code",
- "test"
- ]
- },
- {
- "login": "cakedev0",
- "name": "Arthur Lacote",
- "avatar_url": "https://avatars.githubusercontent.com/u/25986961?v=4",
- "profile": "https://github.com/cakedev0",
- "contributions": [
- "code",
- "doc",
- "ideas",
- "test"
- ]
- },
- {
- "login": "steppi",
- "name": "Albert Steppi",
- "avatar_url": "https://avatars.githubusercontent.com/u/1953382?v=4",
- "profile": "http://steppi.github.io",
- "contributions": [
- "code",
- "ideas",
- "test"
- ]
- },
- {
- "login": "prady0t",
- "name": "Pradyot Ranjan",
- "avatar_url": "https://avatars.githubusercontent.com/u/99216956?v=4",
- "profile": "https://github.com/prady0t",
- "contributions": [
- "code",
- "doc",
- "ideas",
- "test"
- ]
- },
- {
- "login": "lundybernard",
- "name": "Lundy Bernard",
- "avatar_url": "https://avatars.githubusercontent.com/u/17297695?v=4",
- "profile": "https://github.com/lundybernard",
- "contributions": [
- "review"
- ]
- },
- {
- "login": "Cyril-36",
- "name": "Chaitanya Pudota",
- "avatar_url": "https://avatars.githubusercontent.com/u/138621648?v=4",
- "profile": "https://github.com/Cyril-36",
- "contributions": [
- "code"
- ]
- }
- ]
-}
diff --git a/.dprint.jsonc b/.dprint.jsonc
deleted file mode 100644
index c3642905..00000000
--- a/.dprint.jsonc
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "json": {
- "lineWidth": 100,
- "array.preferSingleLine": true,
- },
- "markdown": {
- "lineWidth": 200,
- "emphasisKind": "asterisks",
- },
- "toml": {
- "lineWidth": 100,
- },
- "yaml": {
- "printWidth": 100,
- "formatComments": true,
- "braceSpacing": false,
- },
- "excludes": ["**/*-lock.json", "**/*.lock", "**/node_modules/", "dist/"],
- "plugins": [
- "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm",
- "https://plugins.dprint.dev/json-0.20.0.wasm",
- "https://plugins.dprint.dev/markdown-0.19.0.wasm",
- "https://plugins.dprint.dev/toml-0.7.0.wasm",
- ],
-}
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 46f23570..00000000
--- a/.editorconfig
+++ /dev/null
@@ -1,14 +0,0 @@
-root = true
-
-[*.{py,md}]
-indent_style = space
-end_of_line = lf
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.py]
-max_line_length = 88
-indent_size = 4
-
-[*.md]
-max_line_length = 80
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 61f1375c..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1,15 +0,0 @@
-# Excluding files from an sdist generated by meson-python
-#########################################################
-
-# Note: when adding to this list, be aware that you need to commit your changes
-# before they take effect (can be confusing during testing)
-
-.github/* export-ignore
-.git* export-ignore
-codecov.yml export-ignore
-pixi.lock export-ignore
-RELEASING.md export-ignore
-renovate.json export-ignore
-
-# GitHub syntax highlighting
-pixi.lock linguist-language=YAML linguist-generated=true
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index 014064f0..00000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
deleted file mode 100644
index e8e35c42..00000000
--- a/.github/workflows/cd.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-name: CD
-
-permissions:
- contents: read
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-on:
- workflow_dispatch:
- pull_request:
- push:
- branches:
- - main
- release:
- types:
- - published
-
-jobs:
- dist:
- name: Create dist
- runs-on: ubuntu-slim
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- fetch-depth: 0
- persist-credentials: false
-
- - uses: hynek/build-and-inspect-python-package@d44ca7d91762de7a7d5436ddae667c6da6d1c3df # v2.18.0
-
- publish:
- name: Publish
- needs: [dist]
- environment: pypi
- permissions:
- id-token: write # for trusted publishing
- attestations: write # for trusted publishing
- contents: read
- runs-on: ubuntu-latest
- if: github.event_name == 'release' && github.event.action == 'published'
-
- steps:
- - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
- with:
- name: Packages
- path: dist
-
- - name: Generate artifact attestation for sdist and wheel
- uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
- with:
- subject-path: "dist/*"
-
- - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 61cfa9ff..00000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: CI
-
-permissions:
- contents: read
-
-on:
- workflow_dispatch:
- pull_request:
- push:
- branches:
- - main
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-env:
- # Many color libraries just need this to be set to any value, but at least
- # one distinguishes color depth, where "3" -> "256-bit color".
- FORCE_COLOR: 3
-
-jobs:
- lint:
- name: Lint
- runs-on: ubuntu-slim
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- fetch-depth: 0
- persist-credentials: false
-
- - uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
- with:
- pixi-version: v0.68.0
- cache: true
- environments: lint
-
- - name: Lint (if this step fails, please 'pixi run lint' locally and push the changes)
- run: pixi run -e lint lint
-
- checks:
- name: Test ${{ matrix.environment }}
- runs-on: ${{ matrix.runs-on }}
- strategy:
- fail-fast: false
- matrix:
- include:
- - environment: tests-py311
- runs-on: ubuntu-latest
- - environment: tests-py314
- runs-on: ubuntu-slim
- - environment: tests-numpy1
- runs-on: ubuntu-slim
- - environment: tests-nogil
- runs-on: ubuntu-slim
- - environment: tests-backends
- runs-on: ubuntu-latest
- - environment: tests-backends-py311
- runs-on: ubuntu-latest
- - environment: tests-run-deps
- runs-on: ubuntu-slim
-
- environment:
- name: ci-checks
- deployment: false
-
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- fetch-depth: 0
- persist-credentials: false
-
- - uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
- with:
- pixi-version: v0.68.0
- cache: true
- environments: ${{ matrix.environment }}
-
- - name: Test package
- # Save some time; also at the moment of writing coverage crashes on python 3.13t
- if: ${{ matrix.environment != 'tests-nogil' && matrix.environment != 'tests-run-deps' }}
- run: pixi run -e "${TASK_ENV}" tests-ci
- env:
- TASK_ENV: ${{ matrix.environment }}
-
- - name: Test free-threading
- if: ${{ matrix.environment == 'tests-nogil' }}
- run: pixi run -e tests-nogil tests --parallel-threads=4
-
- - name: Run dependency tests
- if: ${{ matrix.environment == 'tests-run-deps' }}
- run: pixi run tests-run-deps-cov
-
- - name: Upload coverage report
- if: ${{ matrix.environment != 'tests-nogil' }}
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
deleted file mode 100644
index 85b577c7..00000000
--- a/.github/workflows/docs.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: Docs
-
-on:
- push:
- branches: [main]
- pull_request:
-
-permissions: {}
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-jobs:
- docs-build:
- name: Build
- runs-on: ubuntu-slim
-
- permissions:
- contents: read
-
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- persist-credentials: false
-
- - uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
- with:
- pixi-version: v0.68.0
- cache: true
- environments: docs
-
- - name: Build Docs
- run: pixi run -e docs docs
-
- - name: Upload Artifact
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
- with:
- name: docs-build
- path: docs/build/
-
- docs-deploy:
- name: Deploy
- if: ${{ github.ref == 'refs/heads/main' }}
- needs: docs-build
- runs-on: ubuntu-slim
-
- permissions:
- contents: write # needed for the deploy step
-
- environment:
- name: docs-deploy
-
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- persist-credentials: false
-
- - name: Download Artifact
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
- with:
- name: docs-build
- path: docs/build/
-
- - name: Deploy
- uses: JamesIves/github-pages-deploy-action@d92aa235d04922e8f08b40ce78cc5442fcfbfa2f # v4.8.0
- with:
- folder: docs/build/
- ssh-key: ${{ secrets.DEPLOY_KEY }}
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 0b377833..00000000
--- a/.gitignore
+++ /dev/null
@@ -1,173 +0,0 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-docs/generated/
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-# For a library or package, you might want to ignore these files since the code is
-# intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-# However, in case of collaboration, if having platform-specific dependencies or dependencies
-# having no cross-platform support, pipenv may install dependencies that don't work, or not
-# install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# IDE project settings
-.idea/
-.spyderproject
-.spyproject
-.vscode/
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-# setuptools_scm
-src/*/_version.py
-
-
-# ruff
-.ruff_cache/
-
-# OS specific stuff
-.DS_Store
-.DS_Store?
-._*
-.Spotlight-V100
-.Trashes
-ehthumbs.db
-Thumbs.db
-
-# Common editor files
-*~
-*.swp
-# pixi environments
-.pixi
-*.egg-info
-
-# Vendor tests
-vendor_tests/array_api_compat/
-vendor_tests/array_api_extra/
-
-# all-contributors
-node_modules
-package.json
-yarn.lock
diff --git a/src/array_api_extra/py.typed b/.nojekyll
similarity index 100%
rename from src/array_api_extra/py.typed
rename to .nojekyll
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
deleted file mode 100644
index e00a2e5f..00000000
--- a/CONTRIBUTORS.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Contributors
-
-This project exists thanks to the following contributors
-([emoji key](https://allcontributors.org/docs/en/emoji-key)):
-
-
-
-
-
-
-
-
-
-
-
-We follow the
-[all-contributors](https://github.com/all-contributors/all-contributors)
-specification. Contributions of any kind welcome!
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 45bbb945..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2024 Consortium for Python Data API Standards
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
deleted file mode 100644
index 9b8bc6f6..00000000
--- a/README.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# array-api-extra
-
-[![docs - here!][docs-badge]][docs-link]
-[![PyPI version][pypi-version]][pypi-link]
-[![Conda-Forge][conda-badge]][conda-link]
-[![PyPI platforms][pypi-platforms]][pypi-link]
-[](#contributors)
-
-[](https://pixi.sh)
-[](https://typing.python.org/)
-[](https://codecov.io/github/data-apis/array-api-extra)
-[](https://jacobtomlinson.dev/effver)
-[](https://scientific-python.org/specs/spec-0008/)
-
-
-
-
-
-[actions-badge]: https://github.com/data-apis/array-api-extra/workflows/CI/badge.svg
-[actions-link]: https://github.com/data-apis/array-api-extra/actions
-[conda-badge]: https://img.shields.io/conda/vn/conda-forge/array-api-extra
-[conda-link]: https://github.com/conda-forge/array-api-extra-feedstock
-[github-discussions-badge]: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
-[github-discussions-link]: https://github.com/data-apis/array-api-extra/discussions
-[pypi-link]: https://pypi.org/project/array-api-extra/
-[pypi-platforms]: https://img.shields.io/pypi/pyversions/array-api-extra
-[pypi-version]: https://img.shields.io/pypi/v/array-api-extra
-[docs-badge]: https://img.shields.io/badge/docs-here!-2ea44f
-[docs-link]: https://data-apis.org/array-api-extra/index.html
-
-
-
-Extra array functions built on top of the array API standard.
-
-Used by:
-
-- [SciPy](https://github.com/scipy/scipy) — Fundamental algorithms for
- scientific computing.
-- [scikit-learn](https://github.com/scikit-learn/scikit-learn) — Machine
- Learning in Python.
-- [SysIdentPy](https://github.com/wilsonrljr/sysidentpy) — System Identification Using NARMAX Models.
-- [GLASS](https://github.com/glass-dev/glass) — Generator for Large Scale Structure.
-- *your library? Let us know!*
-
-## Installation
-
-See https://data-apis.org/array-api-extra/#installation.
-
-## Versioning
-
-This project uses [EffVer](https://jacobtomlinson.dev/effver/). TL;DR:
-
-- To bump from version `x.y.z` to `x.(y+1).0` of array-api-extra, expect that
- you may need to put in some work.
-- To bump from version `x.y.z` to `x.y.(z+1)`, any work needed on your side
- should be minimal. Please open an issue if this is not the case!
-
-## Contributors
-
-This project exists thanks to the following contributors
-([emoji key](https://allcontributors.org/docs/en/emoji-key)):
-
-
-
-
-
-
-
-
-
-
-
-We follow the
-[all-contributors](https://github.com/all-contributors/all-contributors)
-specification. Contributions of any kind welcome!
diff --git a/RELEASING.md b/RELEASING.md
deleted file mode 100644
index c2de866c..00000000
--- a/RELEASING.md
+++ /dev/null
@@ -1,7 +0,0 @@
-1. Update the version in `pyproject.toml`, `meson.build`, and `src/array_api_extra/__init__.py`.
-2. Update the lockfile with `pixi update`.
-3. Push your changes to a PR, fix any CI failures, and merge to `main`.
-4. Cut a release via the GitHub GUI.
-5. Update the version to `{next micro version}.dev0` in `pyproject.toml`, `meson.build`, and `src/array_api_extra/__init__.py`.
-6. Push your changes to a PR and merge to `main`.
-7. Merge the automated PR to `conda-forge/array-api-extra-feedstock`.
diff --git a/docs/api-assorted.md b/_sources/api-assorted.md.txt
similarity index 100%
rename from docs/api-assorted.md
rename to _sources/api-assorted.md.txt
diff --git a/docs/api-lazy.md b/_sources/api-lazy.md.txt
similarity index 100%
rename from docs/api-lazy.md
rename to _sources/api-lazy.md.txt
diff --git a/docs/api-testing.md b/_sources/api-testing.md.txt
similarity index 100%
rename from docs/api-testing.md
rename to _sources/api-testing.md.txt
diff --git a/docs/contributing.md b/_sources/contributing.md.txt
similarity index 100%
rename from docs/contributing.md
rename to _sources/contributing.md.txt
diff --git a/docs/contributors.md b/_sources/contributors.md.txt
similarity index 100%
rename from docs/contributors.md
rename to _sources/contributors.md.txt
diff --git a/_sources/generated/array_api_extra.angle.rst.txt b/_sources/generated/array_api_extra.angle.rst.txt
new file mode 100644
index 00000000..0291bb05
--- /dev/null
+++ b/_sources/generated/array_api_extra.angle.rst.txt
@@ -0,0 +1,6 @@
+angle
+=====
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.angle
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.apply_where.rst.txt b/_sources/generated/array_api_extra.apply_where.rst.txt
new file mode 100644
index 00000000..d9bd1dbe
--- /dev/null
+++ b/_sources/generated/array_api_extra.apply_where.rst.txt
@@ -0,0 +1,6 @@
+apply\_where
+============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.apply_where
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.argpartition.rst.txt b/_sources/generated/array_api_extra.argpartition.rst.txt
new file mode 100644
index 00000000..6f1bbac2
--- /dev/null
+++ b/_sources/generated/array_api_extra.argpartition.rst.txt
@@ -0,0 +1,6 @@
+argpartition
+============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.argpartition
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.at.rst.txt b/_sources/generated/array_api_extra.at.rst.txt
new file mode 100644
index 00000000..cd9ef411
--- /dev/null
+++ b/_sources/generated/array_api_extra.at.rst.txt
@@ -0,0 +1,6 @@
+at
+==
+
+.. currentmodule:: array_api_extra
+
+.. autoclass:: array_api_extra.at
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.atleast_nd.rst.txt b/_sources/generated/array_api_extra.atleast_nd.rst.txt
new file mode 100644
index 00000000..f927f882
--- /dev/null
+++ b/_sources/generated/array_api_extra.atleast_nd.rst.txt
@@ -0,0 +1,6 @@
+atleast\_nd
+===========
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.atleast_nd
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.broadcast_shapes.rst.txt b/_sources/generated/array_api_extra.broadcast_shapes.rst.txt
new file mode 100644
index 00000000..5bc93c7e
--- /dev/null
+++ b/_sources/generated/array_api_extra.broadcast_shapes.rst.txt
@@ -0,0 +1,6 @@
+broadcast\_shapes
+=================
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.broadcast_shapes
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.cov.rst.txt b/_sources/generated/array_api_extra.cov.rst.txt
new file mode 100644
index 00000000..96f76ae4
--- /dev/null
+++ b/_sources/generated/array_api_extra.cov.rst.txt
@@ -0,0 +1,6 @@
+cov
+===
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.cov
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.create_diagonal.rst.txt b/_sources/generated/array_api_extra.create_diagonal.rst.txt
new file mode 100644
index 00000000..1105f390
--- /dev/null
+++ b/_sources/generated/array_api_extra.create_diagonal.rst.txt
@@ -0,0 +1,6 @@
+create\_diagonal
+================
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.create_diagonal
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.default_dtype.rst.txt b/_sources/generated/array_api_extra.default_dtype.rst.txt
new file mode 100644
index 00000000..f24e64aa
--- /dev/null
+++ b/_sources/generated/array_api_extra.default_dtype.rst.txt
@@ -0,0 +1,6 @@
+default\_dtype
+==============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.default_dtype
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.expand_dims.rst.txt b/_sources/generated/array_api_extra.expand_dims.rst.txt
new file mode 100644
index 00000000..bbe61215
--- /dev/null
+++ b/_sources/generated/array_api_extra.expand_dims.rst.txt
@@ -0,0 +1,6 @@
+expand\_dims
+============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.expand_dims
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.isclose.rst.txt b/_sources/generated/array_api_extra.isclose.rst.txt
new file mode 100644
index 00000000..48ea6128
--- /dev/null
+++ b/_sources/generated/array_api_extra.isclose.rst.txt
@@ -0,0 +1,6 @@
+isclose
+=======
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.isclose
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.isin.rst.txt b/_sources/generated/array_api_extra.isin.rst.txt
new file mode 100644
index 00000000..29141ba1
--- /dev/null
+++ b/_sources/generated/array_api_extra.isin.rst.txt
@@ -0,0 +1,6 @@
+isin
+====
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.isin
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.kron.rst.txt b/_sources/generated/array_api_extra.kron.rst.txt
new file mode 100644
index 00000000..4461cd2c
--- /dev/null
+++ b/_sources/generated/array_api_extra.kron.rst.txt
@@ -0,0 +1,6 @@
+kron
+====
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.kron
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.lazy_apply.rst.txt b/_sources/generated/array_api_extra.lazy_apply.rst.txt
new file mode 100644
index 00000000..9868a490
--- /dev/null
+++ b/_sources/generated/array_api_extra.lazy_apply.rst.txt
@@ -0,0 +1,6 @@
+lazy\_apply
+===========
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.lazy_apply
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.nan_to_num.rst.txt b/_sources/generated/array_api_extra.nan_to_num.rst.txt
new file mode 100644
index 00000000..6957c421
--- /dev/null
+++ b/_sources/generated/array_api_extra.nan_to_num.rst.txt
@@ -0,0 +1,6 @@
+nan\_to\_num
+============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.nan_to_num
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.nunique.rst.txt b/_sources/generated/array_api_extra.nunique.rst.txt
new file mode 100644
index 00000000..ab2dbece
--- /dev/null
+++ b/_sources/generated/array_api_extra.nunique.rst.txt
@@ -0,0 +1,6 @@
+nunique
+=======
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.nunique
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.one_hot.rst.txt b/_sources/generated/array_api_extra.one_hot.rst.txt
new file mode 100644
index 00000000..e83de86c
--- /dev/null
+++ b/_sources/generated/array_api_extra.one_hot.rst.txt
@@ -0,0 +1,6 @@
+one\_hot
+========
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.one_hot
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.pad.rst.txt b/_sources/generated/array_api_extra.pad.rst.txt
new file mode 100644
index 00000000..fcb8cc51
--- /dev/null
+++ b/_sources/generated/array_api_extra.pad.rst.txt
@@ -0,0 +1,6 @@
+pad
+===
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.pad
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.partition.rst.txt b/_sources/generated/array_api_extra.partition.rst.txt
new file mode 100644
index 00000000..28a72621
--- /dev/null
+++ b/_sources/generated/array_api_extra.partition.rst.txt
@@ -0,0 +1,6 @@
+partition
+=========
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.partition
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.searchsorted.rst.txt b/_sources/generated/array_api_extra.searchsorted.rst.txt
new file mode 100644
index 00000000..32048784
--- /dev/null
+++ b/_sources/generated/array_api_extra.searchsorted.rst.txt
@@ -0,0 +1,6 @@
+searchsorted
+============
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.searchsorted
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.setdiff1d.rst.txt b/_sources/generated/array_api_extra.setdiff1d.rst.txt
new file mode 100644
index 00000000..07f26d8f
--- /dev/null
+++ b/_sources/generated/array_api_extra.setdiff1d.rst.txt
@@ -0,0 +1,6 @@
+setdiff1d
+=========
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.setdiff1d
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.sinc.rst.txt b/_sources/generated/array_api_extra.sinc.rst.txt
new file mode 100644
index 00000000..bd9dc1e3
--- /dev/null
+++ b/_sources/generated/array_api_extra.sinc.rst.txt
@@ -0,0 +1,6 @@
+sinc
+====
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.sinc
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.assert_close.rst.txt b/_sources/generated/array_api_extra.testing.assert_close.rst.txt
new file mode 100644
index 00000000..0439ed58
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.assert_close.rst.txt
@@ -0,0 +1,6 @@
+testing.assert\_close
+=====================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.assert_close
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.assert_close_nulp.rst.txt b/_sources/generated/array_api_extra.testing.assert_close_nulp.rst.txt
new file mode 100644
index 00000000..890c72ed
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.assert_close_nulp.rst.txt
@@ -0,0 +1,6 @@
+testing.assert\_close\_nulp
+===========================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.assert_close_nulp
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.assert_equal.rst.txt b/_sources/generated/array_api_extra.testing.assert_equal.rst.txt
new file mode 100644
index 00000000..8a212389
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.assert_equal.rst.txt
@@ -0,0 +1,6 @@
+testing.assert\_equal
+=====================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.assert_equal
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.assert_less.rst.txt b/_sources/generated/array_api_extra.testing.assert_less.rst.txt
new file mode 100644
index 00000000..3cbb6241
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.assert_less.rst.txt
@@ -0,0 +1,6 @@
+testing.assert\_less
+====================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.assert_less
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.lazy_xp_function.rst.txt b/_sources/generated/array_api_extra.testing.lazy_xp_function.rst.txt
new file mode 100644
index 00000000..31898d20
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.lazy_xp_function.rst.txt
@@ -0,0 +1,6 @@
+testing.lazy\_xp\_function
+==========================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.lazy_xp_function
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.testing.patch_lazy_xp_functions.rst.txt b/_sources/generated/array_api_extra.testing.patch_lazy_xp_functions.rst.txt
new file mode 100644
index 00000000..04c8b052
--- /dev/null
+++ b/_sources/generated/array_api_extra.testing.patch_lazy_xp_functions.rst.txt
@@ -0,0 +1,6 @@
+testing.patch\_lazy\_xp\_functions
+==================================
+
+.. currentmodule:: array_api_extra.testing
+
+.. autofunction:: array_api_extra.testing.patch_lazy_xp_functions
\ No newline at end of file
diff --git a/_sources/generated/array_api_extra.union1d.rst.txt b/_sources/generated/array_api_extra.union1d.rst.txt
new file mode 100644
index 00000000..3619e098
--- /dev/null
+++ b/_sources/generated/array_api_extra.union1d.rst.txt
@@ -0,0 +1,6 @@
+union1d
+=======
+
+.. currentmodule:: array_api_extra
+
+.. autofunction:: array_api_extra.union1d
\ No newline at end of file
diff --git a/docs/index.md b/_sources/index.md.txt
similarity index 100%
rename from docs/index.md
rename to _sources/index.md.txt
diff --git a/_static/base-stemmer.js b/_static/base-stemmer.js
new file mode 100644
index 00000000..e6fa0c49
--- /dev/null
+++ b/_static/base-stemmer.js
@@ -0,0 +1,476 @@
+// @ts-check
+
+/**@constructor*/
+BaseStemmer = function() {
+ /** @protected */
+ this.current = '';
+ this.cursor = 0;
+ this.limit = 0;
+ this.limit_backward = 0;
+ this.bra = 0;
+ this.ket = 0;
+
+ /**
+ * @param {string} value
+ */
+ this.setCurrent = function(value) {
+ this.current = value;
+ this.cursor = 0;
+ this.limit = this.current.length;
+ this.limit_backward = 0;
+ this.bra = this.cursor;
+ this.ket = this.limit;
+ };
+
+ /**
+ * @return {string}
+ */
+ this.getCurrent = function() {
+ return this.current;
+ };
+
+ /**
+ * @param {BaseStemmer} other
+ */
+ this.copy_from = function(other) {
+ /** @protected */
+ this.current = other.current;
+ this.cursor = other.cursor;
+ this.limit = other.limit;
+ this.limit_backward = other.limit_backward;
+ this.bra = other.bra;
+ this.ket = other.ket;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.in_grouping = function(s, min, max) {
+ /** @protected */
+ if (this.cursor >= this.limit) return false;
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch > max || ch < min) return false;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+ this.cursor++;
+ return true;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.go_in_grouping = function(s, min, max) {
+ /** @protected */
+ while (this.cursor < this.limit) {
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch > max || ch < min)
+ return true;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0)
+ return true;
+ this.cursor++;
+ }
+ return false;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.in_grouping_b = function(s, min, max) {
+ /** @protected */
+ if (this.cursor <= this.limit_backward) return false;
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch > max || ch < min) return false;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+ this.cursor--;
+ return true;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.go_in_grouping_b = function(s, min, max) {
+ /** @protected */
+ while (this.cursor > this.limit_backward) {
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch > max || ch < min) return true;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return true;
+ this.cursor--;
+ }
+ return false;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.out_grouping = function(s, min, max) {
+ /** @protected */
+ if (this.cursor >= this.limit) return false;
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch > max || ch < min) {
+ this.cursor++;
+ return true;
+ }
+ ch -= min;
+ if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
+ this.cursor++;
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.go_out_grouping = function(s, min, max) {
+ /** @protected */
+ while (this.cursor < this.limit) {
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch <= max && ch >= min) {
+ ch -= min;
+ if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) != 0) {
+ return true;
+ }
+ }
+ this.cursor++;
+ }
+ return false;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.out_grouping_b = function(s, min, max) {
+ /** @protected */
+ if (this.cursor <= this.limit_backward) return false;
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch > max || ch < min) {
+ this.cursor--;
+ return true;
+ }
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
+ this.cursor--;
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @param {number[]} s
+ * @param {number} min
+ * @param {number} max
+ * @return {boolean}
+ */
+ this.go_out_grouping_b = function(s, min, max) {
+ /** @protected */
+ while (this.cursor > this.limit_backward) {
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch <= max && ch >= min) {
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) != 0) {
+ return true;
+ }
+ }
+ this.cursor--;
+ }
+ return false;
+ };
+
+ /**
+ * @param {string} s
+ * @return {boolean}
+ */
+ this.eq_s = function(s)
+ {
+ /** @protected */
+ if (this.limit - this.cursor < s.length) return false;
+ if (this.current.slice(this.cursor, this.cursor + s.length) != s)
+ {
+ return false;
+ }
+ this.cursor += s.length;
+ return true;
+ };
+
+ /**
+ * @param {string} s
+ * @return {boolean}
+ */
+ this.eq_s_b = function(s)
+ {
+ /** @protected */
+ if (this.cursor - this.limit_backward < s.length) return false;
+ if (this.current.slice(this.cursor - s.length, this.cursor) != s)
+ {
+ return false;
+ }
+ this.cursor -= s.length;
+ return true;
+ };
+
+ /**
+ * @param {Among[]} v
+ * @return {number}
+ */
+ this.find_among = function(v)
+ {
+ /** @protected */
+ var i = 0;
+ var j = v.length;
+
+ var c = this.cursor;
+ var l = this.limit;
+
+ var common_i = 0;
+ var common_j = 0;
+
+ var first_key_inspected = false;
+
+ while (true)
+ {
+ var k = i + ((j - i) >>> 1);
+ var diff = 0;
+ var common = common_i < common_j ? common_i : common_j; // smaller
+ // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
+ var w = v[k];
+ var i2;
+ for (i2 = common; i2 < w[0].length; i2++)
+ {
+ if (c + common == l)
+ {
+ diff = -1;
+ break;
+ }
+ diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
+ if (diff != 0) break;
+ common++;
+ }
+ if (diff < 0)
+ {
+ j = k;
+ common_j = common;
+ }
+ else
+ {
+ i = k;
+ common_i = common;
+ }
+ if (j - i <= 1)
+ {
+ if (i > 0) break; // v->s has been inspected
+ if (j == i) break; // only one item in v
+
+ // - but now we need to go round once more to get
+ // v->s inspected. This looks messy, but is actually
+ // the optimal approach.
+
+ if (first_key_inspected) break;
+ first_key_inspected = true;
+ }
+ }
+ do {
+ var w = v[i];
+ if (common_i >= w[0].length)
+ {
+ this.cursor = c + w[0].length;
+ if (w.length < 4) return w[2];
+ var res = w[3](this);
+ this.cursor = c + w[0].length;
+ if (res) return w[2];
+ }
+ i = w[1];
+ } while (i >= 0);
+ return 0;
+ };
+
+ // find_among_b is for backwards processing. Same comments apply
+ /**
+ * @param {Among[]} v
+ * @return {number}
+ */
+ this.find_among_b = function(v)
+ {
+ /** @protected */
+ var i = 0;
+ var j = v.length
+
+ var c = this.cursor;
+ var lb = this.limit_backward;
+
+ var common_i = 0;
+ var common_j = 0;
+
+ var first_key_inspected = false;
+
+ while (true)
+ {
+ var k = i + ((j - i) >> 1);
+ var diff = 0;
+ var common = common_i < common_j ? common_i : common_j;
+ var w = v[k];
+ var i2;
+ for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
+ {
+ if (c - common == lb)
+ {
+ diff = -1;
+ break;
+ }
+ diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
+ if (diff != 0) break;
+ common++;
+ }
+ if (diff < 0)
+ {
+ j = k;
+ common_j = common;
+ }
+ else
+ {
+ i = k;
+ common_i = common;
+ }
+ if (j - i <= 1)
+ {
+ if (i > 0) break;
+ if (j == i) break;
+ if (first_key_inspected) break;
+ first_key_inspected = true;
+ }
+ }
+ do {
+ var w = v[i];
+ if (common_i >= w[0].length)
+ {
+ this.cursor = c - w[0].length;
+ if (w.length < 4) return w[2];
+ var res = w[3](this);
+ this.cursor = c - w[0].length;
+ if (res) return w[2];
+ }
+ i = w[1];
+ } while (i >= 0);
+ return 0;
+ };
+
+ /* to replace chars between c_bra and c_ket in this.current by the
+ * chars in s.
+ */
+ /**
+ * @param {number} c_bra
+ * @param {number} c_ket
+ * @param {string} s
+ * @return {number}
+ */
+ this.replace_s = function(c_bra, c_ket, s)
+ {
+ /** @protected */
+ var adjustment = s.length - (c_ket - c_bra);
+ this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
+ this.limit += adjustment;
+ if (this.cursor >= c_ket) this.cursor += adjustment;
+ else if (this.cursor > c_bra) this.cursor = c_bra;
+ return adjustment;
+ };
+
+ /**
+ * @return {boolean}
+ */
+ this.slice_check = function()
+ {
+ /** @protected */
+ if (this.bra < 0 ||
+ this.bra > this.ket ||
+ this.ket > this.limit ||
+ this.limit > this.current.length)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /**
+ * @param {number} c_bra
+ * @return {boolean}
+ */
+ this.slice_from = function(s)
+ {
+ /** @protected */
+ var result = false;
+ if (this.slice_check())
+ {
+ this.replace_s(this.bra, this.ket, s);
+ result = true;
+ }
+ return result;
+ };
+
+ /**
+ * @return {boolean}
+ */
+ this.slice_del = function()
+ {
+ /** @protected */
+ return this.slice_from("");
+ };
+
+ /**
+ * @param {number} c_bra
+ * @param {number} c_ket
+ * @param {string} s
+ */
+ this.insert = function(c_bra, c_ket, s)
+ {
+ /** @protected */
+ var adjustment = this.replace_s(c_bra, c_ket, s);
+ if (c_bra <= this.bra) this.bra += adjustment;
+ if (c_bra <= this.ket) this.ket += adjustment;
+ };
+
+ /**
+ * @return {string}
+ */
+ this.slice_to = function()
+ {
+ /** @protected */
+ var result = '';
+ if (this.slice_check())
+ {
+ result = this.current.slice(this.bra, this.ket);
+ }
+ return result;
+ };
+
+ /**
+ * @return {string}
+ */
+ this.assign_to = function()
+ {
+ /** @protected */
+ return this.current.slice(0, this.limit);
+ };
+};
diff --git a/_static/basic.css b/_static/basic.css
new file mode 100644
index 00000000..4738b2ed
--- /dev/null
+++ b/_static/basic.css
@@ -0,0 +1,906 @@
+/*
+ * Sphinx stylesheet -- basic theme.
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin-top: 10px;
+}
+
+ul.search li {
+ padding: 5px 0;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: 360px;
+ max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+ float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+ padding-right: 0.5em;
+}
+aside.footnote > p {
+ margin-left: 2em;
+}
+div.citation > p {
+ margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+ margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.sig dd {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.sig dl {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/_static/check-solid.svg b/_static/check-solid.svg
new file mode 100644
index 00000000..92fad4b5
--- /dev/null
+++ b/_static/check-solid.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js
new file mode 100644
index 00000000..54b3c463
--- /dev/null
+++ b/_static/clipboard.min.js
@@ -0,0 +1,7 @@
+/*!
+ * clipboard.js v2.0.8
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1
+
+
+
+
diff --git a/_static/copybutton.css b/_static/copybutton.css
new file mode 100644
index 00000000..f1916ec7
--- /dev/null
+++ b/_static/copybutton.css
@@ -0,0 +1,94 @@
+/* Copy buttons */
+button.copybtn {
+ position: absolute;
+ display: flex;
+ top: .3em;
+ right: .3em;
+ width: 1.7em;
+ height: 1.7em;
+ opacity: 0;
+ transition: opacity 0.3s, border .3s, background-color .3s;
+ user-select: none;
+ padding: 0;
+ border: none;
+ outline: none;
+ border-radius: 0.4em;
+ /* The colors that GitHub uses */
+ border: #1b1f2426 1px solid;
+ background-color: #f6f8fa;
+ color: #57606a;
+}
+
+button.copybtn.success {
+ border-color: #22863a;
+ color: #22863a;
+}
+
+button.copybtn svg {
+ stroke: currentColor;
+ width: 1.5em;
+ height: 1.5em;
+ padding: 0.1em;
+}
+
+div.highlight {
+ position: relative;
+}
+
+/* Show the copybutton */
+.highlight:hover button.copybtn, button.copybtn.success {
+ opacity: 1;
+}
+
+.highlight button.copybtn:hover {
+ background-color: rgb(235, 235, 235);
+}
+
+.highlight button.copybtn:active {
+ background-color: rgb(187, 187, 187);
+}
+
+/**
+ * A minimal CSS-only tooltip copied from:
+ * https://codepen.io/mildrenben/pen/rVBrpK
+ *
+ * To use, write HTML like the following:
+ *
+ * Short
+ */
+ .o-tooltip--left {
+ position: relative;
+ }
+
+ .o-tooltip--left:after {
+ opacity: 0;
+ visibility: hidden;
+ position: absolute;
+ content: attr(data-tooltip);
+ padding: .2em;
+ font-size: .8em;
+ left: -.2em;
+ background: grey;
+ color: white;
+ white-space: nowrap;
+ z-index: 2;
+ border-radius: 2px;
+ transform: translateX(-102%) translateY(0);
+ transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
+}
+
+.o-tooltip--left:hover:after {
+ display: block;
+ opacity: 1;
+ visibility: visible;
+ transform: translateX(-100%) translateY(0);
+ transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1);
+ transition-delay: .5s;
+}
+
+/* By default the copy button shouldn't show up when printing a page */
+@media print {
+ button.copybtn {
+ display: none;
+ }
+}
diff --git a/_static/copybutton.js b/_static/copybutton.js
new file mode 100644
index 00000000..2ea7ff3e
--- /dev/null
+++ b/_static/copybutton.js
@@ -0,0 +1,248 @@
+// Localization support
+const messages = {
+ 'en': {
+ 'copy': 'Copy',
+ 'copy_to_clipboard': 'Copy to clipboard',
+ 'copy_success': 'Copied!',
+ 'copy_failure': 'Failed to copy',
+ },
+ 'es' : {
+ 'copy': 'Copiar',
+ 'copy_to_clipboard': 'Copiar al portapapeles',
+ 'copy_success': '¡Copiado!',
+ 'copy_failure': 'Error al copiar',
+ },
+ 'de' : {
+ 'copy': 'Kopieren',
+ 'copy_to_clipboard': 'In die Zwischenablage kopieren',
+ 'copy_success': 'Kopiert!',
+ 'copy_failure': 'Fehler beim Kopieren',
+ },
+ 'fr' : {
+ 'copy': 'Copier',
+ 'copy_to_clipboard': 'Copier dans le presse-papier',
+ 'copy_success': 'Copié !',
+ 'copy_failure': 'Échec de la copie',
+ },
+ 'ru': {
+ 'copy': 'Скопировать',
+ 'copy_to_clipboard': 'Скопировать в буфер',
+ 'copy_success': 'Скопировано!',
+ 'copy_failure': 'Не удалось скопировать',
+ },
+ 'zh-CN': {
+ 'copy': '复制',
+ 'copy_to_clipboard': '复制到剪贴板',
+ 'copy_success': '复制成功!',
+ 'copy_failure': '复制失败',
+ },
+ 'it' : {
+ 'copy': 'Copiare',
+ 'copy_to_clipboard': 'Copiato negli appunti',
+ 'copy_success': 'Copiato!',
+ 'copy_failure': 'Errore durante la copia',
+ }
+}
+
+let locale = 'en'
+if( document.documentElement.lang !== undefined
+ && messages[document.documentElement.lang] !== undefined ) {
+ locale = document.documentElement.lang
+}
+
+let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT;
+if (doc_url_root == '#') {
+ doc_url_root = '';
+}
+
+/**
+ * SVG files for our copy buttons
+ */
+let iconCheck = `
+ ${messages[locale]['copy_success']}
+
+
+ `
+
+// If the user specified their own SVG use that, otherwise use the default
+let iconCopy = ``;
+if (!iconCopy) {
+ iconCopy = `
+ ${messages[locale]['copy_to_clipboard']}
+
+
+
+ `
+}
+
+/**
+ * Set up copy/paste for code blocks
+ */
+
+const runWhenDOMLoaded = cb => {
+ if (document.readyState != 'loading') {
+ cb()
+ } else if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded', cb)
+ } else {
+ document.attachEvent('onreadystatechange', function() {
+ if (document.readyState == 'complete') cb()
+ })
+ }
+}
+
+const codeCellId = index => `codecell${index}`
+
+// Clears selected text since ClipboardJS will select the text when copying
+const clearSelection = () => {
+ if (window.getSelection) {
+ window.getSelection().removeAllRanges()
+ } else if (document.selection) {
+ document.selection.empty()
+ }
+}
+
+// Changes tooltip text for a moment, then changes it back
+// We want the timeout of our `success` class to be a bit shorter than the
+// tooltip and icon change, so that we can hide the icon before changing back.
+var timeoutIcon = 2000;
+var timeoutSuccessClass = 1500;
+
+const temporarilyChangeTooltip = (el, oldText, newText) => {
+ el.setAttribute('data-tooltip', newText)
+ el.classList.add('success')
+ // Remove success a little bit sooner than we change the tooltip
+ // So that we can use CSS to hide the copybutton first
+ setTimeout(() => el.classList.remove('success'), timeoutSuccessClass)
+ setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon)
+}
+
+// Changes the copy button icon for two seconds, then changes it back
+const temporarilyChangeIcon = (el) => {
+ el.innerHTML = iconCheck;
+ setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon)
+}
+
+const addCopyButtonToCodeCells = () => {
+ // If ClipboardJS hasn't loaded, wait a bit and try again. This
+ // happens because we load ClipboardJS asynchronously.
+ if (window.ClipboardJS === undefined) {
+ setTimeout(addCopyButtonToCodeCells, 250)
+ return
+ }
+
+ // Add copybuttons to all of our code cells
+ const COPYBUTTON_SELECTOR = 'div.highlight pre';
+ const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR)
+ codeCells.forEach((codeCell, index) => {
+ const id = codeCellId(index)
+ codeCell.setAttribute('id', id)
+
+ const clipboardButton = id =>
+ `
+ ${iconCopy}
+ `
+ codeCell.insertAdjacentHTML('afterend', clipboardButton(id))
+ })
+
+function escapeRegExp(string) {
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+}
+
+/**
+ * Removes excluded text from a Node.
+ *
+ * @param {Node} target Node to filter.
+ * @param {string} exclude CSS selector of nodes to exclude.
+ * @returns {DOMString} Text from `target` with text removed.
+ */
+function filterText(target, exclude) {
+ const clone = target.cloneNode(true); // clone as to not modify the live DOM
+ if (exclude) {
+ // remove excluded nodes
+ clone.querySelectorAll(exclude).forEach(node => node.remove());
+ }
+ return clone.innerText;
+}
+
+// Callback when a copy button is clicked. Will be passed the node that was clicked
+// should then grab the text and replace pieces of text that shouldn't be used in output
+function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
+ var regexp;
+ var match;
+
+ // Do we check for line continuation characters and "HERE-documents"?
+ var useLineCont = !!lineContinuationChar
+ var useHereDoc = !!hereDocDelim
+
+ // create regexp to capture prompt and remaining line
+ if (isRegexp) {
+ regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)')
+ } else {
+ regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)')
+ }
+
+ const outputLines = [];
+ var promptFound = false;
+ var gotLineCont = false;
+ var gotHereDoc = false;
+ const lineGotPrompt = [];
+ for (const line of textContent.split('\n')) {
+ match = line.match(regexp)
+ if (match || gotLineCont || gotHereDoc) {
+ promptFound = regexp.test(line)
+ lineGotPrompt.push(promptFound)
+ if (removePrompts && promptFound) {
+ outputLines.push(match[2])
+ } else {
+ outputLines.push(line)
+ }
+ gotLineCont = line.endsWith(lineContinuationChar) & useLineCont
+ if (line.includes(hereDocDelim) & useHereDoc)
+ gotHereDoc = !gotHereDoc
+ } else if (!onlyCopyPromptLines) {
+ outputLines.push(line)
+ } else if (copyEmptyLines && line.trim() === '') {
+ outputLines.push(line)
+ }
+ }
+
+ // If no lines with the prompt were found then just use original lines
+ if (lineGotPrompt.some(v => v === true)) {
+ textContent = outputLines.join('\n');
+ }
+
+ // Remove a trailing newline to avoid auto-running when pasting
+ if (textContent.endsWith("\n")) {
+ textContent = textContent.slice(0, -1)
+ }
+ return textContent
+}
+
+
+var copyTargetText = (trigger) => {
+ var target = document.querySelector(trigger.attributes['data-clipboard-target'].value);
+
+ // get filtered text
+ let exclude = '.linenos';
+
+ let text = filterText(target, exclude);
+ return formatCopyText(text, '', false, true, true, true, '', '')
+}
+
+ // Initialize with a callback so we can modify the text before copy
+ const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText})
+
+ // Update UI with error/success messages
+ clipboard.on('success', event => {
+ clearSelection()
+ temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success'])
+ temporarilyChangeIcon(event.trigger)
+ })
+
+ clipboard.on('error', event => {
+ temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure'])
+ })
+}
+
+runWhenDOMLoaded(addCopyButtonToCodeCells)
\ No newline at end of file
diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js
new file mode 100644
index 00000000..dbe1aaad
--- /dev/null
+++ b/_static/copybutton_funcs.js
@@ -0,0 +1,73 @@
+function escapeRegExp(string) {
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+}
+
+/**
+ * Removes excluded text from a Node.
+ *
+ * @param {Node} target Node to filter.
+ * @param {string} exclude CSS selector of nodes to exclude.
+ * @returns {DOMString} Text from `target` with text removed.
+ */
+export function filterText(target, exclude) {
+ const clone = target.cloneNode(true); // clone as to not modify the live DOM
+ if (exclude) {
+ // remove excluded nodes
+ clone.querySelectorAll(exclude).forEach(node => node.remove());
+ }
+ return clone.innerText;
+}
+
+// Callback when a copy button is clicked. Will be passed the node that was clicked
+// should then grab the text and replace pieces of text that shouldn't be used in output
+export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
+ var regexp;
+ var match;
+
+ // Do we check for line continuation characters and "HERE-documents"?
+ var useLineCont = !!lineContinuationChar
+ var useHereDoc = !!hereDocDelim
+
+ // create regexp to capture prompt and remaining line
+ if (isRegexp) {
+ regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)')
+ } else {
+ regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)')
+ }
+
+ const outputLines = [];
+ var promptFound = false;
+ var gotLineCont = false;
+ var gotHereDoc = false;
+ const lineGotPrompt = [];
+ for (const line of textContent.split('\n')) {
+ match = line.match(regexp)
+ if (match || gotLineCont || gotHereDoc) {
+ promptFound = regexp.test(line)
+ lineGotPrompt.push(promptFound)
+ if (removePrompts && promptFound) {
+ outputLines.push(match[2])
+ } else {
+ outputLines.push(line)
+ }
+ gotLineCont = line.endsWith(lineContinuationChar) & useLineCont
+ if (line.includes(hereDocDelim) & useHereDoc)
+ gotHereDoc = !gotHereDoc
+ } else if (!onlyCopyPromptLines) {
+ outputLines.push(line)
+ } else if (copyEmptyLines && line.trim() === '') {
+ outputLines.push(line)
+ }
+ }
+
+ // If no lines with the prompt were found then just use original lines
+ if (lineGotPrompt.some(v => v === true)) {
+ textContent = outputLines.join('\n');
+ }
+
+ // Remove a trailing newline to avoid auto-running when pasting
+ if (textContent.endsWith("\n")) {
+ textContent = textContent.slice(0, -1)
+ }
+ return textContent
+}
diff --git a/_static/debug.css b/_static/debug.css
new file mode 100644
index 00000000..74d4aec3
--- /dev/null
+++ b/_static/debug.css
@@ -0,0 +1,69 @@
+/*
+ This CSS file should be overridden by the theme authors. It's
+ meant for debugging and developing the skeleton that this theme provides.
+*/
+body {
+ font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji";
+ background: lavender;
+}
+.sb-announcement {
+ background: rgb(131, 131, 131);
+}
+.sb-announcement__inner {
+ background: black;
+ color: white;
+}
+.sb-header {
+ background: lightskyblue;
+}
+.sb-header__inner {
+ background: royalblue;
+ color: white;
+}
+.sb-header-secondary {
+ background: lightcyan;
+}
+.sb-header-secondary__inner {
+ background: cornflowerblue;
+ color: white;
+}
+.sb-sidebar-primary {
+ background: lightgreen;
+}
+.sb-main {
+ background: blanchedalmond;
+}
+.sb-main__inner {
+ background: antiquewhite;
+}
+.sb-header-article {
+ background: lightsteelblue;
+}
+.sb-article-container {
+ background: snow;
+}
+.sb-article-main {
+ background: white;
+}
+.sb-footer-article {
+ background: lightpink;
+}
+.sb-sidebar-secondary {
+ background: lightgoldenrodyellow;
+}
+.sb-footer-content {
+ background: plum;
+}
+.sb-footer-content__inner {
+ background: palevioletred;
+}
+.sb-footer {
+ background: pink;
+}
+.sb-footer__inner {
+ background: salmon;
+}
+.sb-article {
+ background: white;
+}
diff --git a/_static/doctools.js b/_static/doctools.js
new file mode 100644
index 00000000..807cdb17
--- /dev/null
+++ b/_static/doctools.js
@@ -0,0 +1,150 @@
+/*
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
+const _ready = (callback) => {
+ if (document.readyState !== "loading") {
+ callback();
+ } else {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+ init: () => {
+ Documentation.initDomainIndexTable();
+ Documentation.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS: {},
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+ LOCALE: "unknown",
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext: (string) => {
+ const translated = Documentation.TRANSLATIONS[string];
+ switch (typeof translated) {
+ case "undefined":
+ return string; // no translation
+ case "string":
+ return translated; // translation exists
+ default:
+ return translated[0]; // (singular, plural) translation tuple exists
+ }
+ },
+
+ ngettext: (singular, plural, n) => {
+ const translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated !== "undefined")
+ return translated[Documentation.PLURAL_EXPR(n)];
+ return n === 1 ? singular : plural;
+ },
+
+ addTranslations: (catalog) => {
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+ Documentation.PLURAL_EXPR = new Function(
+ "n",
+ `return (${catalog.plural_expr})`,
+ );
+ Documentation.LOCALE = catalog.locale;
+ },
+
+ /**
+ * helper function to focus on search bar
+ */
+ focusSearchBar: () => {
+ document.querySelectorAll("input[name=q]")[0]?.focus();
+ },
+
+ /**
+ * Initialise the domain index toggle buttons
+ */
+ initDomainIndexTable: () => {
+ const toggler = (el) => {
+ const idNumber = el.id.substr(7);
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+ if (el.src.substr(-9) === "minus.png") {
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+ toggledRows.forEach((el) => (el.style.display = "none"));
+ } else {
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+ toggledRows.forEach((el) => (el.style.display = ""));
+ }
+ };
+
+ const togglerElements = document.querySelectorAll("img.toggler");
+ togglerElements.forEach((el) =>
+ el.addEventListener("click", (event) => toggler(event.currentTarget)),
+ );
+ togglerElements.forEach((el) => (el.style.display = ""));
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+ },
+
+ initOnKeyListeners: () => {
+ // only install a listener if it is really needed
+ if (
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS
+ && !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ )
+ return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName))
+ return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+ if (!event.shiftKey) {
+ switch (event.key) {
+ case "ArrowLeft":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const prevLink = document.querySelector('link[rel="prev"]');
+ if (prevLink && prevLink.href) {
+ window.location.href = prevLink.href;
+ event.preventDefault();
+ }
+ break;
+ case "ArrowRight":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const nextLink = document.querySelector('link[rel="next"]');
+ if (nextLink && nextLink.href) {
+ window.location.href = nextLink.href;
+ event.preventDefault();
+ }
+ break;
+ }
+ }
+
+ // some keyboard layouts may need Shift to get /
+ switch (event.key) {
+ case "/":
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+ Documentation.focusSearchBar();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
new file mode 100644
index 00000000..9619c01e
--- /dev/null
+++ b/_static/documentation_options.js
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+ VERSION: '0.11.1.dev0',
+ LANGUAGE: 'en',
+ COLLAPSE_INDEX: false,
+ BUILDER: 'html',
+ FILE_SUFFIX: '.html',
+ LINK_SUFFIX: '.html',
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt',
+ NAVIGATION_WITH_KEYS: false,
+ SHOW_SEARCH_SUMMARY: true,
+ ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/_static/english-stemmer.js b/_static/english-stemmer.js
new file mode 100644
index 00000000..056760ee
--- /dev/null
+++ b/_static/english-stemmer.js
@@ -0,0 +1,1066 @@
+// Generated from english.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+/**@constructor*/
+var EnglishStemmer = function() {
+ var base = new BaseStemmer();
+
+ /** @const */ var a_0 = [
+ ["arsen", -1, -1],
+ ["commun", -1, -1],
+ ["emerg", -1, -1],
+ ["gener", -1, -1],
+ ["later", -1, -1],
+ ["organ", -1, -1],
+ ["past", -1, -1],
+ ["univers", -1, -1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["'", -1, 1],
+ ["'s'", 0, 1],
+ ["'s", -1, 1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ied", -1, 2],
+ ["s", -1, 3],
+ ["ies", 1, 2],
+ ["sses", 1, 1],
+ ["ss", 1, -1],
+ ["us", 1, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["succ", -1, 1],
+ ["proc", -1, 1],
+ ["exc", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["even", -1, 2],
+ ["cann", -1, 2],
+ ["inn", -1, 2],
+ ["earr", -1, 2],
+ ["herr", -1, 2],
+ ["out", -1, 2],
+ ["y", -1, 1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["", -1, -1],
+ ["ed", 0, 2],
+ ["eed", 1, 1],
+ ["ing", 0, 3],
+ ["edly", 0, 2],
+ ["eedly", 4, 1],
+ ["ingly", 0, 2]
+ ];
+
+ /** @const */ var a_6 = [
+ ["", -1, 3],
+ ["bb", 0, 2],
+ ["dd", 0, 2],
+ ["ff", 0, 2],
+ ["gg", 0, 2],
+ ["bl", 0, 1],
+ ["mm", 0, 2],
+ ["nn", 0, 2],
+ ["pp", 0, 2],
+ ["rr", 0, 2],
+ ["at", 0, 1],
+ ["tt", 0, 2],
+ ["iz", 0, 1]
+ ];
+
+ /** @const */ var a_7 = [
+ ["anci", -1, 3],
+ ["enci", -1, 2],
+ ["ogi", -1, 14],
+ ["li", -1, 16],
+ ["bli", 3, 12],
+ ["abli", 4, 4],
+ ["alli", 3, 8],
+ ["fulli", 3, 9],
+ ["lessli", 3, 15],
+ ["ousli", 3, 10],
+ ["entli", 3, 5],
+ ["aliti", -1, 8],
+ ["biliti", -1, 12],
+ ["iviti", -1, 11],
+ ["tional", -1, 1],
+ ["ational", 14, 7],
+ ["alism", -1, 8],
+ ["ation", -1, 7],
+ ["ization", 17, 6],
+ ["izer", -1, 6],
+ ["ator", -1, 7],
+ ["iveness", -1, 11],
+ ["fulness", -1, 9],
+ ["ousness", -1, 10],
+ ["ogist", -1, 13]
+ ];
+
+ /** @const */ var a_8 = [
+ ["icate", -1, 4],
+ ["ative", -1, 6],
+ ["alize", -1, 3],
+ ["iciti", -1, 4],
+ ["ical", -1, 4],
+ ["tional", -1, 1],
+ ["ational", 5, 2],
+ ["ful", -1, 5],
+ ["ness", -1, 5]
+ ];
+
+ /** @const */ var a_9 = [
+ ["ic", -1, 1],
+ ["ance", -1, 1],
+ ["ence", -1, 1],
+ ["able", -1, 1],
+ ["ible", -1, 1],
+ ["ate", -1, 1],
+ ["ive", -1, 1],
+ ["ize", -1, 1],
+ ["iti", -1, 1],
+ ["al", -1, 1],
+ ["ism", -1, 1],
+ ["ion", -1, 2],
+ ["er", -1, 1],
+ ["ous", -1, 1],
+ ["ant", -1, 1],
+ ["ent", -1, 1],
+ ["ment", 15, 1],
+ ["ement", 16, 1]
+ ];
+
+ /** @const */ var a_10 = [
+ ["e", -1, 1],
+ ["l", -1, 2]
+ ];
+
+ /** @const */ var a_11 = [
+ ["andes", -1, -1],
+ ["atlas", -1, -1],
+ ["bias", -1, -1],
+ ["cosmos", -1, -1],
+ ["early", -1, 5],
+ ["gently", -1, 3],
+ ["howe", -1, -1],
+ ["idly", -1, 2],
+ ["news", -1, -1],
+ ["only", -1, 6],
+ ["singly", -1, 7],
+ ["skies", -1, 1],
+ ["sky", -1, -1],
+ ["ugly", -1, 4]
+ ];
+
+ /** @const */ var /** Array */ g_aeo = [17, 64];
+
+ /** @const */ var /** Array */ g_v = [17, 65, 16, 1];
+
+ /** @const */ var /** Array */ g_v_WXY = [1, 17, 65, 208, 1];
+
+ /** @const */ var /** Array */ g_valid_LI = [55, 141, 2];
+
+ var /** boolean */ B_Y_found = false;
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ B_Y_found = false;
+ /** @const */ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("'")))
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = v_1;
+ /** @const */ var /** number */ v_2 = base.cursor;
+ lab1: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ break lab1;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ B_Y_found = true;
+ }
+ base.cursor = v_2;
+ /** @const */ var /** number */ v_3 = base.cursor;
+ lab2: {
+ while(true)
+ {
+ /** @const */ var /** number */ v_4 = base.cursor;
+ lab3: {
+ golab4: while(true)
+ {
+ /** @const */ var /** number */ v_5 = base.cursor;
+ lab5: {
+ if (!(base.in_grouping(g_v, 97, 121)))
+ {
+ break lab5;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ break lab5;
+ }
+ base.ket = base.cursor;
+ base.cursor = v_5;
+ break golab4;
+ }
+ base.cursor = v_5;
+ if (base.cursor >= base.limit)
+ {
+ break lab3;
+ }
+ base.cursor++;
+ }
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ B_Y_found = true;
+ continue;
+ }
+ base.cursor = v_4;
+ break;
+ }
+ }
+ base.cursor = v_3;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ /** @const */ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ /** @const */ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (base.find_among(a_0) == 0)
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (!base.go_out_grouping(g_v, 97, 121))
+ {
+ break lab0;
+ }
+ base.cursor++;
+ if (!base.go_in_grouping(g_v, 97, 121))
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ if (!base.go_out_grouping(g_v, 97, 121))
+ {
+ break lab0;
+ }
+ base.cursor++;
+ if (!base.go_in_grouping(g_v, 97, 121))
+ {
+ break lab0;
+ }
+ base.cursor++;
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_shortv() {
+ lab0: {
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.out_grouping_b(g_v_WXY, 89, 121)))
+ {
+ break lab1;
+ }
+ if (!(base.in_grouping_b(g_v, 97, 121)))
+ {
+ break lab1;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 121)))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab2: {
+ if (!(base.out_grouping_b(g_v, 97, 121)))
+ {
+ break lab2;
+ }
+ if (!(base.in_grouping_b(g_v, 97, 121)))
+ {
+ break lab2;
+ }
+ if (base.cursor > base.limit_backward)
+ {
+ break lab2;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("past")))
+ {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ return I_p1 <= base.cursor;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ return I_p2 <= base.cursor;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1a() {
+ var /** number */ among_var;
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("ss"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ lab1: {
+ /** @const */ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ {
+ /** @const */ var /** number */ c1 = base.cursor - 2;
+ if (c1 < base.limit_backward)
+ {
+ break lab2;
+ }
+ base.cursor = c1;
+ }
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ if (!base.slice_from("ie"))
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!base.go_out_grouping_b(g_v, 97, 121))
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1b() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_5);
+ base.bra = base.cursor;
+ lab0: {
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ switch (among_var) {
+ case 1:
+ /** @const */ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ lab3: {
+ /** @const */ var /** number */ v_3 = base.limit - base.cursor;
+ lab4: {
+ if (base.find_among_b(a_3) == 0)
+ {
+ break lab4;
+ }
+ if (base.cursor > base.limit_backward)
+ {
+ break lab4;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_3;
+ if (!r_R1())
+ {
+ break lab2;
+ }
+ if (!base.slice_from("ee"))
+ {
+ return false;
+ }
+ }
+ }
+ base.cursor = base.limit - v_2;
+ break;
+ case 2:
+ break lab1;
+ case 3:
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ break lab1;
+ }
+ switch (among_var) {
+ case 1:
+ /** @const */ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.out_grouping_b(g_v, 97, 121)))
+ {
+ break lab1;
+ }
+ if (base.cursor > base.limit_backward)
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ base.bra = base.cursor;
+ if (!base.slice_from("ie"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (base.cursor > base.limit_backward)
+ {
+ break lab1;
+ }
+ break;
+ }
+ break;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ /** @const */ var /** number */ v_5 = base.limit - base.cursor;
+ if (!base.go_out_grouping_b(g_v, 97, 121))
+ {
+ return false;
+ }
+ base.cursor--;
+ base.cursor = base.limit - v_5;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ base.bra = base.cursor;
+ /** @const */ var /** number */ v_6 = base.limit - base.cursor;
+ among_var = base.find_among_b(a_6);
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ return false;
+ case 2:
+ {
+ /** @const */ var /** number */ v_7 = base.limit - base.cursor;
+ lab5: {
+ if (!(base.in_grouping_b(g_aeo, 97, 111)))
+ {
+ break lab5;
+ }
+ if (base.cursor > base.limit_backward)
+ {
+ break lab5;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_7;
+ }
+ break;
+ case 3:
+ if (base.cursor != I_p1)
+ {
+ return false;
+ }
+ /** @const */ var /** number */ v_8 = base.limit - base.cursor;
+ if (!r_shortv())
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_8;
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_6;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1c() {
+ base.ket = base.cursor;
+ lab0: {
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("y")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("Y")))
+ {
+ return false;
+ }
+ }
+ base.bra = base.cursor;
+ if (!(base.out_grouping_b(g_v, 97, 121)))
+ {
+ return false;
+ }
+ lab2: {
+ if (base.cursor > base.limit_backward)
+ {
+ break lab2;
+ }
+ return false;
+ }
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_2() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_7);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("tion"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("ence"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("ance"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("able"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("ent"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("ize"))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!base.slice_from("ate"))
+ {
+ return false;
+ }
+ break;
+ case 8:
+ if (!base.slice_from("al"))
+ {
+ return false;
+ }
+ break;
+ case 9:
+ if (!base.slice_from("ful"))
+ {
+ return false;
+ }
+ break;
+ case 10:
+ if (!base.slice_from("ous"))
+ {
+ return false;
+ }
+ break;
+ case 11:
+ if (!base.slice_from("ive"))
+ {
+ return false;
+ }
+ break;
+ case 12:
+ if (!base.slice_from("ble"))
+ {
+ return false;
+ }
+ break;
+ case 13:
+ if (!base.slice_from("og"))
+ {
+ return false;
+ }
+ break;
+ case 14:
+ if (!(base.eq_s_b("l")))
+ {
+ return false;
+ }
+ if (!base.slice_from("og"))
+ {
+ return false;
+ }
+ break;
+ case 15:
+ if (!base.slice_from("less"))
+ {
+ return false;
+ }
+ break;
+ case 16:
+ if (!(base.in_grouping_b(g_valid_LI, 99, 116)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_3() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_8);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("tion"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("ate"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("al"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("ic"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_4() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_9);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ lab0: {
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("s")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("t")))
+ {
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_5() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_10);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab0: {
+ lab1: {
+ if (!r_R2())
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ if (!r_R1())
+ {
+ return false;
+ }
+ {
+ /** @const */ var /** number */ v_1 = base.limit - base.cursor;
+ lab2: {
+ if (!r_shortv())
+ {
+ break lab2;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!(base.eq_s_b("l")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_exception1() {
+ var /** number */ among_var;
+ base.bra = base.cursor;
+ among_var = base.find_among(a_11);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (base.cursor < base.limit)
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("sky"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("idl"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("gentl"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("ugli"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("earli"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("onli"))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!base.slice_from("singl"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ if (!B_Y_found)
+ {
+ return false;
+ }
+ while(true)
+ {
+ /** @const */ var /** number */ v_1 = base.cursor;
+ lab0: {
+ golab1: while(true)
+ {
+ /** @const */ var /** number */ v_2 = base.cursor;
+ lab2: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("Y")))
+ {
+ break lab2;
+ }
+ base.ket = base.cursor;
+ base.cursor = v_2;
+ break golab1;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ if (!base.slice_from("y"))
+ {
+ return false;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ lab0: {
+ /** @const */ var /** number */ v_1 = base.cursor;
+ lab1: {
+ if (!r_exception1())
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = v_1;
+ lab2: {
+ {
+ /** @const */ var /** number */ v_2 = base.cursor;
+ lab3: {
+ {
+ /** @const */ var /** number */ c1 = base.cursor + 3;
+ if (c1 > base.limit)
+ {
+ break lab3;
+ }
+ base.cursor = c1;
+ }
+ break lab2;
+ }
+ base.cursor = v_2;
+ }
+ break lab0;
+ }
+ base.cursor = v_1;
+ r_prelude();
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ /** @const */ var /** number */ v_3 = base.limit - base.cursor;
+ r_Step_1a();
+ base.cursor = base.limit - v_3;
+ /** @const */ var /** number */ v_4 = base.limit - base.cursor;
+ r_Step_1b();
+ base.cursor = base.limit - v_4;
+ /** @const */ var /** number */ v_5 = base.limit - base.cursor;
+ r_Step_1c();
+ base.cursor = base.limit - v_5;
+ /** @const */ var /** number */ v_6 = base.limit - base.cursor;
+ r_Step_2();
+ base.cursor = base.limit - v_6;
+ /** @const */ var /** number */ v_7 = base.limit - base.cursor;
+ r_Step_3();
+ base.cursor = base.limit - v_7;
+ /** @const */ var /** number */ v_8 = base.limit - base.cursor;
+ r_Step_4();
+ base.cursor = base.limit - v_8;
+ /** @const */ var /** number */ v_9 = base.limit - base.cursor;
+ r_Step_5();
+ base.cursor = base.limit - v_9;
+ base.cursor = base.limit_backward;
+ /** @const */ var /** number */ v_10 = base.cursor;
+ r_postlude();
+ base.cursor = v_10;
+ }
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/_static/file.png b/_static/file.png
new file mode 100644
index 00000000..a858a410
Binary files /dev/null and b/_static/file.png differ
diff --git a/_static/language_data.js b/_static/language_data.js
new file mode 100644
index 00000000..57767864
--- /dev/null
+++ b/_static/language_data.js
@@ -0,0 +1,13 @@
+/*
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the set of stopwords, stemmer, scorer and splitter.
+ */
+
+const stopwords = new Set(["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]);
+window.stopwords = stopwords; // Export to global scope
+
+
+/* Non-minified versions are copied as separate JavaScript files, if available */
+BaseStemmer=function(){this.current="",this.cursor=0,this.limit=0,this.limit_backward=0,this.bra=0,this.ket=0,this.setCurrent=function(t){this.current=t,this.cursor=0,this.limit=this.current.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},this.getCurrent=function(){return this.current},this.copy_from=function(t){this.current=t.current,this.cursor=t.cursor,this.limit=t.limit,this.limit_backward=t.limit_backward,this.bra=t.bra,this.ket=t.ket},this.in_grouping=function(t,r,i){return!(this.cursor>=this.limit||i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i))||(this.cursor++,0))},this.go_in_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.in_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward||i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i))||(this.cursor--,0))},this.go_in_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(i>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.out_grouping=function(t,r,i){return!(this.cursor>=this.limit)&&(i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i)))&&(this.cursor++,!0)},this.go_out_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.out_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward)&&(i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i)))&&(this.cursor--,!0)},this.go_out_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(s<=i&&r<=s&&0!=(t[(s-=r)>>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.eq_s=function(t){return!(this.limit-this.cursor>>1),o=0,a=e=(l=t[r])[0].length){if(this.cursor=s+l[0].length,l.length<4)return l[2];var g=l[3](this);if(this.cursor=s+l[0].length,g)return l[2]}}while(0<=(r=l[1]));return 0},this.find_among_b=function(t){for(var r=0,i=t.length,s=this.cursor,h=this.limit_backward,e=0,n=0,c=!1;;){for(var u,o=r+(i-r>>1),a=0,l=e=(u=t[r])[0].length){if(this.cursor=s-u[0].length,u.length<4)return u[2];var g=u[3](this);if(this.cursor=s-u[0].length,g)return u[2]}}while(0<=(r=u[1]));return 0},this.replace_s=function(t,r,i){var s=i.length-(r-t);return this.current=this.current.slice(0,t)+i+this.current.slice(r),this.limit+=s,this.cursor>=r?this.cursor+=s:this.cursor>t&&(this.cursor=t),s},this.slice_check=function(){return!(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length)},this.slice_from=function(t){var r=!1;return this.slice_check()&&(this.replace_s(this.bra,this.ket,t),r=!0),r},this.slice_del=function(){return this.slice_from("")},this.insert=function(t,r,i){r=this.replace_s(t,r,i);t<=this.bra&&(this.bra+=r),t<=this.ket&&(this.ket+=r)},this.slice_to=function(){var t="";return t=this.slice_check()?this.current.slice(this.bra,this.ket):t},this.assign_to=function(){return this.current.slice(0,this.limit)}};
+var EnglishStemmer=function(){var a=new BaseStemmer,c=[["arsen",-1,-1],["commun",-1,-1],["emerg",-1,-1],["gener",-1,-1],["later",-1,-1],["organ",-1,-1],["past",-1,-1],["univers",-1,-1]],o=[["'",-1,1],["'s'",0,1],["'s",-1,1]],u=[["ied",-1,2],["s",-1,3],["ies",1,2],["sses",1,1],["ss",1,-1],["us",1,-1]],t=[["succ",-1,1],["proc",-1,1],["exc",-1,1]],l=[["even",-1,2],["cann",-1,2],["inn",-1,2],["earr",-1,2],["herr",-1,2],["out",-1,2],["y",-1,1]],n=[["",-1,-1],["ed",0,2],["eed",1,1],["ing",0,3],["edly",0,2],["eedly",4,1],["ingly",0,2]],f=[["",-1,3],["bb",0,2],["dd",0,2],["ff",0,2],["gg",0,2],["bl",0,1],["mm",0,2],["nn",0,2],["pp",0,2],["rr",0,2],["at",0,1],["tt",0,2],["iz",0,1]],_=[["anci",-1,3],["enci",-1,2],["ogi",-1,14],["li",-1,16],["bli",3,12],["abli",4,4],["alli",3,8],["fulli",3,9],["lessli",3,15],["ousli",3,10],["entli",3,5],["aliti",-1,8],["biliti",-1,12],["iviti",-1,11],["tional",-1,1],["ational",14,7],["alism",-1,8],["ation",-1,7],["ization",17,6],["izer",-1,6],["ator",-1,7],["iveness",-1,11],["fulness",-1,9],["ousness",-1,10],["ogist",-1,13]],m=[["icate",-1,4],["ative",-1,6],["alize",-1,3],["iciti",-1,4],["ical",-1,4],["tional",-1,1],["ational",5,2],["ful",-1,5],["ness",-1,5]],b=[["ic",-1,1],["ance",-1,1],["ence",-1,1],["able",-1,1],["ible",-1,1],["ate",-1,1],["ive",-1,1],["ize",-1,1],["iti",-1,1],["al",-1,1],["ism",-1,1],["ion",-1,2],["er",-1,1],["ous",-1,1],["ant",-1,1],["ent",-1,1],["ment",15,1],["ement",16,1]],k=[["e",-1,1],["l",-1,2]],g=[["andes",-1,-1],["atlas",-1,-1],["bias",-1,-1],["cosmos",-1,-1],["early",-1,5],["gently",-1,3],["howe",-1,-1],["idly",-1,2],["news",-1,-1],["only",-1,6],["singly",-1,7],["skies",-1,1],["sky",-1,-1],["ugly",-1,4]],d=[17,64],v=[17,65,16,1],i=[1,17,65,208,1],w=[55,141,2],p=!1,y=0,h=0;function q(){var r=a.limit-a.cursor;return!!(a.out_grouping_b(i,89,121)&&a.in_grouping_b(v,97,121)&&a.out_grouping_b(v,97,121)||(a.cursor=a.limit-r,a.out_grouping_b(v,97,121)&&a.in_grouping_b(v,97,121)&&!(a.cursor>a.limit_backward))||(a.cursor=a.limit-r,a.eq_s_b("past")))}function z(){return h<=a.cursor}function Y(){return y<=a.cursor}this.stem=function(){var r=a.cursor;if(!(()=>{var r;if(a.bra=a.cursor,0!=(r=a.find_among(g))&&(a.ket=a.cursor,!(a.cursora.limit)a.cursor=i;else{a.cursor=e,a.cursor=r,(()=>{p=!1;var r=a.cursor;if(a.bra=a.cursor,!a.eq_s("'")||(a.ket=a.cursor,a.slice_del())){a.cursor=r;r=a.cursor;if(a.bra=a.cursor,a.eq_s("y")){if(a.ket=a.cursor,!a.slice_from("Y"))return;p=!0}a.cursor=r;for(r=a.cursor;;){var i=a.cursor;r:{for(;;){var e=a.cursor;if(a.in_grouping(v,97,121)&&(a.bra=a.cursor,a.eq_s("y"))){a.ket=a.cursor,a.cursor=e;break}if(a.cursor=e,a.cursor>=a.limit)break r;a.cursor++}if(!a.slice_from("Y"))return;p=!0;continue}a.cursor=i;break}a.cursor=r}})(),h=a.limit,y=a.limit;i=a.cursor;r:{var s=a.cursor;if(0==a.find_among(c)){if(a.cursor=s,!a.go_out_grouping(v,97,121))break r;if(a.cursor++,!a.go_in_grouping(v,97,121))break r;a.cursor++}h=a.cursor,a.go_out_grouping(v,97,121)&&(a.cursor++,a.go_in_grouping(v,97,121))&&(a.cursor++,y=a.cursor)}a.cursor=i,a.limit_backward=a.cursor,a.cursor=a.limit;var e=a.limit-a.cursor,r=((()=>{var r=a.limit-a.cursor;if(a.ket=a.cursor,0==a.find_among_b(o))a.cursor=a.limit-r;else if(a.bra=a.cursor,!a.slice_del())return;if(a.ket=a.cursor,0!=(r=a.find_among_b(u)))switch(a.bra=a.cursor,r){case 1:if(a.slice_from("ss"))break;return;case 2:r:{var i=a.limit-a.cursor,e=a.cursor-2;if(!(e{a.ket=a.cursor,o=a.find_among_b(n),a.bra=a.cursor;r:{var r=a.limit-a.cursor;i:{switch(o){case 1:var i=a.limit-a.cursor;e:{var e=a.limit-a.cursor;if(0==a.find_among_b(t)||a.cursor>a.limit_backward){if(a.cursor=a.limit-e,!z())break e;if(!a.slice_from("ee"))return}}a.cursor=a.limit-i;break;case 2:break i;case 3:if(0==(o=a.find_among_b(l)))break i;switch(o){case 1:var s=a.limit-a.cursor;if(!a.out_grouping_b(v,97,121))break i;if(a.cursor>a.limit_backward)break i;if(a.cursor=a.limit-s,a.bra=a.cursor,a.slice_from("ie"))break;return;case 2:if(a.cursor>a.limit_backward)break i}}break r}a.cursor=a.limit-r;var c=a.limit-a.cursor;if(!a.go_out_grouping_b(v,97,121))return;if(a.cursor--,a.cursor=a.limit-c,!a.slice_del())return;a.ket=a.cursor,a.bra=a.cursor;var o,c=a.limit-a.cursor;switch(o=a.find_among_b(f)){case 1:return a.slice_from("e");case 2:var u=a.limit-a.cursor;if(a.in_grouping_b(d,97,111)&&!(a.cursor>a.limit_backward))return;a.cursor=a.limit-u;break;case 3:return a.cursor!=h||(u=a.limit-a.cursor,q()&&(a.cursor=a.limit-u,a.slice_from("e")))}if(a.cursor=a.limit-c,a.ket=a.cursor,a.cursor<=a.limit_backward)return;if(a.cursor--,a.bra=a.cursor,!a.slice_del())return}})(),a.cursor=a.limit-r,a.limit-a.cursor),r=(a.ket=a.cursor,e=a.limit-a.cursor,(a.eq_s_b("y")||(a.cursor=a.limit-e,a.eq_s_b("Y")))&&(a.bra=a.cursor,a.out_grouping_b(v,97,121))&&a.cursor>a.limit_backward&&a.slice_from("i"),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(_))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ence"))break;return;case 3:if(a.slice_from("ance"))break;return;case 4:if(a.slice_from("able"))break;return;case 5:if(a.slice_from("ent"))break;return;case 6:if(a.slice_from("ize"))break;return;case 7:if(a.slice_from("ate"))break;return;case 8:if(a.slice_from("al"))break;return;case 9:if(a.slice_from("ful"))break;return;case 10:if(a.slice_from("ous"))break;return;case 11:if(a.slice_from("ive"))break;return;case 12:if(a.slice_from("ble"))break;return;case 13:if(a.slice_from("og"))break;return;case 14:if(!a.eq_s_b("l"))return;if(a.slice_from("og"))break;return;case 15:if(a.slice_from("less"))break;return;case 16:if(!a.in_grouping_b(w,99,116))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.limit-a.cursor),i=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(m))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ate"))break;return;case 3:if(a.slice_from("al"))break;return;case 4:if(a.slice_from("ic"))break;return;case 5:if(a.slice_del())break;return;case 6:if(!Y())return;if(a.slice_del())break}})(),a.cursor=a.limit-e,a.limit-a.cursor),r=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(b))&&(a.bra=a.cursor,Y()))switch(r){case 1:if(a.slice_del())break;return;case 2:var i=a.limit-a.cursor;if(!a.eq_s_b("s")&&(a.cursor=a.limit-i,!a.eq_s_b("t")))return;if(a.slice_del())break}})(),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(k)))switch(a.bra=a.cursor,r){case 1:if(!Y()){if(!z())return;var i=a.limit-a.cursor;if(q())return;a.cursor=a.limit-i}if(a.slice_del())break;return;case 2:if(!Y())return;if(!a.eq_s_b("l"))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.cursor=a.limit_backward,a.cursor);(()=>{if(p)for(;;){var r=a.cursor;r:{for(;;){var i=a.cursor;if(a.bra=a.cursor,a.eq_s("Y")){a.ket=a.cursor,a.cursor=i;break}if(a.cursor=i,a.cursor>=a.limit)break r;a.cursor++}if(a.slice_from("y"))continue;return}a.cursor=r;break}})(),a.cursor=e}}return!0},this.stemWord=function(r){return a.setCurrent(r),this.stem(),a.getCurrent()}};
+window.Stemmer = EnglishStemmer;
diff --git a/_static/minus.png b/_static/minus.png
new file mode 100644
index 00000000..d96755fd
Binary files /dev/null and b/_static/minus.png differ
diff --git a/_static/plus.png b/_static/plus.png
new file mode 100644
index 00000000..7107cec9
Binary files /dev/null and b/_static/plus.png differ
diff --git a/_static/pygments.css b/_static/pygments.css
new file mode 100644
index 00000000..9d1083bf
--- /dev/null
+++ b/_static/pygments.css
@@ -0,0 +1,250 @@
+.highlight pre { line-height: 125%; }
+.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #fdf2e2 }
+.highlight { background: #f2f2f2; color: #1E1E1E }
+.highlight .c { color: #515151 } /* Comment */
+.highlight .err { color: #D71835 } /* Error */
+.highlight .k { color: #8045E5 } /* Keyword */
+.highlight .l { color: #7F4707 } /* Literal */
+.highlight .n { color: #1E1E1E } /* Name */
+.highlight .o { color: #163 } /* Operator */
+.highlight .p { color: #1E1E1E } /* Punctuation */
+.highlight .ch { color: #515151 } /* Comment.Hashbang */
+.highlight .cm { color: #515151 } /* Comment.Multiline */
+.highlight .cp { color: #515151 } /* Comment.Preproc */
+.highlight .cpf { color: #515151 } /* Comment.PreprocFile */
+.highlight .c1 { color: #515151 } /* Comment.Single */
+.highlight .cs { color: #515151 } /* Comment.Special */
+.highlight .gd { color: #00749C } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gh { color: #00749C } /* Generic.Heading */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #00749C } /* Generic.Subheading */
+.highlight .kc { color: #8045E5 } /* Keyword.Constant */
+.highlight .kd { color: #8045E5 } /* Keyword.Declaration */
+.highlight .kn { color: #8045E5 } /* Keyword.Namespace */
+.highlight .kp { color: #8045E5 } /* Keyword.Pseudo */
+.highlight .kr { color: #8045E5 } /* Keyword.Reserved */
+.highlight .kt { color: #7F4707 } /* Keyword.Type */
+.highlight .ld { color: #7F4707 } /* Literal.Date */
+.highlight .m { color: #7F4707 } /* Literal.Number */
+.highlight .s { color: #163 } /* Literal.String */
+.highlight .na { color: #7F4707 } /* Name.Attribute */
+.highlight .nb { color: #7F4707 } /* Name.Builtin */
+.highlight .nc { color: #00749C } /* Name.Class */
+.highlight .no { color: #00749C } /* Name.Constant */
+.highlight .nd { color: #7F4707 } /* Name.Decorator */
+.highlight .ni { color: #163 } /* Name.Entity */
+.highlight .ne { color: #8045E5 } /* Name.Exception */
+.highlight .nf { color: #00749C } /* Name.Function */
+.highlight .nl { color: #7F4707 } /* Name.Label */
+.highlight .nn { color: #1E1E1E } /* Name.Namespace */
+.highlight .nx { color: #1E1E1E } /* Name.Other */
+.highlight .py { color: #00749C } /* Name.Property */
+.highlight .nt { color: #00749C } /* Name.Tag */
+.highlight .nv { color: #D71835 } /* Name.Variable */
+.highlight .ow { color: #8045E5 } /* Operator.Word */
+.highlight .pm { color: #1E1E1E } /* Punctuation.Marker */
+.highlight .w { color: #1E1E1E } /* Text.Whitespace */
+.highlight .mb { color: #7F4707 } /* Literal.Number.Bin */
+.highlight .mf { color: #7F4707 } /* Literal.Number.Float */
+.highlight .mh { color: #7F4707 } /* Literal.Number.Hex */
+.highlight .mi { color: #7F4707 } /* Literal.Number.Integer */
+.highlight .mo { color: #7F4707 } /* Literal.Number.Oct */
+.highlight .sa { color: #163 } /* Literal.String.Affix */
+.highlight .sb { color: #163 } /* Literal.String.Backtick */
+.highlight .sc { color: #163 } /* Literal.String.Char */
+.highlight .dl { color: #163 } /* Literal.String.Delimiter */
+.highlight .sd { color: #163 } /* Literal.String.Doc */
+.highlight .s2 { color: #163 } /* Literal.String.Double */
+.highlight .se { color: #163 } /* Literal.String.Escape */
+.highlight .sh { color: #163 } /* Literal.String.Heredoc */
+.highlight .si { color: #163 } /* Literal.String.Interpol */
+.highlight .sx { color: #163 } /* Literal.String.Other */
+.highlight .sr { color: #D71835 } /* Literal.String.Regex */
+.highlight .s1 { color: #163 } /* Literal.String.Single */
+.highlight .ss { color: #00749C } /* Literal.String.Symbol */
+.highlight .bp { color: #7F4707 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #00749C } /* Name.Function.Magic */
+.highlight .vc { color: #D71835 } /* Name.Variable.Class */
+.highlight .vg { color: #D71835 } /* Name.Variable.Global */
+.highlight .vi { color: #D71835 } /* Name.Variable.Instance */
+.highlight .vm { color: #7F4707 } /* Name.Variable.Magic */
+.highlight .il { color: #7F4707 } /* Literal.Number.Integer.Long */
+@media not print {
+body[data-theme="dark"] .highlight pre { line-height: 125%; }
+body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+body[data-theme="dark"] .highlight .hll { background-color: #404040 }
+body[data-theme="dark"] .highlight { background: #202020; color: #D0D0D0 }
+body[data-theme="dark"] .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body[data-theme="dark"] .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body[data-theme="dark"] .highlight .esc { color: #D0D0D0 } /* Escape */
+body[data-theme="dark"] .highlight .g { color: #D0D0D0 } /* Generic */
+body[data-theme="dark"] .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body[data-theme="dark"] .highlight .l { color: #D0D0D0 } /* Literal */
+body[data-theme="dark"] .highlight .n { color: #D0D0D0 } /* Name */
+body[data-theme="dark"] .highlight .o { color: #D0D0D0 } /* Operator */
+body[data-theme="dark"] .highlight .x { color: #D0D0D0 } /* Other */
+body[data-theme="dark"] .highlight .p { color: #D0D0D0 } /* Punctuation */
+body[data-theme="dark"] .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body[data-theme="dark"] .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body[data-theme="dark"] .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body[data-theme="dark"] .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body[data-theme="dark"] .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body[data-theme="dark"] .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body[data-theme="dark"] .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body[data-theme="dark"] .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body[data-theme="dark"] .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body[data-theme="dark"] .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body[data-theme="dark"] .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
+body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
+body[data-theme="dark"] .highlight .go { color: #CCC } /* Generic.Output */
+body[data-theme="dark"] .highlight .gp { color: #AAA } /* Generic.Prompt */
+body[data-theme="dark"] .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body[data-theme="dark"] .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body[data-theme="dark"] .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body[data-theme="dark"] .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body[data-theme="dark"] .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body[data-theme="dark"] .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body[data-theme="dark"] .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body[data-theme="dark"] .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body[data-theme="dark"] .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body[data-theme="dark"] .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body[data-theme="dark"] .highlight .m { color: #51B2FD } /* Literal.Number */
+body[data-theme="dark"] .highlight .s { color: #ED9D13 } /* Literal.String */
+body[data-theme="dark"] .highlight .na { color: #BBB } /* Name.Attribute */
+body[data-theme="dark"] .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body[data-theme="dark"] .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body[data-theme="dark"] .highlight .no { color: #40FFFF } /* Name.Constant */
+body[data-theme="dark"] .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body[data-theme="dark"] .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body[data-theme="dark"] .highlight .ne { color: #BBB } /* Name.Exception */
+body[data-theme="dark"] .highlight .nf { color: #71ADFF } /* Name.Function */
+body[data-theme="dark"] .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body[data-theme="dark"] .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body[data-theme="dark"] .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body[data-theme="dark"] .highlight .py { color: #D0D0D0 } /* Name.Property */
+body[data-theme="dark"] .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body[data-theme="dark"] .highlight .nv { color: #40FFFF } /* Name.Variable */
+body[data-theme="dark"] .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body[data-theme="dark"] .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body[data-theme="dark"] .highlight .w { color: #666 } /* Text.Whitespace */
+body[data-theme="dark"] .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body[data-theme="dark"] .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body[data-theme="dark"] .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body[data-theme="dark"] .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body[data-theme="dark"] .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body[data-theme="dark"] .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body[data-theme="dark"] .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body[data-theme="dark"] .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body[data-theme="dark"] .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body[data-theme="dark"] .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body[data-theme="dark"] .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body[data-theme="dark"] .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body[data-theme="dark"] .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body[data-theme="dark"] .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body[data-theme="dark"] .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body[data-theme="dark"] .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body[data-theme="dark"] .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body[data-theme="dark"] .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body[data-theme="dark"] .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body[data-theme="dark"] .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body[data-theme="dark"] .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body[data-theme="dark"] .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body[data-theme="dark"] .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body[data-theme="dark"] .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body[data-theme="dark"] .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
+@media (prefers-color-scheme: dark) {
+body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
+body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
+body:not([data-theme="light"]) .highlight { background: #202020; color: #D0D0D0 }
+body:not([data-theme="light"]) .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body:not([data-theme="light"]) .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body:not([data-theme="light"]) .highlight .esc { color: #D0D0D0 } /* Escape */
+body:not([data-theme="light"]) .highlight .g { color: #D0D0D0 } /* Generic */
+body:not([data-theme="light"]) .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body:not([data-theme="light"]) .highlight .l { color: #D0D0D0 } /* Literal */
+body:not([data-theme="light"]) .highlight .n { color: #D0D0D0 } /* Name */
+body:not([data-theme="light"]) .highlight .o { color: #D0D0D0 } /* Operator */
+body:not([data-theme="light"]) .highlight .x { color: #D0D0D0 } /* Other */
+body:not([data-theme="light"]) .highlight .p { color: #D0D0D0 } /* Punctuation */
+body:not([data-theme="light"]) .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body:not([data-theme="light"]) .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body:not([data-theme="light"]) .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body:not([data-theme="light"]) .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body:not([data-theme="light"]) .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body:not([data-theme="light"]) .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body:not([data-theme="light"]) .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body:not([data-theme="light"]) .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body:not([data-theme="light"]) .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body:not([data-theme="light"]) .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body:not([data-theme="light"]) .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
+body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
+body:not([data-theme="light"]) .highlight .go { color: #CCC } /* Generic.Output */
+body:not([data-theme="light"]) .highlight .gp { color: #AAA } /* Generic.Prompt */
+body:not([data-theme="light"]) .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body:not([data-theme="light"]) .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body:not([data-theme="light"]) .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body:not([data-theme="light"]) .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body:not([data-theme="light"]) .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body:not([data-theme="light"]) .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body:not([data-theme="light"]) .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body:not([data-theme="light"]) .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body:not([data-theme="light"]) .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body:not([data-theme="light"]) .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body:not([data-theme="light"]) .highlight .m { color: #51B2FD } /* Literal.Number */
+body:not([data-theme="light"]) .highlight .s { color: #ED9D13 } /* Literal.String */
+body:not([data-theme="light"]) .highlight .na { color: #BBB } /* Name.Attribute */
+body:not([data-theme="light"]) .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body:not([data-theme="light"]) .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body:not([data-theme="light"]) .highlight .no { color: #40FFFF } /* Name.Constant */
+body:not([data-theme="light"]) .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body:not([data-theme="light"]) .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body:not([data-theme="light"]) .highlight .ne { color: #BBB } /* Name.Exception */
+body:not([data-theme="light"]) .highlight .nf { color: #71ADFF } /* Name.Function */
+body:not([data-theme="light"]) .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body:not([data-theme="light"]) .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body:not([data-theme="light"]) .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body:not([data-theme="light"]) .highlight .py { color: #D0D0D0 } /* Name.Property */
+body:not([data-theme="light"]) .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body:not([data-theme="light"]) .highlight .nv { color: #40FFFF } /* Name.Variable */
+body:not([data-theme="light"]) .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body:not([data-theme="light"]) .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body:not([data-theme="light"]) .highlight .w { color: #666 } /* Text.Whitespace */
+body:not([data-theme="light"]) .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body:not([data-theme="light"]) .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body:not([data-theme="light"]) .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body:not([data-theme="light"]) .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body:not([data-theme="light"]) .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body:not([data-theme="light"]) .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body:not([data-theme="light"]) .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body:not([data-theme="light"]) .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body:not([data-theme="light"]) .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body:not([data-theme="light"]) .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body:not([data-theme="light"]) .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body:not([data-theme="light"]) .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body:not([data-theme="light"]) .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body:not([data-theme="light"]) .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body:not([data-theme="light"]) .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body:not([data-theme="light"]) .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body:not([data-theme="light"]) .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body:not([data-theme="light"]) .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body:not([data-theme="light"]) .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body:not([data-theme="light"]) .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body:not([data-theme="light"]) .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body:not([data-theme="light"]) .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body:not([data-theme="light"]) .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body:not([data-theme="light"]) .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body:not([data-theme="light"]) .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
+}
+}
\ No newline at end of file
diff --git a/_static/scripts/furo-extensions.js b/_static/scripts/furo-extensions.js
new file mode 100644
index 00000000..e69de29b
diff --git a/_static/scripts/furo.js b/_static/scripts/furo.js
new file mode 100644
index 00000000..87e1767f
--- /dev/null
+++ b/_static/scripts/furo.js
@@ -0,0 +1,3 @@
+/*! For license information please see furo.js.LICENSE.txt */
+(()=>{var t={856:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort(function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})}),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(function(){r(a),v.detect()})};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}}),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(856),e=n.n(t),o=null,r=null,c=document.documentElement.scrollTop;function s(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function l(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach(t=>{t.addEventListener("click",s)})}(),function(){let t=0,e=!1;window.addEventListener("scroll",function(n){t=window.scrollY,e||(window.requestAnimationFrame(function(){var n;(function(t){t>0?r.classList.add("scrolled"):r.classList.remove("scrolled")})(n=t),function(t){t<64?document.documentElement.classList.remove("show-back-to-top"):tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1}),e=!0)}),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);const e=r.getBoundingClientRect();return e.top+e.height+2.5*t+1}})}document.addEventListener("DOMContentLoaded",function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),l()})})()})();
+//# sourceMappingURL=furo.js.map
\ No newline at end of file
diff --git a/_static/scripts/furo.js.LICENSE.txt b/_static/scripts/furo.js.LICENSE.txt
new file mode 100644
index 00000000..1632189c
--- /dev/null
+++ b/_static/scripts/furo.js.LICENSE.txt
@@ -0,0 +1,7 @@
+/*!
+ * gumshoejs v5.1.2 (patched by @pradyunsg)
+ * A simple, framework-agnostic scrollspy script.
+ * (c) 2019 Chris Ferdinandi
+ * MIT License
+ * http://github.com/cferdinandi/gumshoe
+ */
diff --git a/_static/scripts/furo.js.map b/_static/scripts/furo.js.map
new file mode 100644
index 00000000..3b316f3a
--- /dev/null
+++ b/_static/scripts/furo.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"scripts/furo.js","mappings":";iCAAA,MAQWA,SAWS,IAAX,EAAAC,EACH,EAAAA,EACkB,oBAAXC,OACLA,OACAC,KAbO,EAAF,WACP,OAaJ,SAAUD,GACR,aAMA,IAAIE,EAAW,CAEbC,SAAU,SACVC,aAAc,SAGdC,QAAQ,EACRC,YAAa,SAGbC,OAAQ,EACRC,QAAQ,EAGRC,QAAQ,GA6BNC,EAAY,SAAUC,EAAMC,EAAMC,GAEpC,GAAKA,EAAOC,SAASL,OAArB,CAGA,IAAIM,EAAQ,IAAIC,YAAYL,EAAM,CAChCM,SAAS,EACTC,YAAY,EACZL,OAAQA,IAIVD,EAAKO,cAAcJ,EAVgB,CAWrC,EAOIK,EAAe,SAAUR,GAC3B,IAAIS,EAAW,EACf,GAAIT,EAAKU,aACP,KAAOV,GACLS,GAAYT,EAAKW,UACjBX,EAAOA,EAAKU,aAGhB,OAAOD,GAAY,EAAIA,EAAW,CACpC,EAMIG,EAAe,SAAUC,GACvBA,GACFA,EAASC,KAAK,SAAUC,EAAOC,GAG7B,OAFcR,EAAaO,EAAME,SACnBT,EAAaQ,EAAMC,UACF,EACxB,CACT,EAEJ,EAwCIC,EAAW,SAAUlB,EAAME,EAAUiB,GACvC,IAAIC,EAASpB,EAAKqB,wBACd1B,EAnCU,SAAUO,GAExB,MAA+B,mBAApBA,EAASP,OACX2B,WAAWpB,EAASP,UAItB2B,WAAWpB,EAASP,OAC7B,CA2Be4B,CAAUrB,GACvB,OAAIiB,EAEAK,SAASJ,EAAOD,OAAQ,KACvB/B,EAAOqC,aAAeC,SAASC,gBAAgBC,cAG7CJ,SAASJ,EAAOS,IAAK,KAAOlC,CACrC,EAMImC,EAAa,WACf,OACEC,KAAKC,KAAK5C,EAAOqC,YAAcrC,EAAO6C,cAnCjCF,KAAKG,IACVR,SAASS,KAAKC,aACdV,SAASC,gBAAgBS,aACzBV,SAASS,KAAKE,aACdX,SAASC,gBAAgBU,aACzBX,SAASS,KAAKP,aACdF,SAASC,gBAAgBC,aAkC7B,EAmBIU,EAAY,SAAUzB,EAAUX,GAClC,IAAIqC,EAAO1B,EAASA,EAAS2B,OAAS,GACtC,GAbgB,SAAUC,EAAMvC,GAChC,SAAI4B,MAAgBZ,EAASuB,EAAKxB,QAASf,GAAU,GAEvD,CAUMwC,CAAYH,EAAMrC,GAAW,OAAOqC,EACxC,IAAK,IAAII,EAAI9B,EAAS2B,OAAS,EAAGG,GAAK,EAAGA,IACxC,GAAIzB,EAASL,EAAS8B,GAAG1B,QAASf,GAAW,OAAOW,EAAS8B,EAEjE,EAOIC,EAAmB,SAAUC,EAAK3C,GAEpC,GAAKA,EAAST,QAAWoD,EAAIC,WAA7B,CAGA,IAAIC,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASR,aAG7BkD,EAAiBG,EAAI7C,GAV0B,CAWjD,EAOIiD,EAAa,SAAUC,EAAOlD,GAEhC,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASX,UAC7B6D,EAAMnC,QAAQgC,UAAUC,OAAOhD,EAASV,cAGxCoD,EAAiBG,EAAI7C,GAGrBJ,EAAU,oBAAqBiD,EAAI,CACjCM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,EAOIoD,EAAiB,SAAUT,EAAK3C,GAElC,GAAKA,EAAST,OAAd,CAGA,IAAIsD,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASR,aAG1B4D,EAAeP,EAAI7C,GAVS,CAW9B,EA6LA,OA1JkB,SAAUsD,EAAUC,GAKpC,IACIC,EAAU7C,EAAU8C,EAASC,EAAS1D,EADtC2D,EAAa,CAUjBA,MAAmB,WAEjBH,EAAWhC,SAASoC,iBAAiBN,GAGrC3C,EAAW,GAGXkD,MAAMC,UAAUC,QAAQC,KAAKR,EAAU,SAAUjB,GAE/C,IAAIxB,EAAUS,SAASyC,eACrBC,mBAAmB3B,EAAK4B,KAAKC,OAAO,KAEjCrD,GAGLJ,EAAS0D,KAAK,CACZ1B,IAAKJ,EACLxB,QAASA,GAEb,GAGAL,EAAaC,EACf,EAKAgD,OAAoB,WAElB,IAAIW,EAASlC,EAAUzB,EAAUX,GAG5BsE,EASDb,GAAWa,EAAOvD,UAAY0C,EAAQ1C,UAG1CkC,EAAWQ,EAASzD,GAzFT,SAAUkD,EAAOlD,GAE9B,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASX,UAC1B6D,EAAMnC,QAAQgC,UAAUM,IAAIrD,EAASV,cAGrC8D,EAAeP,EAAI7C,GAGnBJ,EAAU,kBAAmBiD,EAAI,CAC/BM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,CAqEIuE,CAASD,EAAQtE,GAGjByD,EAAUa,GAfJb,IACFR,EAAWQ,EAASzD,GACpByD,EAAU,KAchB,GAMIe,EAAgB,SAAUvE,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,sBAAsBf,EAAWgB,OACpD,EAMIC,EAAgB,SAAU3E,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,sBAAsB,WACrChE,EAAaC,GACbgD,EAAWgB,QACb,EACF,EAkDA,OA7CAhB,EAAWkB,QAAU,WAEfpB,GACFR,EAAWQ,EAASzD,GAItBd,EAAO4F,oBAAoB,SAAUN,GAAe,GAChDxE,EAASN,QACXR,EAAO4F,oBAAoB,SAAUF,GAAe,GAItDjE,EAAW,KACX6C,EAAW,KACXC,EAAU,KACVC,EAAU,KACV1D,EAAW,IACb,EAOEA,EA3XS,WACX,IAAI+E,EAAS,CAAC,EAOd,OANAlB,MAAMC,UAAUC,QAAQC,KAAKgB,UAAW,SAAUC,GAChD,IAAK,IAAIC,KAAOD,EAAK,CACnB,IAAKA,EAAIE,eAAeD,GAAM,OAC9BH,EAAOG,GAAOD,EAAIC,EACpB,CACF,GACOH,CACT,CAkXeK,CAAOhG,EAAUmE,GAAW,CAAC,GAGxCI,EAAW0B,QAGX1B,EAAWgB,SAGXzF,EAAOoG,iBAAiB,SAAUd,GAAe,GAC7CxE,EAASN,QACXR,EAAOoG,iBAAiB,SAAUV,GAAe,GAS9CjB,CACT,CAOF,CArcW4B,CAAQvG,EAChB,UAFM,SAEN,oB,GCXDwG,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAU1B,KAAK8B,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CCrBAJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAInB,KAAOmB,EACXZ,EAAoBa,EAAED,EAAYnB,KAASO,EAAoBa,EAAET,EAASX,IAC5EqB,OAAOC,eAAeX,EAASX,EAAK,CAAEuB,YAAY,EAAMC,IAAKL,EAAWnB,MCJ3EO,EAAoBxG,EAAI,WACvB,GAA0B,iBAAf0H,WAAyB,OAAOA,WAC3C,IACC,OAAOxH,MAAQ,IAAIyH,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAX3H,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBuG,EAAoBa,EAAI,CAACrB,EAAK6B,IAAUP,OAAOzC,UAAUqB,eAAenB,KAAKiB,EAAK6B,G,yCCK9EC,EAAY,KACZC,EAAS,KACTC,EAAgBzF,SAASC,gBAAgByF,UA4E7C,SAASC,IACP,MAAMC,EAAeC,aAAaC,QAAQ,UAAY,OAZxD,IAAkBC,EACH,WADGA,EAaIrI,OAAOsI,WAAW,gCAAgCC,QAI/C,SAAjBL,EACO,QACgB,SAAhBA,EACA,OAEA,OAIU,SAAjBA,EACO,OACgB,QAAhBA,EACA,QAEA,SA9BoB,SAATG,GAA4B,SAATA,IACzCG,QAAQC,MAAM,2BAA2BJ,yBACzCA,EAAO,QAGT/F,SAASS,KAAK2F,QAAQC,MAAQN,EAC9BF,aAAaS,QAAQ,QAASP,GAC9BG,QAAQK,IAAI,cAAcR,UA0B5B,CAmDA,SAASlC,KART,WAEE,MAAM2C,EAAUxG,SAASyG,uBAAuB,gBAChDpE,MAAMqE,KAAKF,GAASjE,QAASoE,IAC3BA,EAAI7C,iBAAiB,QAAS6B,IAElC,CAGEiB,GA/CF,WAEE,IAAIC,EAA6B,EAC7BC,GAAU,EAEdpJ,OAAOoG,iBAAiB,SAAU,SAAUuB,GAC1CwB,EAA6BnJ,OAAOqJ,QAE/BD,IACHpJ,OAAOwF,sBAAsB,WAzDnC,IAAuB8D,GArDvB,SAAgCA,GAC1BA,EAAY,EACdxB,EAAOjE,UAAUM,IAAI,YAErB2D,EAAOjE,UAAUC,OAAO,WAE5B,EAgDEyF,CADqBD,EA0DDH,GAvGtB,SAAmCG,GAC7BA,EAXmB,GAYrBhH,SAASC,gBAAgBsB,UAAUC,OAAO,oBAEtCwF,EAAYvB,EACdzF,SAASC,gBAAgBsB,UAAUM,IAAI,oBAC9BmF,EAAYvB,GACrBzF,SAASC,gBAAgBsB,UAAUC,OAAO,oBAG9CiE,EAAgBuB,CAClB,CAoCEE,CAA0BF,GAlC5B,SAA6BA,GACT,OAAdzB,IAKa,GAAbyB,EACFzB,EAAU4B,SAAS,EAAG,GAGtB9G,KAAKC,KAAK0G,IACV3G,KAAK+G,MAAMpH,SAASC,gBAAgBS,aAAehD,OAAOqC,aAE1DwF,EAAU4B,SAAS,EAAG5B,EAAU7E,cAGhBV,SAASqH,cAAc,mBAc3C,CAKEC,CAAoBN,GAwDdF,GAAU,CACZ,GAEAA,GAAU,EAEd,GACApJ,OAAO6J,QACT,CA8BEC,GA3BkB,OAAdjC,GAKJ,IAAI,IAAJ,CAAY,cAAe,CACzBrH,QAAQ,EACRuJ,WAAW,EACX5J,SAAU,iBACVI,OAAQ,KACN,IAAIyJ,EAAM9H,WAAW+H,iBAAiB3H,SAASC,iBAAiB2H,UAChE,MAAMC,EAAarC,EAAO7F,wBAC1B,OAAOkI,EAAW1H,IAAM0H,EAAWC,OAAS,IAAMJ,EAAM,IAiB9D,CAcA1H,SAAS8D,iBAAiB,mBAT1B,WACE9D,SAASS,KAAKW,WAAWG,UAAUC,OAAO,SAE1CgE,EAASxF,SAASqH,cAAc,UAChC9B,EAAYvF,SAASqH,cAAc,eAEnCxD,GACF,E","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader(positionY) {\n if (positionY > 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader(positionY);\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n const headerRect = header.getBoundingClientRect();\n return headerRect.top + headerRect.height + 2.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","scrollHandlerForHeader","scrollHandlerForBackToTop","scrollTo","floor","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","headerRect","height"],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/searchtools.js b/_static/searchtools.js
new file mode 100644
index 00000000..e29b1c75
--- /dev/null
+++ b/_static/searchtools.js
@@ -0,0 +1,693 @@
+/*
+ * Sphinx JavaScript utilities for the full-text search.
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
+ // and returns the new score.
+ /*
+ score: result => {
+ const [docname, title, anchor, descr, score, filename, kind] = result
+ return score
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {
+ 0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5, // used to be unimportantResults
+ },
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ partialTitle: 7,
+ // query found in terms
+ term: 5,
+ partialTerm: 2,
+ };
+}
+
+// Global search result kind enum, used by themes to style search results.
+// prettier-ignore
+class SearchResultKind {
+ static get index() { return "index"; }
+ static get object() { return "object"; }
+ static get text() { return "text"; }
+ static get title() { return "title"; }
+}
+
+const _removeChildren = (element) => {
+ while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _escapeHTML = (text) => {
+ return text
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'");
+};
+
+const _displayItem = (item, searchTerms, highlightTerms) => {
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+ const contentRoot = document.documentElement.dataset.content_root;
+
+ const [docName, title, anchor, descr, score, _filename, kind] = item;
+
+ let listItem = document.createElement("li");
+ // Add a class representing the item's type:
+ // can be used by a theme's CSS selector for styling
+ // See SearchResultKind for the class names.
+ listItem.classList.add(`kind-${kind}`);
+ let requestUrl;
+ let linkUrl;
+ if (docBuilder === "dirhtml") {
+ // dirhtml builder
+ let dirname = docName + "/";
+ if (dirname.match(/\/index\/$/))
+ dirname = dirname.substring(0, dirname.length - 6);
+ else if (dirname === "index/") dirname = "";
+ requestUrl = contentRoot + dirname;
+ linkUrl = requestUrl;
+ } else {
+ // normal html builders
+ requestUrl = contentRoot + docName + docFileSuffix;
+ linkUrl = docName + docLinkSuffix;
+ }
+ let linkEl = listItem.appendChild(document.createElement("a"));
+ linkEl.href = linkUrl + anchor;
+ linkEl.dataset.score = score;
+ linkEl.innerHTML = _escapeHTML(title);
+ if (descr) {
+ listItem.appendChild(document.createElement("span")).innerHTML =
+ ` (${_escapeHTML(descr)})`;
+ // highlight search terms in the description
+ if (SPHINX_HIGHLIGHT_ENABLED)
+ // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
+ highlightTerms.forEach((term) =>
+ _highlightText(listItem, term, "highlighted"),
+ );
+ } else if (showSearchSummary)
+ fetch(requestUrl)
+ .then((responseData) => responseData.text())
+ .then((data) => {
+ if (data)
+ listItem.appendChild(
+ Search.makeSearchSummary(data, searchTerms, anchor),
+ );
+ // highlight search terms in the summary
+ if (SPHINX_HIGHLIGHT_ENABLED)
+ // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
+ highlightTerms.forEach((term) =>
+ _highlightText(listItem, term, "highlighted"),
+ );
+ });
+ Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+ Search.stopPulse();
+ Search.title.innerText = _("Search Results");
+ if (!resultCount)
+ Search.status.innerText = Documentation.gettext(
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.",
+ );
+ else
+ Search.status.innerText = Documentation.ngettext(
+ "Search finished, found one page matching the search query.",
+ "Search finished, found ${resultCount} pages matching the search query.",
+ resultCount,
+ ).replace("${resultCount}", resultCount);
+};
+const _displayNextItem = (
+ results,
+ resultCount,
+ searchTerms,
+ highlightTerms,
+) => {
+ // results left, load the summary and display it
+ // this is intended to be dynamic (don't sub resultsCount)
+ if (results.length) {
+ _displayItem(results.pop(), searchTerms, highlightTerms);
+ setTimeout(
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
+ 5,
+ );
+ }
+ // search finished, update title and status message
+ else _finishSearch(resultCount);
+};
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+ var splitQuery = (query) =>
+ query
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+ .filter((term) => term); // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+ _index: null,
+ _queued_query: null,
+ _pulse_status: -1,
+
+ htmlToText: (htmlString, anchor) => {
+ const htmlElement = new DOMParser().parseFromString(
+ htmlString,
+ "text/html",
+ );
+ for (const removalQuery of [".headerlink", "script", "style"]) {
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => {
+ el.remove();
+ });
+ }
+ if (anchor) {
+ const anchorContent = htmlElement.querySelector(
+ `[role="main"] ${anchor}`,
+ );
+ if (anchorContent) return anchorContent.textContent;
+
+ console.warn(
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`,
+ );
+ }
+
+ // if anchor not specified or not found, fall back to main content
+ const docContent = htmlElement.querySelector('[role="main"]');
+ if (docContent) return docContent.textContent;
+
+ console.warn(
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template.",
+ );
+ return "";
+ },
+
+ init: () => {
+ const query = new URLSearchParams(window.location.search).get("q");
+ document
+ .querySelectorAll('input[name="q"]')
+ .forEach((el) => (el.value = query));
+ if (query) Search.performSearch(query);
+ },
+
+ loadIndex: (url) =>
+ (document.body.appendChild(document.createElement("script")).src = url),
+
+ setIndex: (index) => {
+ Search._index = index;
+ if (Search._queued_query !== null) {
+ const query = Search._queued_query;
+ Search._queued_query = null;
+ Search.query(query);
+ }
+ },
+
+ hasIndex: () => Search._index !== null,
+
+ deferQuery: (query) => (Search._queued_query = query),
+
+ stopPulse: () => (Search._pulse_status = -1),
+
+ startPulse: () => {
+ if (Search._pulse_status >= 0) return;
+
+ const pulse = () => {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something (or wait until index is loaded)
+ */
+ performSearch: (query) => {
+ // create the required interface elements
+ const searchText = document.createElement("h2");
+ searchText.textContent = _("Searching");
+ const searchSummary = document.createElement("p");
+ searchSummary.classList.add("search-summary");
+ searchSummary.innerText = "";
+ const searchList = document.createElement("ul");
+ searchList.setAttribute("role", "list");
+ searchList.classList.add("search");
+
+ const out = document.getElementById("search-results");
+ Search.title = out.appendChild(searchText);
+ Search.dots = Search.title.appendChild(document.createElement("span"));
+ Search.status = out.appendChild(searchSummary);
+ Search.output = out.appendChild(searchList);
+
+ const searchProgress = document.getElementById("search-progress");
+ // Some themes don't use the search progress node
+ if (searchProgress) {
+ searchProgress.innerText = _("Preparing search...");
+ }
+ Search.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (Search.hasIndex()) Search.query(query);
+ else Search.deferQuery(query);
+ },
+
+ _parseQuery: (query) => {
+ // stem the search terms and add them to the correct list
+ const stemmer = new Stemmer();
+ const searchTerms = new Set();
+ const excludedTerms = new Set();
+ const highlightTerms = new Set();
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+ splitQuery(query.trim()).forEach((queryTerm) => {
+ const queryTermLower = queryTerm.toLowerCase();
+
+ // maybe skip this "word"
+ // stopwords set is from language_data.js
+ if (stopwords.has(queryTermLower) || queryTerm.match(/^\d+$/)) return;
+
+ // stem the word
+ let word = stemmer.stemWord(queryTermLower);
+ // select the correct list
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
+ else {
+ searchTerms.add(word);
+ highlightTerms.add(queryTermLower);
+ }
+ });
+
+ if (SPHINX_HIGHLIGHT_ENABLED) {
+ // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
+ localStorage.setItem(
+ "sphinx_highlight_terms",
+ [...highlightTerms].join(" "),
+ );
+ }
+
+ // console.debug("SEARCH: searching for:");
+ // console.info("required: ", [...searchTerms]);
+ // console.info("excluded: ", [...excludedTerms]);
+
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ _performSearch: (
+ query,
+ searchTerms,
+ excludedTerms,
+ highlightTerms,
+ objectTerms,
+ ) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // Collect multiple result groups to be sorted separately and then ordered.
+ // Each is an array of [docname, title, anchor, descr, score, filename, kind].
+ const normalResults = [];
+ const nonMainIndexResults = [];
+
+ _removeChildren(document.getElementById("search-progress"));
+
+ const queryLower = query.toLowerCase().trim();
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
+ if (
+ title.toLowerCase().trim().includes(queryLower)
+ && queryLower.length >= title.length / 2
+ ) {
+ for (const [file, id] of foundTitles) {
+ const score = Math.round(
+ (Scorer.title * queryLower.length) / title.length,
+ );
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
+ normalResults.push([
+ docNames[file],
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
+ id !== null ? "#" + id : "",
+ null,
+ score + boost,
+ filenames[file],
+ SearchResultKind.title,
+ ]);
+ }
+ }
+ }
+
+ // search for explicit entries in index directives
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+ if (entry.includes(queryLower) && queryLower.length >= entry.length / 2) {
+ for (const [file, id, isMain] of foundEntries) {
+ const score = Math.round((100 * queryLower.length) / entry.length);
+ const result = [
+ docNames[file],
+ titles[file],
+ id ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ SearchResultKind.index,
+ ];
+ if (isMain) {
+ normalResults.push(result);
+ } else {
+ nonMainIndexResults.push(result);
+ }
+ }
+ }
+ }
+
+ // lookup as object
+ objectTerms.forEach((term) =>
+ normalResults.push(...Search.performObjectSearch(term, objectTerms)),
+ );
+
+ // lookup as search terms in fulltext
+ normalResults.push(
+ ...Search.performTermsSearch(searchTerms, excludedTerms),
+ );
+
+ // let the scorer override scores with a custom scoring function
+ if (Scorer.score) {
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+ }
+
+ // Sort each group of results by score and then alphabetically by name.
+ normalResults.sort(_orderResultsByScoreThenName);
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+ // Combine the result groups in (reverse) order.
+ // Non-main index entries are typically arbitrary cross-references,
+ // so display them after other results.
+ let results = [...nonMainIndexResults, ...normalResults];
+
+ // remove duplicate search results
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+ let seen = new Set();
+ results = results.reverse().reduce((acc, result) => {
+ let resultStr = result
+ .slice(0, 4)
+ .concat([result[5]])
+ .map((v) => String(v))
+ .join(",");
+ if (!seen.has(resultStr)) {
+ acc.push(result);
+ seen.add(resultStr);
+ }
+ return acc;
+ }, []);
+
+ return results.reverse();
+ },
+
+ query: (query) => {
+ const [
+ searchQuery,
+ searchTerms,
+ excludedTerms,
+ highlightTerms,
+ objectTerms,
+ ] = Search._parseQuery(query);
+ const results = Search._performSearch(
+ searchQuery,
+ searchTerms,
+ excludedTerms,
+ highlightTerms,
+ objectTerms,
+ );
+
+ // for debugging
+ //Search.lastresults = results.slice(); // a copy
+ // console.info("search results:", Search.lastresults);
+
+ // print the results
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
+ },
+
+ /**
+ * search for object names
+ */
+ performObjectSearch: (object, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const objects = Search._index.objects;
+ const objNames = Search._index.objnames;
+ const titles = Search._index.titles;
+
+ const results = [];
+
+ const objectSearchCallback = (prefix, match) => {
+ const name = match[4];
+ const fullname = (prefix ? prefix + "." : "") + name;
+ const fullnameLower = fullname.toLowerCase();
+ if (fullnameLower.indexOf(object) < 0) return;
+
+ let score = 0;
+ const parts = fullnameLower.split(".");
+
+ // check for different match types: exact matches of full name or
+ // "last name" (i.e. last dotted part)
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
+ score += Scorer.objNameMatch;
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
+ score += Scorer.objPartialMatch; // matches in last name
+
+ const objName = objNames[match[1]][2];
+ const title = titles[match[0]];
+
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ const otherTerms = new Set(objectTerms);
+ otherTerms.delete(object);
+ if (otherTerms.size > 0) {
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+ if (
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+ )
+ return;
+ }
+
+ let anchor = match[3];
+ if (anchor === "") anchor = fullname;
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+ const descr = objName + _(", in ") + title;
+
+ // add custom score for some objects according to scorer
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
+ score += Scorer.objPrio[match[2]];
+ else score += Scorer.objPrioDefault;
+
+ results.push([
+ docNames[match[0]],
+ fullname,
+ "#" + anchor,
+ descr,
+ score,
+ filenames[match[0]],
+ SearchResultKind.object,
+ ]);
+ };
+ Object.keys(objects).forEach((prefix) =>
+ objects[prefix].forEach((array) => objectSearchCallback(prefix, array)),
+ );
+ return results;
+ },
+
+ /**
+ * search for full-text terms in the index
+ */
+ performTermsSearch: (searchTerms, excludedTerms) => {
+ // prepare search
+ const terms = Search._index.terms;
+ const titleTerms = Search._index.titleterms;
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+
+ const scoreMap = new Map();
+ const fileMap = new Map();
+
+ // perform the search on the required terms
+ searchTerms.forEach((word) => {
+ const files = [];
+ // find documents, if any, containing the query word in their text/title term indices
+ // use Object.hasOwnProperty to avoid mismatching against prototype properties
+ const arr = [
+ {
+ files: terms.hasOwnProperty(word) ? terms[word] : undefined,
+ score: Scorer.term,
+ },
+ {
+ files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined,
+ score: Scorer.title,
+ },
+ ];
+ // add support for partial matches
+ if (word.length > 2) {
+ const escapedWord = _escapeRegExp(word);
+ if (!terms.hasOwnProperty(word)) {
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ }
+ if (!titleTerms.hasOwnProperty(word)) {
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+ });
+ }
+ }
+
+ // no match but word was a required one
+ if (arr.every((record) => record.files === undefined)) return;
+
+ // found search word in contents
+ arr.forEach((record) => {
+ if (record.files === undefined) return;
+
+ let recordFiles = record.files;
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
+ files.push(...recordFiles);
+
+ // set score for the word in each file
+ recordFiles.forEach((file) => {
+ if (!scoreMap.has(file)) scoreMap.set(file, new Map());
+ const fileScores = scoreMap.get(file);
+ fileScores.set(word, record.score);
+ });
+ });
+
+ // create the mapping
+ files.forEach((file) => {
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
+ else if (fileMap.get(file).indexOf(word) === -1)
+ fileMap.get(file).push(word);
+ });
+ });
+
+ // now check if the files don't contain excluded terms
+ const results = [];
+ for (const [file, wordList] of fileMap) {
+ // check if all requirements are matched
+
+ // as search terms with length < 3 are discarded
+ const filteredTermCount = [...searchTerms].filter(
+ (term) => term.length > 2,
+ ).length;
+ if (
+ wordList.length !== searchTerms.size
+ && wordList.length !== filteredTermCount
+ )
+ continue;
+
+ // ensure that none of the excluded terms is in the search result
+ if (
+ [...excludedTerms].some(
+ (term) =>
+ terms[term] === file
+ || titleTerms[term] === file
+ || (terms[term] || []).includes(file)
+ || (titleTerms[term] || []).includes(file),
+ )
+ )
+ break;
+
+ // select one (max) score for the file.
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
+ // add result to the result list
+ results.push([
+ docNames[file],
+ titles[file],
+ "",
+ null,
+ score,
+ filenames[file],
+ SearchResultKind.text,
+ ]);
+ }
+ return results;
+ },
+
+ /**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words.
+ */
+ makeSearchSummary: (htmlText, keywords, anchor) => {
+ const text = Search.htmlToText(htmlText, anchor);
+ if (text === "") return null;
+
+ const textLower = text.toLowerCase();
+ const actualStartPosition = [...keywords]
+ .map((k) => textLower.indexOf(k.toLowerCase()))
+ .filter((i) => i > -1)
+ .slice(-1)[0];
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+ const top = startWithContext === 0 ? "" : "...";
+ const tail = startWithContext + 240 < text.length ? "..." : "";
+
+ let summary = document.createElement("p");
+ summary.classList.add("context");
+ summary.textContent =
+ top + text.substr(startWithContext, 240).trim() + tail;
+
+ return summary;
+ },
+};
+
+_ready(Search.init);
diff --git a/_static/skeleton.css b/_static/skeleton.css
new file mode 100644
index 00000000..467c878c
--- /dev/null
+++ b/_static/skeleton.css
@@ -0,0 +1,296 @@
+/* Some sane resets. */
+html {
+ height: 100%;
+}
+
+body {
+ margin: 0;
+ min-height: 100%;
+}
+
+/* All the flexbox magic! */
+body,
+.sb-announcement,
+.sb-content,
+.sb-main,
+.sb-container,
+.sb-container__inner,
+.sb-article-container,
+.sb-footer-content,
+.sb-header,
+.sb-header-secondary,
+.sb-footer {
+ display: flex;
+}
+
+/* These order things vertically */
+body,
+.sb-main,
+.sb-article-container {
+ flex-direction: column;
+}
+
+/* Put elements in the center */
+.sb-header,
+.sb-header-secondary,
+.sb-container,
+.sb-content,
+.sb-footer,
+.sb-footer-content {
+ justify-content: center;
+}
+/* Put elements at the ends */
+.sb-article-container {
+ justify-content: space-between;
+}
+
+/* These elements grow. */
+.sb-main,
+.sb-content,
+.sb-container,
+article {
+ flex-grow: 1;
+}
+
+/* Because padding making this wider is not fun */
+article {
+ box-sizing: border-box;
+}
+
+/* The announcements element should never be wider than the page. */
+.sb-announcement {
+ max-width: 100%;
+}
+
+.sb-sidebar-primary,
+.sb-sidebar-secondary {
+ flex-shrink: 0;
+ width: 17rem;
+}
+
+.sb-announcement__inner {
+ justify-content: center;
+
+ box-sizing: border-box;
+ height: 3rem;
+
+ overflow-x: auto;
+ white-space: nowrap;
+}
+
+/* Sidebars, with checkbox-based toggle */
+.sb-sidebar-primary,
+.sb-sidebar-secondary {
+ position: fixed;
+ height: 100%;
+ top: 0;
+}
+
+.sb-sidebar-primary {
+ left: -17rem;
+ transition: left 250ms ease-in-out;
+}
+.sb-sidebar-secondary {
+ right: -17rem;
+ transition: right 250ms ease-in-out;
+}
+
+.sb-sidebar-toggle {
+ display: none;
+}
+.sb-sidebar-overlay {
+ position: fixed;
+ top: 0;
+ width: 0;
+ height: 0;
+
+ transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease;
+
+ opacity: 0;
+ background-color: rgba(0, 0, 0, 0.54);
+}
+
+#sb-sidebar-toggle--primary:checked
+ ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"],
+#sb-sidebar-toggle--secondary:checked
+ ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] {
+ width: 100%;
+ height: 100%;
+ opacity: 1;
+ transition: width 0ms ease, height 0ms ease, opacity 250ms ease;
+}
+
+#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary {
+ left: 0;
+}
+#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary {
+ right: 0;
+}
+
+/* Full-width mode */
+.drop-secondary-sidebar-for-full-width-content
+ .hide-when-secondary-sidebar-shown {
+ display: none !important;
+}
+.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary {
+ display: none !important;
+}
+
+/* Mobile views */
+.sb-page-width {
+ width: 100%;
+}
+
+.sb-article-container,
+.sb-footer-content__inner,
+.drop-secondary-sidebar-for-full-width-content .sb-article,
+.drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 100vw;
+}
+
+.sb-article,
+.match-content-width {
+ padding: 0 1rem;
+ box-sizing: border-box;
+}
+
+@media (min-width: 32rem) {
+ .sb-article,
+ .match-content-width {
+ padding: 0 2rem;
+ }
+}
+
+/* Tablet views */
+@media (min-width: 42rem) {
+ .sb-article-container {
+ width: auto;
+ }
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 42rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 42rem;
+ }
+}
+@media (min-width: 46rem) {
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 46rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 46rem;
+ }
+}
+@media (min-width: 50rem) {
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 50rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 50rem;
+ }
+}
+
+/* Tablet views */
+@media (min-width: 59rem) {
+ .sb-sidebar-secondary {
+ position: static;
+ }
+ .hide-when-secondary-sidebar-shown {
+ display: none !important;
+ }
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 59rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 42rem;
+ }
+}
+@media (min-width: 63rem) {
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 63rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 46rem;
+ }
+}
+@media (min-width: 67rem) {
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 67rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 50rem;
+ }
+}
+
+/* Desktop views */
+@media (min-width: 76rem) {
+ .sb-sidebar-primary {
+ position: static;
+ }
+ .hide-when-primary-sidebar-shown {
+ display: none !important;
+ }
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 59rem;
+ }
+ .sb-article,
+ .match-content-width {
+ width: 42rem;
+ }
+}
+
+/* Full desktop views */
+@media (min-width: 80rem) {
+ .sb-article,
+ .match-content-width {
+ width: 46rem;
+ }
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 63rem;
+ }
+}
+
+@media (min-width: 84rem) {
+ .sb-article,
+ .match-content-width {
+ width: 50rem;
+ }
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 67rem;
+ }
+}
+
+@media (min-width: 88rem) {
+ .sb-footer-content__inner,
+ .drop-secondary-sidebar-for-full-width-content .sb-article,
+ .drop-secondary-sidebar-for-full-width-content .match-content-width {
+ width: 67rem;
+ }
+ .sb-page-width {
+ width: 88rem;
+ }
+}
diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js
new file mode 100644
index 00000000..a74e103a
--- /dev/null
+++ b/_static/sphinx_highlight.js
@@ -0,0 +1,159 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true;
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const val = node.nodeValue;
+ const parent = node.parentNode;
+ const pos = val.toLowerCase().indexOf(text);
+ if (
+ pos >= 0
+ && !parent.classList.contains(className)
+ && !parent.classList.contains("nohighlight")
+ ) {
+ let span;
+
+ const closestNode = parent.closest("body, svg, foreignObject");
+ const isInSVG = closestNode && closestNode.matches("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.classList.add(className);
+ }
+
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ const rest = document.createTextNode(val.substr(pos + text.length));
+ parent.insertBefore(span, parent.insertBefore(rest, node.nextSibling));
+ node.nodeValue = val.substr(0, pos);
+ /* There may be more occurrences of search term in this node. So call this
+ * function recursively on the remaining fragment.
+ */
+ _highlight(rest, addItems, text, className);
+
+ if (isInSVG) {
+ const rect = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "rect",
+ );
+ const bbox = parent.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute("class", className);
+ addItems.push({ parent: parent, target: rect });
+ }
+ }
+ } else if (node.matches && !node.matches("button, select, textarea")) {
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+ }
+};
+const _highlightText = (thisNode, text, className) => {
+ let addItems = [];
+ _highlight(thisNode, addItems, text, className);
+ addItems.forEach((obj) =>
+ obj.parent.insertAdjacentElement("beforebegin", obj.target),
+ );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+ /**
+ * highlight the search words provided in localstorage in the text
+ */
+ highlightSearchWords: () => {
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
+
+ // get and clear terms from localstorage
+ const url = new URL(window.location);
+ const highlight =
+ localStorage.getItem("sphinx_highlight_terms")
+ || url.searchParams.get("highlight")
+ || "";
+ localStorage.removeItem("sphinx_highlight_terms");
+ // Update history only if '?highlight' is present; otherwise it
+ // clears text fragments (not set in window.location by the browser)
+ if (url.searchParams.has("highlight")) {
+ url.searchParams.delete("highlight");
+ window.history.replaceState({}, "", url);
+ }
+
+ // get individual terms from highlight string
+ const terms = highlight
+ .toLowerCase()
+ .split(/\s+/)
+ .filter((x) => x);
+ if (terms.length === 0) return; // nothing to do
+
+ // There should never be more than one element matching "div.body"
+ const divBody = document.querySelectorAll("div.body");
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
+ window.setTimeout(() => {
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
+ }, 10);
+
+ const searchBox = document.getElementById("searchbox");
+ if (searchBox === null) return;
+ searchBox.appendChild(
+ document
+ .createRange()
+ .createContextualFragment(
+ ''
+ + ''
+ + _("Hide Search Matches")
+ + "
",
+ ),
+ );
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords: () => {
+ document
+ .querySelectorAll("#searchbox .highlight-link")
+ .forEach((el) => el.remove());
+ document
+ .querySelectorAll("span.highlighted")
+ .forEach((el) => el.classList.remove("highlighted"));
+ localStorage.removeItem("sphinx_highlight_terms");
+ },
+
+ initEscapeListener: () => {
+ // only install a listener if it is really needed
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName))
+ return;
+ // bail with special keys
+ if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)
+ return;
+ if (
+ DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ && event.key === "Escape"
+ ) {
+ SphinxHighlight.hideSearchWords();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+_ready(() => {
+ /* Do not call highlightSearchWords() when we are on the search page.
+ * It will highlight words from the *previous* search query.
+ */
+ if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
+ SphinxHighlight.initEscapeListener();
+});
diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css
new file mode 100644
index 00000000..2d74267f
--- /dev/null
+++ b/_static/styles/furo-extensions.css
@@ -0,0 +1,2 @@
+#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0s}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}
+/*# sourceMappingURL=furo-extensions.css.map*/
\ No newline at end of file
diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map
new file mode 100644
index 00000000..68fb7fd0
--- /dev/null
+++ b/_static/styles/furo-extensions.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAEE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cAIA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,mBACA,CACA,wCACE,cAEJ,8BACE,UCzCN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/styles/furo.css b/_static/styles/furo.css
new file mode 100644
index 00000000..a5b614d2
--- /dev/null
+++ b/_static/styles/furo.css
@@ -0,0 +1,2 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,p,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8, ');--icon-pencil:url('data:image/svg+xml;charset=utf-8, ');--icon-abstract:url('data:image/svg+xml;charset=utf-8, ');--icon-info:url('data:image/svg+xml;charset=utf-8, ');--icon-flame:url('data:image/svg+xml;charset=utf-8, ');--icon-question:url('data:image/svg+xml;charset=utf-8, ');--icon-warning:url('data:image/svg+xml;charset=utf-8, ');--icon-failure:url('data:image/svg+xml;charset=utf-8, ');--icon-spark:url('data:image/svg+xml;charset=utf-8, ');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#6b6f76;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#0a4bff;--color-brand-content:#2757dd;--color-brand-visited:#872ee0;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-api-added:#21632c;--color-api-added-border:#38a84d;--color-api-changed:#046172;--color-api-changed-border:#06a1bc;--color-api-deprecated:#605706;--color-api-deprecated-border:#f0d90f;--color-api-removed:#b30000;--color-api-removed-border:#ff5c5c;--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link--hover:var(--color-brand-content);--color-link-underline--hover:var(--color-foreground-border);--color-link--visited:var(--color-brand-visited);--color-link-underline--visited:var(--color-background-border);--color-link--visited--hover:var(--color-brand-visited);--color-link-underline--visited--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:block}@media(prefers-color-scheme:dark){body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-dark{display:block}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:none}}body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-family:var(--font-stack--headings);font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:visited{color:var(--color-link--visited);text-decoration-color:var(--color-link-underline--visited)}a:visited:hover{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link:hover:visited{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}body,html{height:100%}.skip-to-content,body,html{background:var(--color-background-primary);color:var(--color-foreground-primary)}.skip-to-content{border-radius:1rem;left:.25rem;padding:1rem;position:fixed;top:.25rem;transform:translateY(-200%);transition:transform .3s ease-in-out;z-index:40}.skip-to-content:focus-within{transform:translateY(0)}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{display:flex}.theme-toggle{background:transparent;border:none;cursor:pointer;display:flex;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1.25rem;width:1.25rem}.theme-toggle-header{align-items:center;display:flex;justify-content:center}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.5rem;width:1.5rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg,.content-icon-container .view-this-page svg{color:inherit;height:1.25rem;width:1.25rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0s,height 0s,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.content{margin-left:auto;margin-right:auto;padding:0 1em}}@media(max-width:63em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.theme-toggle-header,.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.5rem;width:1.5rem}:target{scroll-margin-top:calc(var(--header-height) + 2.5rem)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}}@media(max-width:48em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){article[role=main] aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:4.25rem}em.property,span.property{font-style:normal}em.property:first-child,span.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}div.deprecated,div.versionadded,div.versionchanged,div.versionremoved{border-left:.1875rem solid;border-radius:.125rem;padding-left:.75rem}div.deprecated p,div.versionadded p,div.versionchanged p,div.versionremoved p{margin-bottom:.125rem;margin-top:.125rem}div.versionadded{border-color:var(--color-api-added-border)}div.versionadded .versionmodified{color:var(--color-api-added)}div.versionchanged{border-color:var(--color-api-changed-border)}div.versionchanged .versionmodified{color:var(--color-api-changed)}div.deprecated{border-color:var(--color-api-deprecated-border)}div.deprecated .versionmodified{color:var(--color-api-deprecated)}div.versionremoved{border-color:var(--color-api-removed-border)}div.versionremoved .versionmodified{color:var(--color-api-removed)}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class]>.highlight{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>:not(span),div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}[role=main] .table-wrapper.container{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:2.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(2.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(2.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover);color:var(--color-sidebar-link-text)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23607d8b' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' viewBox='0 0 24 24'%3E%3Cpath stroke='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree a.reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right}
+/*# sourceMappingURL=furo.css.map*/
\ No newline at end of file
diff --git a/_static/styles/furo.css.map b/_static/styles/furo.css.map
new file mode 100644
index 00000000..db1dec16
--- /dev/null
+++ b/_static/styles/furo.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"styles/furo.css","mappings":"AAAA,2EAA2E,CAU3E,KACE,gBAAiB,CACjB,6BACF,CASA,KACE,QACF,CAMA,KACE,aACF,CAOA,GACE,aAAc,CACd,cACF,CAUA,GACE,sBAAuB,CACvB,QAAS,CACT,gBACF,CAOA,IACE,+BAAiC,CACjC,aACF,CASA,EACE,4BACF,CAOA,YACE,kBAAmB,CACnB,yBAA0B,CAC1B,gCACF,CAMA,SAEE,kBACF,CAOA,cAGE,+BAAiC,CACjC,aACF,CAeA,QAEE,aAAc,CACd,aAAc,CACd,iBAAkB,CAClB,uBACF,CAEA,IACE,aACF,CAEA,IACE,SACF,CASA,IACE,iBACF,CAUA,sCAKE,mBAAoB,CACpB,cAAe,CACf,gBAAiB,CACjB,QACF,CAOA,aAEE,gBACF,CAOA,cAEE,mBACF,CAMA,gDAIE,yBACF,CAMA,wHAIE,iBAAkB,CAClB,SACF,CAMA,4GAIE,6BACF,CAMA,SACE,0BACF,CASA,OACE,qBAAsB,CACtB,aAAc,CACd,aAAc,CACd,cAAe,CACf,SAAU,CACV,kBACF,CAMA,SACE,uBACF,CAMA,SACE,aACF,CAOA,6BAEE,qBAAsB,CACtB,SACF,CAMA,kFAEE,WACF,CAOA,cACE,4BAA6B,CAC7B,mBACF,CAMA,yCACE,uBACF,CAOA,6BACE,yBAA0B,CAC1B,YACF,CASA,QACE,aACF,CAMA,QACE,iBACF,CAiBA,kBACE,YACF,CCvVA,aAcE,kEACE,uBAOF,WACE,iDAMF,kCACE,wBAEF,qCAEE,uBADA,uBACA,CAEF,SACE,wBAtBA,CCpBJ,iBAGE,qBAEA,sBACA,0BAFA,oBAHA,4BACA,oBAKA,6BAIA,2CAFA,mBACA,sCAFA,4BAGA,CAEF,gBACE,aCPF,KCCE,mHAGA,wGAGA,wCAAyC,CAEzC,wBAAyB,CACzB,wBAAyB,CACzB,4BAA6B,CAC7B,yBAA0B,CAC1B,2BAA4B,CAG5B,sDAAuD,CACvD,gDAAiD,CACjD,wDAAyD,CAGzD,0CAA2C,CAC3C,gDAAiD,CACjD,gDAAiD,CAKjD,gCAAiC,CACjC,sCAAuC,CAGvC,2CAA4C,CAG5C,uCAAwC,CCnCxC,+FAIA,uBAAwB,CAGxB,iCAAkC,CAClC,kCAAmC,CAEnC,+BAAgC,CAChC,sCAAuC,CACvC,sCAAuC,CACvC,qGAIA,mDAAoD,CAEpD,mCAAoC,CACpC,8CAA+C,CAC/C,gDAAiD,CACjD,kCAAmC,CACnC,6DAA8D,CAG9D,6BAA8B,CAC9B,6BAA8B,CAC9B,+BAAgC,CAChC,kCAAmC,CACnC,kCAAmC,CCRjC,+jBCaA,iqCAZF,iaCXA,8KAOA,4SAWA,4SAUA,0CACA,gEAGA,0CAGA,gEAGA,yCACA,+DAIA,4CACA,kEAGA,wCAUA,8DACA,uCAGA,4DACA,sCACA,2DAGA,4CACA,kEACA,uCAGA,6DACA,2GAGA,sHAEA,yFAEA,+CACA,+EAGA,4MAOA,gCACA,sHAIA,kCACA,uEACA,gEACA,4DACA,kEAGA,2DACA,sDACA,0CACA,8CACA,wGAGA,0BACA,iCAGA,+DACA,+BACA,sCACA,+DAEA,kGACA,oCACA,yDACA,sCL3HF,kCAEA,sDAIA,0CKyHE,kEAIA,oDACA,sDAGA,oCACA,oEAEA,0DACA,qDAIA,oDACA,6DAIA,iEAIA,2DAIA,2DAGA,4DACA,gEAIA,gEAEA,gFAEA,oNASA,qDLtKE,gFAGE,4DAIF,oEKgHF,yEAEA,6DAGA,0DAEA,uDACA,qDACA,wDAIA,6DAIA,yDACA,2DAIA,uCAGA,wCACA,sDAGA,+CAGA,6DAEA,iDACA,+DAEA,wDAEA,sEAMA,0DACA,sBACA,mEL5JI,wEAEA,iCACE,+BAMN,wEAGA,iCACE,kFAEA,uEAIF,gEACE,8BAGF,qEMzDA,sCAKA,wFAKA,iCAIA,0BAWA,iCACA,4BACA,mCAGA,+BAEA,sCACA,4BAEA,mCAEA,sCAKA,sDAIA,gCAEA,gEAQF,wCAME,sBACA,kCAKA,uBAEA,gEAIA,2BAIA,mCAEA,qCACA,iCAGE,+BACA,wEAEE,iCACA,kFAGF,6BACA,0CACF,kCAEE,8BACE,8BACA,qEAEE,sCACA,wFClFN,iCAGF,2DACE,4BACA,oCAKF,8BAGE,sCACA,+DAIA,sCAEA,sDAGA,gCACA,gEAGA,+CAEA,sBACE,yCAGF,uBACA,sEAIA,aAEA,mCAIA,kEACA,aACA,oEACA,YAIA,EAQE,4HAGA,gDACE,mBACA,wCAON,wCAGE,0DACA,mBAKA,mBACA,CANA,uCAKA,iBALA,iBAWA,mBAGF,mBACE,mDAIF,+BAEE,CAEA,yBAFA,kBAMA,CAJA,GACA,aAGA,mBAEF,wBAEE,iBACA,iBAEA,OACA,aAGF,CAHE,WAGF,GAEE,oBAEA,CAJF,gBAIE,aAEA,+CAKA,UANA,WACA,cADA,SAMA,WACA,iBAEE,GAMF,wBANE,yBAMF,kDACA,WAEA,gCACA,2DAGA,iBACE,uCAEJ,kEAIE,uCAGA,yDACE,cACA,+DAEA,yDAEE,mEAMJ,kEAMA,uBACA,kBAEA,uBACA,kDAKA,0DAIA,CALA,oBAKA,WACA,WAQA,4BAFF,0CAEE,CARA,qCAsBA,CAdA,iBAEA,kBACE,aADF,4BACE,WAMF,2BAGF,qCAEE,CAXE,UAWF,+BAGA,uBAEA,SAEA,0CAIE,CANF,qCAEA,CAIE,2DACE,gBAIN,+CAIA,CAEA,kDAKE,CAPF,8BAEA,CAOE,YACA,CAjBI,2BAGN,CAHM,WAcJ,UAGA,CAEA,2GAIF,iCAGE,8BAIA,qBACA,oBACF,uBAOI,0CAIA,CATF,6DAKE,CALF,sBASE,qCAKF,CACE,cACA,CAFF,sBAEE,CACA,+BAEA,qBAEE,WAKN,aACE,sCAGA,mBAEA,6BAMA,kCACA,CAJA,sBACA,aAEA,CAJA,eACA,MAIA,2FAEA,UAGA,YACA,sBACE,8BAEA,CALF,aACA,WAIE,OACA,oBAEF,uBACE,WAEF,YAFE,UAEF,eAgBA,kBACE,CAhBA,qDAQF,qCAGF,CAGI,YACF,CAJF,2BAGI,CAEA,eACA,qBAGA,mEAEA,qBACA,8BAIA,kBADF,kBACE,yBAEJ,oCAGI,qDAIJ,+BAGI,oCAEA,+CAQF,4CACE,yBACF,2BAOE,sBACA,CAHA,WACA,CAFF,cACE,CAJA,YAGF,CAEE,SAEA,mBAGA,kDAEE,CAJF,cAEA,cAEE,sBAEA,mBADA,YACA,uBACA,mDACE,CADF,YACE,iDAEA,uCAEN,+DAOE,mBADF,sBACE,mBAGF,aACE,sCAIA,aADF,WACE,CAKF,SACE,CAHJ,kBAEE,CAJE,gBAEJ,CAHI,iBAMA,yFAKA,aACA,eACA,cCxaJ,iBAEE,aADA,iBACA,6BAEA,kCAEA,SACA,UAIA,gCACA,CALA,SAEA,SAEA,CAJA,wEAEA,CAFA,OAKA,CAGA,mDACE,iBAGF,gCACE,CADF,UACE,aAEJ,iCAEE,CAFF,UAEE,wCAEA,WACA,WADA,UACA,CACA,4CAGA,MACA,CADA,KACA,wCACA,UAGA,CAJA,UAIA,6DAUA,0CACE,CAFF,mBAEE,wEACA,CAVA,YACA,CAMF,mBAJE,OAOA,gBAJJ,gCACE,CANE,cACA,CAHA,oBACA,CAGA,QAGJ,CAII,0BACA,CADA,UACA,wCAEJ,kBACE,0DACA,gCACE,kBACA,CADA,YACA,oEACA,2CAMF,mDAII,CALN,YACE,CANE,cAKJ,CACE,iBAII,kEACA,yCACE,kDACA,yDACE,+CACA,uBANN,CAMM,+BANN,uCACE,qDACA,4BAEE,mBADA,0CACA,CADA,qBACA,0DACE,wCACA,sGALJ,oCACA,sBACE,kBAFF,UAEE,2CACA,wFACE,cACA,kEANN,uBACE,iDACA,CADA,UACA,0DACE,wDAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCvEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAEN,wDAEE,uCACE,kEAGJ,CACE,6CACA,uDAGF,CACE,mCAEF,yDAIE,gEAGA,CAEA,wHAIF,sDACE,+DAEE,sCAGF,8BACA,oCACE,oHAIF,gBACE,yGAIF,mBChHA,2MCDF,4HAQE,wKAOA,8HCbA,mBAEA,6HAIE,YACA,mIAaJ,gBAPE,YAOF,4FAKE,qDAuBE,sCACA,CAHA,oBAEA,CAbF,wCACE,CALF,8BAIA,CARE,eAIF,CAKE,mBAEF,qBAEE,CAIF,+BACE,mBACA,CAGA,kCACA,6BAIF,4CAIA,kDACE,6BACA,2BAGF,iBACE,mDAGA,8BACA,WAGJ,2BACE,cAGA,+BACA,CAHA,eAGA,wCACA,YACA,iBACA,uEAGA,0BACA,2CAEA,8EAGI,qBACA,CAFF,kBAEE,4DAMJ,mCACE,4BAGA,oBAGF,4CACE,qCACA,8BACA,gBACA,+CAEA,iCAEF,iCACE,oBACA,4CACA,qCAGF,8BAEE,+BAEA,WAEA,8BACE,oBACA,CADA,gBACA,yBAKF,gBADF,YACE,CACA,iBACA,qDAEA,mDCvIJ,2FAMA,iCACE,CACA,eAEA,CAFA,mBADA,wBAIA,8BACA,gBADA,YACA,0BAEE,8CAGA,wDAIE,gFAGE,iBAEN,wCAKF,+CACE,CACA,oDAEF,kDAIE,YAEF,CAHE,YAGF,CCpCE,mFAFA,QACA,UAIA,CAHA,IAGA,gDAGE,eACA,iEAGF,wBAEE,mBAMA,6CAEF,CAJE,mBACA,CAGF,kCAGE,CARF,kBACE,CAHA,eAUA,YACA,mBACA,CAFA,UAEA,wCC/BJ,mBACE,CDkCE,wBACA,sBCpCJ,iBACE,mDACA,2CACA,sBAGA,qBCDA,6CAIE,CATJ,uBAKE,CDGE,oBACF,yDAEE,CCDE,2CAGF,CAJA,kCACE,CDJJ,aAKE,eCXJ,CDME,uBCOE,gCACE,YAEF,2CAEE,wBACA,0BAIF,iBAEA,cADF,UACE,uBAEA,iCAEA,wCAEA,6CAMA,CAYF,gCATI,4BASJ,CAZE,mCAEE,iCAUJ,4BAGE,4DADA,+BACA,CAHF,qBAGE,sCACE,OAEF,iBAHA,SAGA,iHACE,2DAKF,CANA,8EAMA,uSAEE,kBAEF,+FACE,yCCjEJ,WACA,yBAGA,uBACA,gBAEA,uCAIA,CAJA,iCAIA,uCAGA,UACE,gBACA,qBAEA,0CClBJ,gBACE,KAGF,qBACE,YAGF,CAHE,cAGF,gCAEE,mBACA,iEAEA,oCACA,wCAEA,sBACA,WAEA,CAFA,YAEA,8EAEA,mCAFA,iBAEA,6BAIA,wEAKA,sDAIE,CARF,mDAIA,CAIE,cAEF,8CAIA,oBAFE,iBAEF,8CAGE,eAEF,CAFE,YAEF,OAEE,kBAGJ,CAJI,eACA,CAFF,mBAKF,yCCjDE,oBACA,CAFA,iBAEA,uCAKE,iBACA,qCAGA,mBCZJ,CDWI,gBCXJ,6BAEE,eACA,sBAGA,eAEA,sBACA,oDACA,iGAMA,gBAFE,YAEF,8FAME,iJCnBF,YACA,gNAWE,gDAEF,iSAaE,kBACE,gHAKF,oCACE,eACF,CADE,UACF,8CACE,gDACF,wCACE,oBCtCJ,oBAEF,6BACE,QACE,kDAGF,yBACE,kDAmBA,kDAEF,CAhBA,+CAaA,CAbA,oBAaA,0FACE,CADF,gGAfF,cACE,gBACA,CAaA,0BAGA,mQACE,gBAGF,oMACE,iBACA,CAFF,eACE,CADF,gBAEE,aAGJ,iCAEE,CAFF,wCAEE,wBAUE,+VAIE,uEAHA,2BAGA,wXAKJ,iDAGF,CARM,+CACE,iDAIN,CALI,gBAQN,mHACE,gBAGF,2DACE,0EAOA,0EAGF,gBAEE,6DCjFA,kDACA,gCACA,qDAGA,qBACA,qDCDA,cACA,eAEA,yBAGF,sBAEE,iBACA,sNAWA,iBACE,kBACA,wRAgBA,kBAEA,iOAgBA,uCACE,uEAEA,kBAEF,qUAuBE,iDAIJ,CACA,geCzFF,4BAEE,CAQA,6JACA,iDAIA,sEAGA,mDAOF,iDAGE,4DAIA,8CACA,qDAEE,eAFF,cAEE,oBAEF,uBAFE,kCAGA,eACA,iBACA,mBAIA,mDACA,CAHA,uCAEA,CAJA,0CACA,CAIA,gBAJA,gBACA,oBADA,gBAIA,wBAEJ,gBAGE,6BACA,YAHA,iBAGA,gCACA,iEAEA,6CACA,sDACA,0BADA,wBACA,0BACA,oIAIA,mBAFA,YAEA,qBACA,0CAIE,uBAEF,CAHA,yBACE,CAEF,iDACE,mFAKJ,oCACE,CANE,aAKJ,CACE,qEAIA,YAFA,WAEA,CAHA,aACA,CAEA,gBACE,4BACA,sBADA,aACA,gCAMF,oCACA,yDACA,2CAEA,qBAGE,kBAEA,CACA,mCAIF,CARE,YACA,CAOF,iCAEE,CAPA,oBACA,CAQA,oBACE,uDAEJ,sDAGA,CAHA,cAGA,0BACE,oDAIA,oCACA,4BACA,sBAGA,cAEA,oFAGA,sBAEA,yDACE,CAIF,iBAJE,wBAIF,6CAHE,6CAKA,eACA,aACA,CADA,cACA,yCAGJ,kBACE,CAKA,iDAEA,CARF,aACE,4CAGA,kBAIA,wEAGA,wDAGA,kCAOA,iDAGA,CAPF,WAEE,sCAEA,CAJF,2CACE,CAMA,qCACA,+BARF,kBACE,qCAOA,iBAsBA,sBACE,CAvBF,WAKA,CACE,0DAIF,CALA,uDACE,CANF,sBAqBA,4CACA,CALA,gRAIA,YAEE,6CAEN,mCAEE,+CASA,6EAIA,4BChNA,SDmNA,qFCnNA,gDACA,sCAGA,qCACA,sDACA,CAKA,kDAGA,CARA,0CAQA,kBAGA,YACA,sBACA,iBAFA,gBADF,YACE,CAHA,SAKA,kBAEA,SAFA,iBAEA,uEAGA,CAEE,6CAFF,oCAgBI,CAdF,yBACE,qBACF,CAGF,oBACE,CAIF,WACE,CALA,2CAGA,uBACF,CACE,mFAGE,CALF,qBAEA,UAGE,gCAIF,sDAEA,CALE,oCAKF,yCC7CJ,oCACE,CD+CA,yXAQE,sCCrDJ,wCAGA,oCACE","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote, p\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\n@use \"../variables\" as *\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto-light\n display: block\n\n @media (prefers-color-scheme: dark)\n .theme-toggle svg.theme-icon-when-auto-dark\n display: block\n .theme-toggle svg.theme-icon-when-auto-light\n display: none\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack:\n -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif,\n Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace:\n \"SFMono-Regular\", Menlo, Consolas, Monaco, Liberation Mono, Lucida Console,\n monospace;\n --font-stack--headings: var(--font-stack);\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 *\n #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8, '),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"info\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"question\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8, '),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8, ')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","@use \"sass:list\";\n// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{list.nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n list.nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #6b6f76; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #0a4bff;\n --color-brand-content: #2757dd;\n --color-brand-visited: #872ee0;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n\n --color-api-added: #21632c;\n --color-api-added-border: #38a84d;\n --color-api-changed: #046172;\n --color-api-changed-border: #06a1bc;\n --color-api-deprecated: #605706;\n --color-api-deprecated-border: #f0d90f;\n --color-api-removed: #b30000;\n --color-api-removed-border: #ff5c5c;\n\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline--hover: var(--color-foreground-border);\n\n --color-link--visited: var(--color-brand-visited);\n --color-link-underline--visited: var(--color-background-border);\n --color-link--visited--hover: var(--color-brand-visited);\n --color-link-underline--visited--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #cfd0d0; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #3d94ff;\n --color-brand-content: #5ca5ff;\n --color-brand-visited: #b27aeb;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n --color-api-added: #3db854;\n --color-api-added-border: #267334;\n --color-api-changed: #09b0ce;\n --color-api-changed-border: #056d80;\n --color-api-deprecated: #b1a10b;\n --color-api-deprecated-border: #6e6407;\n --color-api-removed: #ff7575;\n --color-api-removed-border: #b03b3b;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-family: var(--font-stack--headings)\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:visited\n color: var(--color-link--visited)\n text-decoration-color: var(--color-link-underline--visited)\n &:hover\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &:visited\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n@use \"variables\" as *\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n.skip-to-content\n position: fixed\n padding: 1rem\n border-radius: 1rem\n left: 0.25rem\n top: 0.25rem\n z-index: 40\n background: var(--color-background-primary)\n color: var(--color-foreground-primary)\n\n transform: translateY(-200%)\n transition: transform 300ms ease-in-out\n\n &:focus-within\n transform: translateY(0%)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n display: flex\n\n.theme-toggle\n display: flex\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n display: flex\n align-items: center\n justify-content: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1.5rem\n width: 1.5rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page, .view-this-page\n svg\n color: inherit\n height: 1.25rem\n width: 1.25rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $content-padded-width + $sidebar-width)\n // Center the page\n .content\n margin-left: auto\n margin-right: auto\n padding: 0 $content-padding--small\n\n@media (max-width: $content-padded-width--small + $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon, .theme-toggle-header\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.5rem\n width: 1.5rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: calc(var(--header-height) + 2.5rem)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n\n@media (max-width: $content-width + 2* $content-padding--small)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n article[role=main] aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","@use \"sass:list\"\n@use \"../variables\" as *\n\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{list.nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 4.25rem\n\nem.property, span.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\ndiv.versionadded,\ndiv.versionchanged,\ndiv.deprecated,\ndiv.versionremoved\n border-left: 0.1875rem solid\n border-radius: 0.125rem\n\n padding-left: 0.75rem\n\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\ndiv.versionadded\n border-color: var(--color-api-added-border)\n .versionmodified\n color: var(--color-api-added)\n\ndiv.versionchanged\n border-color: var(--color-api-changed-border)\n .versionmodified\n color: var(--color-api-changed)\n\ndiv.deprecated\n border-color: var(--color-api-deprecated-border)\n .versionmodified\n color: var(--color-api-deprecated)\n\ndiv.versionremoved\n border-color: var(--color-api-removed-border)\n .versionmodified\n color: var(--color-api-removed)\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n > .highlight\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > *:not(span),\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n","[role=main] .table-wrapper.container\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n","@use \"../variables\" as *\n\n:target\n scroll-margin-top: 2.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(2.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(2.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n@use \"../variables\" as *\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n color: var(--color-sidebar-link-text)\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml, ')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the \n li.has-children\n > .reference\n padding-right: var(--sidebar-expander-width)\n\n // Colorize the top-level list items and icon.\n .toctree-l1\n & > .reference,\n & > label .icon\n color: var(--color-sidebar-link-text--top-level)\n\n // Color changes on hover\n label\n background: var(--color-sidebar-item-expander-background)\n &:hover\n background: var(--color-sidebar-item-expander-background--hover)\n\n .current > .reference\n background: var(--color-sidebar-item-background--current)\n &:hover\n background: var(--color-sidebar-item-background--hover)\n\n.toctree-checkbox\n position: absolute\n display: none\n\n////////////////////////////////////////////////////////////////////////////////\n// Togglable expand/collapse\n////////////////////////////////////////////////////////////////////////////////\n.toctree-checkbox\n ~ ul\n display: none\n\n ~ label .icon svg\n transform: rotate(90deg)\n\n.toctree-checkbox:checked\n ~ ul\n display: block\n\n ~ label .icon svg\n transform: rotate(-90deg)\n","// This file contains the styles for the contents of the right sidebar, which\n// contains the table of contents for the current page.\n.toc-title-container\n padding: var(--toc-title-padding)\n padding-top: var(--toc-spacing-vertical)\n\n.toc-title\n color: var(--color-toc-title-text)\n font-size: var(--toc-title-font-size)\n padding-left: var(--toc-spacing-horizontal)\n text-transform: uppercase\n\n// If the ToC is not present, hide these elements coz they're not relevant.\n.no-toc\n display: none\n\n.toc-tree-container\n padding-bottom: var(--toc-spacing-vertical)\n\n.toc-tree\n font-size: var(--toc-font-size)\n line-height: 1.3\n border-left: 1px solid var(--color-background-border)\n\n padding-left: calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))\n\n // Hide the first \"top level\" bullet.\n > ul > li:first-child\n padding-top: 0\n & > ul\n padding-left: 0\n & > a\n display: none\n\n ul\n list-style-type: none\n margin-top: 0\n margin-bottom: 0\n padding-left: var(--toc-item-spacing-horizontal)\n li\n padding-top: var(--toc-item-spacing-vertical)\n\n &.scroll-current > .reference\n color: var(--color-toc-item-text--active)\n font-weight: bold\n\n a.reference\n color: var(--color-toc-item-text)\n text-decoration: none\n overflow-wrap: anywhere\n\n.toc-scroll\n max-height: 100vh\n overflow-y: scroll\n\n// Be very annoying when someone includes the table of contents\n.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here)\n color: var(--color-problematic)\n background: rgba(255, 0, 0, 0.25)\n &::before\n content: \"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch.\"\n","// Shameful hacks, to work around bugs.\n\n// MyST parser doesn't correctly generate classes, to align table contents.\n// https://github.com/executablebooks/MyST-Parser/issues/412\n.text-align\\:left > p\n text-align: left\n\n.text-align\\:center > p\n text-align: center\n\n.text-align\\:right > p\n text-align: right\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/api-assorted.html b/api-assorted.html
new file mode 100644
index 00000000..8f18aae9
--- /dev/null
+++ b/api-assorted.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+ Assorted functions - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+Assorted functions
+
+
+
+angle
+Return the angle of the complex argument.
+
+apply_where
+
+
+argpartition
+Perform an indirect partition along the given axis.
+
+at
+Update operations for read-only arrays.
+
+atleast_nd
+Recursively expand the dimension of an array to at least ndim .
+
+broadcast_shapes
+Compute the shape of the broadcasted arrays.
+
+cov
+Estimate a covariance matrix (or a stack of covariance matrices).
+
+create_diagonal
+Construct a diagonal array.
+
+default_dtype
+Return the default dtype for the given namespace and device.
+
+expand_dims
+Expand the shape of an array.
+
+isclose
+Return a boolean array where two arrays are element-wise equal within a tolerance.
+
+isin
+Determine whether each element in a is present in b .
+
+kron
+Kronecker product of two arrays.
+
+nan_to_num
+Replace NaN with zero and infinity with large finite numbers (default behaviour).
+
+nunique
+Count the number of unique elements in an array.
+
+one_hot
+One-hot encode the given indices.
+
+pad
+Pad the input array.
+
+partition
+Return a partitioned copy of an array.
+
+searchsorted
+Find indices where elements should be inserted to maintain order.
+
+setdiff1d
+Find the set difference of two arrays.
+
+sinc
+Return the normalized sinc function.
+
+union1d
+Find the union of two arrays.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api-lazy.html b/api-lazy.html
new file mode 100644
index 00000000..88a3dcee
--- /dev/null
+++ b/api-lazy.html
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+ Tools for lazy backends - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api-testing.html b/api-testing.html
new file mode 100644
index 00000000..62dbfb9e
--- /dev/null
+++ b/api-testing.html
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+
+
+ Testing utilities (xpx.testing) - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+Testing utilities (xpx.testing )
+These testing utilities are intended to help transition from using
+numpy.testing .
+
+
+
+assert_close
+Check that two arrays are close, up to tolerance atol + rtol * abs(desired) .
+
+assert_close_nulp
+Compare two arrays relatively to their spacing.
+
+assert_equal
+Check that two arrays are equal.
+
+assert_less
+Check that two arrays are ordered by less than.
+
+
+
+
+See also utilities specific to testing lazy backends in Tools for lazy backends .
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/codecov.yml b/codecov.yml
deleted file mode 100644
index dc9b47cd..00000000
--- a/codecov.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-comment: false
-github_checks:
- annotations: false
-ignore:
- - "src/array_api_extra/_lib/_compat"
- - "src/array_api_extra/_lib/_typing"
-coverage:
- status:
- project: off
diff --git a/contributing.html b/contributing.html
new file mode 100644
index 00000000..c9e81321
--- /dev/null
+++ b/contributing.html
@@ -0,0 +1,515 @@
+
+
+
+
+
+
+
+
+ Contributing - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+Contributing
+Contributions are welcome from any “array-consuming” library contributors who
+have found themselves writing private array-agnostic functions in the process of
+converting code to consume the standard.
+Thanks to all contributors so far!
+
+How to contribute a new function
+
+Open an issue to
+propose the new function. You may want to wait for initial feedback on the
+issue before diving into an implementation. Feel free to skip this step if
+there is already an open issue for the function.
+Add the implementation of your function to
+src/array_api_extra/_lib/_funcs.py .
+
+
+Import your function to src/array_api_extra/__init__.py and add it to
+__all__ there.
+Add a test class for your function in tests/test_funcs.py .
+
+
+Add your function to docs/api-reference.md .
+Make a PR!
+
+
+
+How to add delegation to a function
+See the tracker for adding delegation .
+
+If you would like to discuss the task before diving into the implementation,
+click on the three dots next to the function on the tracker issue, and choose
+“Convert to sub-issue”.
+Create a function in src/array_api_extra/_delegation.py with a signature
+matching the function in src/array_api_extra/_lib/_funcs.py , and move the
+docstring to the new function. Leave a one-line docstring in _funcs.py ,
+pointing to _delegation.py to see the full docstring.
+Also move the initial array_namespace call and any input validation over to
+the new function.
+Add delegation to backends using the if _delegate pattern. See
+src/array_api_extra/_lib/_backends.py for the full list of backends we have
+worked with so far.
+After all delegation layers, return the result from the implementation in
+_funcs .
+Simplify the signature in _funcs.py to remove impossible arguments now that
+it is only called internally via _delegation . For example, the xp
+parameter can be changed from type ModuleType | None to ModuleType .
+Don’t worry if you are not sure how to do some of the above steps or think you
+might have done something wrong -
+make a PR!
+
+
+
+Development workflow
+If you are an experienced contributor to Python packages, feel free to develop
+however you feel comfortable! However, if you would like some guidance,
+development of array-api-extra is made easy with
+Pixi :
+
+
+
+
+
+
+
+
+
+
+
+
+
+pixi run -- environment = lint lint
+
+
+
+
+
+pixi run -- environment = lint pyright
+pixi run -- environment = lint dprint
+
+
+
+
+
+
+Alternative environments are available with a subset of the dependencies and
+tasks available in the dev environment:
+pixi shell -- environment = docs
+pixi shell -- environment = tests
+pixi shell -- environment = tests - backends
+pixi shell -- environment = lint
+
+
+If you run on a host with CUDA hardware, you can enable extra tests:
+pixi shell -- environment = dev - cuda
+pixi shell -- environment = tests - cuda
+pixi run -- environment = tests - cuda tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contributors.html b/contributors.html
new file mode 100644
index 00000000..267020cd
--- /dev/null
+++ b/contributors.html
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+ Contributors - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+Contributors
+This project exists thanks to the following contributors
+(emoji key ):
+
+
+
+
+
+
+
+We follow the
+all-contributors
+specification. Contributions of any kind welcome!
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst
deleted file mode 100644
index 21686a95..00000000
--- a/docs/_templates/autosummary/class.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-{{ name | escape | underline }}
-
-.. currentmodule:: {{ module }}
-
-.. autoclass:: {{ fullname }}
\ No newline at end of file
diff --git a/docs/_templates/autosummary/function.rst b/docs/_templates/autosummary/function.rst
deleted file mode 100644
index 2e515aa4..00000000
--- a/docs/_templates/autosummary/function.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-{{ name | escape | underline }}
-
-.. currentmodule:: {{ module }}
-
-.. autofunction:: {{ fullname }}
\ No newline at end of file
diff --git a/docs/_templates/testing-function.rst b/docs/_templates/testing-function.rst
deleted file mode 100644
index ac156acd..00000000
--- a/docs/_templates/testing-function.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-{{ fullname.split('.')[-2:] | join('.') | escape | underline }}
-
-.. currentmodule:: {{ module }}
-
-.. autofunction:: {{ fullname }}
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index 105b69ec..00000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""Sphinx config."""
-
-import importlib.metadata
-from typing import Any
-
-project = "array-api-extra"
-copyright = "Consortium for Python Data API Standards"
-author = "Consortium for Python Data API Standards"
-version = release = importlib.metadata.version("array_api_extra")
-
-extensions = [
- "myst_parser",
- "sphinx.ext.autodoc",
- "sphinx.ext.autosummary",
- "sphinx.ext.intersphinx",
- "sphinx.ext.mathjax",
- "sphinx.ext.napoleon",
- "sphinx_autodoc_typehints",
- "sphinx_copybutton",
-]
-
-source_suffix = [".rst", ".md"]
-exclude_patterns = [
- "_build",
- "**.ipynb_checkpoints",
- "Thumbs.db",
- ".DS_Store",
- ".env",
- ".venv",
-]
-
-html_theme = "furo"
-
-html_theme_options: dict[str, Any] = {
- "footer_icons": [
- {
- "name": "GitHub",
- "url": "https://github.com/data-apis/array-api-extra",
- "html": """
-
-
-
- """, # noqa: E501
- "class": "",
- },
- ],
- "source_repository": "https://github.com/data-apis/array-api-extra",
- "source_branch": "main",
- "source_directory": "docs/",
-}
-
-myst_enable_extensions = [
- "colon_fence",
-]
-
-intersphinx_mapping = {
- "python": ("https://docs.python.org/3", None),
- "array-api": ("https://data-apis.org/array-api/draft", None),
- "dask": ("https://docs.dask.org/en/stable", None),
- "numpy": ("https://numpy.org/doc/stable", None),
- "jax": ("https://docs.jax.dev/en/latest", None),
-}
-
-nitpick_ignore = [
- ("py:class", "_io.StringIO"),
- ("py:class", "_io.BytesIO"),
-]
-
-templates_path = ["_templates"]
-
-always_document_param_types = True
diff --git a/generated/array_api_extra.angle.html b/generated/array_api_extra.angle.html
new file mode 100644
index 00000000..8098dc84
--- /dev/null
+++ b/generated/array_api_extra.angle.html
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+ angle - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+angle
+
+
+Return the angle of the complex argument.
+
+Parameters:
+
+z (object ) – Input array.
+deg (bool ) – Return angle in degrees if True, radians if False (default).
+xp (ModuleType | None ) – The standard-compatible namespace for z . Default: infer.
+
+
+Returns:
+The counterclockwise angle from the positive real axis on the complex
+plane in the range (-pi, pi] .
+
+Return type:
+object
+
+
+Notes
+Real input x is interpreted as x + 0j .
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> xpx . angle ( xp . asarray ([ 1.0 , 1.0 j , 1 + 1 j ]), xp = xp )
+Array([0. , 1.57079633, 0.78539816], dtype=array_api_strict.float64)
+>>> xpx . angle ( xp . asarray ([ 1.0 , 1.0 j , 1 + 1 j ]), deg = True , xp = xp )
+Array([ 0., 90., 45.], dtype=array_api_strict.float64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.apply_where.html b/generated/array_api_extra.apply_where.html
new file mode 100644
index 00000000..31aaf269
--- /dev/null
+++ b/generated/array_api_extra.apply_where.html
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+ apply_where - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+apply_where
+
+
+
+Overloads:
+
+cond (Array ), args (Array | tuple[Array, …] ), f1 (Callable[…, Array] ), f2 (Callable[…, Array] ), kwargs (dict[str, Array] | None ), xp (ModuleType | None ) → Array
+cond (Array ), args (Array | tuple[Array, …] ), f1 (Callable[…, Array] ), fill_value (Array | complex ), kwargs (dict[str, Array] | None ), xp (ModuleType | None ) → Array
+
+
+
+Run one of two elementwise functions depending on a condition.
+Equivalent to f1(*args) if cond else fill_value performed elementwise
+when fill_value is defined, otherwise to f1(*args) if cond else f2(*args) .
+
+Parameters:
+
+cond (object ) – The condition, expressed as a boolean array.
+args (object | tuple [object , ... ] ) – Argument(s) to f1 (and f2 ). Must be broadcastable with cond .
+f1 (Callable [... , object ] ) – Elementwise function of args , returning a single array.
+Where cond is True, output will be f1(arg0[cond], arg1[cond], ...) .
+f2 (Callable [... , object ] | None ) – Elementwise function of args , returning a single array.
+Where cond is False, output will be f2(arg0[cond], arg1[cond], ...) .
+Mutually exclusive with fill_value .
+fill_value (object | complex | None ) – If provided, value with which to fill output array where cond is False.
+It does not need to be scalar; it needs however to be broadcastable with
+cond and args .
+Mutually exclusive with f2 . You must provide one or the other.
+kwargs (dict [str , object ] | None ) – Keyword argument(s) to f1 (and f2 ). Values must be broadcastable with
+cond .
+xp (ModuleType | None ) – The standard-compatible namespace for cond and args . Default: infer.
+
+
+Returns:
+An array with elements from the output of f1 where cond is True and either
+the output of f2 or fill_value where cond is False. The returned array has
+data type determined by type promotion rules between the output of f1 and
+either fill_value or the output of f2 .
+
+Return type:
+Array
+
+
+Notes
+xp.where(cond, f1(*args), f2(*args)) requires explicitly evaluating f1 even
+when cond is False, and f2 when cond is True. This function evaluates each
+function only for their matching condition, if the backend allows for it.
+On Dask, f1 and f2 are applied to the individual chunks and should use functions
+from the namespace of the chunks.
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> a = xp . asarray ([ 5 , 4 , 3 ])
+>>> b = xp . asarray ([ 0 , 2 , 2 ])
+>>> def f ( a , b ):
+... return a // b
+>>> xpx . apply_where ( b != 0 , ( a , b ), f , fill_value = xp . nan )
+array([ nan, 2., 1.])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.argpartition.html b/generated/array_api_extra.argpartition.html
new file mode 100644
index 00000000..4a99c04b
--- /dev/null
+++ b/generated/array_api_extra.argpartition.html
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+ argpartition - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+argpartition
+
+
+Perform an indirect partition along the given axis.
+It returns an array of indices of the same shape as a that
+index data along the given axis in partitioned order.
+
+Parameters:
+
+a (object ) – Input array.
+kth (int ) – Element index to partition by.
+axis (int | None ) – Axis along which to partition. The default is -1 (the last axis).
+If None , the flattened array is used.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+Array of indices that partition a along the specified axis.
+
+Return type:
+object
+
+
+Notes
+If xp implements argpartition or an equivalent function
+e.g. topk for torch), complexity will likely be O(n).
+If not, this function simply calls xp.argsort and complexity is O(n log n).
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.at.html b/generated/array_api_extra.at.html
new file mode 100644
index 00000000..3c484a17
--- /dev/null
+++ b/generated/array_api_extra.at.html
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+
+ at - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+at
+
+
+Update operations for read-only arrays.
+This implements jax.numpy.ndarray.at for all writeable
+backends (those that support __setitem__ ) and routes
+to the .at[] method for JAX arrays.
+
+Parameters:
+
+x (object ) – Input array.
+idx (object | Undef ) –
Only array API standard compliant indices
+are supported.
+You may use two alternate syntaxes:
+>>> import array_api_extra as xpx
+>>> xpx . at ( x , idx ) . set ( value ) # or add(value), etc.
+>>> xpx . at ( x )[ idx ] . set ( value )
+
+
+
+copy (bool , optional ) –
+None (default) The array parameter may be modified in place if it is
+possible and beneficial for performance.
+You should not reuse it after calling this function.
+
+True Ensure that the inputs are not modified.
+
+False Ensure that the update operation writes back to the input.
+Raise ValueError if a copy cannot be avoided.
+
+
+
+xp (array_namespace , optional ) – The standard-compatible namespace for x . Default: infer.
+
+
+Return type:
+Updated input array.
+
+
+
+
Warning
+
(a) When you omit the copy parameter, you should never reuse the parameter
+array later on; ideally, you should reassign it immediately:
+
>>> import array_api_extra as xpx
+>>> x = xpx . at ( x , 0 ) . set ( 2 )
+
+
+
The above best practice pattern ensures that the behaviour won’t change depending
+on whether x is writeable or not, as the original x object is dereferenced
+as soon as xpx.at returns; this way there is no risk to accidentally update it
+twice.
+
On the reverse, the anti-pattern below must be avoided, as it will result in
+different behaviour on read-only versus writeable arrays:
+
>>> x = xp . asarray ([ 0 , 0 , 0 ])
+>>> y = xpx . at ( x , 0 ) . set ( 2 )
+>>> z = xpx . at ( x , 1 ) . set ( 3 )
+
+
+
In the above example, both calls to xpx.at update x in place if possible .
+This causes the behaviour to diverge depending on whether x is writeable or not:
+
+If x is writeable, then after the snippet above you’ll have
+x == y == z == [2, 3, 0]
+If x is read-only, then you’ll end up with
+x == [0, 0, 0] , y == [2, 0, 0] and z == [0, 3, 0] .
+
+
The correct pattern to use if you want diverging outputs from the same input is
+to enforce copies:
+
>>> x = xp . asarray ([ 0 , 0 , 0 ])
+>>> y = xpx . at ( x , 0 ) . set ( 2 , copy = True ) # Never updates x
+>>> z = xpx . at ( x , 1 ) . set ( 3 ) # May or may not update x in place
+>>> del x # avoid accidental reuse of x as we don't know its state anymore
+
+
+
(b) The array API standard does not support integer array indices.
+The behaviour of update methods when the index is an array of integers is
+undefined and will vary between backends; this is particularly true when the
+index contains multiple occurrences of the same index, e.g.:
+
>>> import numpy as np
+>>> import jax.numpy as jnp
+>>> import array_api_extra as xpx
+>>> xpx . at ( np . asarray ([ 123 ]), np . asarray ([ 0 , 0 ])) . add ( 1 )
+array([124])
+>>> xpx . at ( jnp . asarray ([ 123 ]), jnp . asarray ([ 0 , 0 ])) . add ( 1 )
+Array([125], dtype=int32)
+
+
+
+
+Notes
+sparse , as well as read-only arrays from libraries
+not explicitly covered by array-api-compat , are not supported by update
+methods.
+Boolean masks are supported on Dask and jitted JAX arrays exclusively
+when idx has the same shape as x and y is 0-dimensional.
+Note that this support is not available in JAX’s native
+x.at[mask].set(y) .
+This pattern:
+>>> mask = m ( x )
+>>> x [ mask ] = f ( x [ mask ])
+
+
+Can’t be replaced by at , as it won’t work on Dask and JAX inside jax.jit:
+>>> mask = m ( x )
+>>> x = xpx . at ( x , mask ) . set ( f ( x [ mask ]) # Crash on Dask and jax.jit
+
+
+You should instead use:
+>>> x = xp . where ( m ( x ), f ( x ), x )
+
+
+Examples
+Given either of these equivalent expressions:
+>>> import array_api_extra as xpx
+>>> x = xpx . at ( x )[ 1 ] . add ( 2 )
+>>> x = xpx . at ( x , 1 ) . add ( 2 )
+
+
+If x is a JAX array, they are the same as:
+
+If x is a read-only NumPy array, they are the same as:
+>>> x = x . copy ()
+>>> x [ 1 ] += 2
+
+
+For other known backends, they are the same as:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.atleast_nd.html b/generated/array_api_extra.atleast_nd.html
new file mode 100644
index 00000000..dea9e0fc
--- /dev/null
+++ b/generated/array_api_extra.atleast_nd.html
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+ atleast_nd - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+atleast_nd
+
+
+Recursively expand the dimension of an array to at least ndim .
+
+Parameters:
+
+x (object ) – Input array.
+ndim (int ) – The minimum number of dimensions for the result.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+An array with res.ndim >= ndim .
+If x.ndim >= ndim , x is returned.
+If x.ndim < ndim , x is expanded by prepending new axes
+until res.ndim equals ndim .
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> x = xp . asarray ([ 1 ])
+>>> xpx . atleast_nd ( x , ndim = 3 , xp = xp )
+Array([[[1]]], dtype=array_api_strict.int64)
+
+
+>>> x = xp . asarray ([[[ 1 , 2 ],
+... [ 3 , 4 ]]])
+>>> xpx . atleast_nd ( x , ndim = 1 , xp = xp ) is x
+True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.broadcast_shapes.html b/generated/array_api_extra.broadcast_shapes.html
new file mode 100644
index 00000000..23040199
--- /dev/null
+++ b/generated/array_api_extra.broadcast_shapes.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+ broadcast_shapes - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+broadcast_shapes
+
+
+Compute the shape of the broadcasted arrays.
+
+Duplicates numpy.broadcast_shapes() , with additional support for
+None and NaN sizes.
+
+Parameters:
+
+*shapes (tuple [float | None , ... ] ) – Shapes of the arrays to broadcast.
+xp (ModuleType | None ) – The standard-compatible namespace to use for native delegation.
+Default: use the array-agnostic implementation.
+
+
+Returns:
+The shape of the broadcasted arrays.
+
+Return type:
+tuple [int | None , ... ]
+
+
+
+Notes
+This function accepts the Array API’s None for unknown sizes,
+as well as Dask’s non-standard math.nan .
+Regardless of input, the output always contains None for unknown sizes.
+Examples
+>>> import array_api_extra as xpx
+>>> xpx . broadcast_shapes (( 2 , 3 ), ( 2 , 1 ))
+(2, 3)
+>>> xpx . broadcast_shapes (( 4 , 2 , 3 ), ( 2 , 1 ), ( 1 , 3 ))
+(4, 2, 3)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.cov.html b/generated/array_api_extra.cov.html
new file mode 100644
index 00000000..423199b3
--- /dev/null
+++ b/generated/array_api_extra.cov.html
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+
+
+ cov - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+cov
+
+
+Estimate a covariance matrix (or a stack of covariance matrices).
+Covariance indicates the level to which two variables vary together.
+If we examine N -dimensional samples, \(X = [x_1, x_2, ... x_N]^T\) ,
+each with M observations, then element \(C_{ij}\) of the
+\(N imes N\) covariance matrix is the covariance of
+\(x_i\) and \(x_j\) . The element \(C_{ii}\) is the variance
+of \(x_i\) .
+With the exception of supporting batch input, this provides a subset of
+the functionality of numpy.cov .
+
+Parameters:
+
+m (object ) – An array of shape (..., N, M) whose innermost two dimensions
+contain M observations of N variables. That is,
+each row of m represents a variable, and each column a single
+observation of all those variables.
+xp (ModuleType | None ) – The standard-compatible namespace for m . Default: infer.
+
+
+Returns:
+An array having shape (…, N, N) whose innermost two dimensions represent
+the covariance matrix of the variables.
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+
+
+Consider two variables, \(x_0\) and \(x_1\) , which
+correlate perfectly, but in opposite directions:
+>>> x = xp . asarray ([[ 0 , 2 ], [ 1 , 1 ], [ 2 , 0 ]]) . T
+>>> x
+Array([[0, 1, 2],
+ [2, 1, 0]], dtype=array_api_strict.int64)
+
+
+Note how \(x_0\) increases while \(x_1\) decreases. The covariance
+matrix shows this clearly:
+>>> xpx . cov ( x , xp = xp )
+Array([[ 1., -1.],
+ [-1., 1.]], dtype=array_api_strict.float64)
+
+
+Note that element \(C_{0,1}\) , which shows the correlation between
+\(x_0\) and \(x_1\) , is negative.
+Further, note how x and y are combined:
+>>> x = xp . asarray ([ - 2.1 , - 1 , 4.3 ])
+>>> y = xp . asarray ([ 3 , 1.1 , 0.12 ])
+>>> X = xp . stack (( x , y ), axis = 0 )
+>>> xpx . cov ( X , xp = xp )
+Array([[11.71 , -4.286 ],
+ [-4.286 , 2.14413333]], dtype=array_api_strict.float64)
+
+
+>>> xpx . cov ( x , xp = xp )
+Array(11.71, dtype=array_api_strict.float64)
+
+
+>>> xpx . cov ( y , xp = xp )
+Array(2.14413333, dtype=array_api_strict.float64)
+
+
+Input with more than two dimensions is treated as a stack of
+two-dimensional input.
+>>> stack = xp . stack (( X , 2 * X ))
+>>> xpx . cov ( stack )
+Array([[[ 11.71 , -4.286 ],
+ [ -4.286 , 2.14413333]],
+
+
+
+
+[[ 46.84 , -17.144 ], [-17.144 , 8.57653333]]], dtype=array_api_strict.float64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.create_diagonal.html b/generated/array_api_extra.create_diagonal.html
new file mode 100644
index 00000000..0e79357b
--- /dev/null
+++ b/generated/array_api_extra.create_diagonal.html
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+ create_diagonal - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+create_diagonal
+
+
+Construct a diagonal array.
+
+Parameters:
+
+x (object ) – An array having shape (*batch_dims, k) .
+offset (int ) – Offset from the leading diagonal (default is 0 ).
+Use positive ints for diagonals above the leading diagonal,
+and negative ints for diagonals below the leading diagonal.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+An array having shape (*batch_dims, k+abs(offset), k+abs(offset)) with x
+on the diagonal (offset by offset ).
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> x = xp . asarray ([ 2 , 4 , 8 ])
+
+
+>>> xpx . create_diagonal ( x , xp = xp )
+Array([[2, 0, 0],
+ [0, 4, 0],
+ [0, 0, 8]], dtype=array_api_strict.int64)
+
+
+>>> xpx . create_diagonal ( x , offset =- 2 , xp = xp )
+Array([[0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0],
+ [2, 0, 0, 0, 0],
+ [0, 4, 0, 0, 0],
+ [0, 0, 8, 0, 0]], dtype=array_api_strict.int64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.default_dtype.html b/generated/array_api_extra.default_dtype.html
new file mode 100644
index 00000000..05f87c8c
--- /dev/null
+++ b/generated/array_api_extra.default_dtype.html
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+ default_dtype - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+default_dtype
+
+
+Return the default dtype for the given namespace and device.
+This is a convenience shorthand for
+xp.__array_namespace_info__().default_dtypes(device=device)[kind] .
+
+Parameters:
+
+xp (ModuleType ) – The standard-compatible namespace for which to get the default dtype.
+kind (Literal ['real floating' , 'complex floating' , 'integral' , 'indexing' ] ) – The kind of dtype to return. Default is ‘real floating’.
+device (object | None ) – The device for which to get the default dtype. Default: current device.
+
+
+Returns:
+The default dtype for the given namespace, kind, and device.
+
+Return type:
+object
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.expand_dims.html b/generated/array_api_extra.expand_dims.html
new file mode 100644
index 00000000..ef2f7a9c
--- /dev/null
+++ b/generated/array_api_extra.expand_dims.html
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+ expand_dims - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+expand_dims
+
+
+array_api_extra. expand_dims ( a , / , * , axis = (0,) , xp = None )
+Expand the shape of an array.
+
+
Deprecated since version 0.11.0: expand_dims() is deprecated and will be removed in v1.0.0.
+array_api.expand_dims() with support for a tuple of ints in axis
+exists in the standard as of v2025.12.
+
+Insert (a) new axis/axes that will appear at the position(s) specified by
+axis in the expanded array shape.
+
+Parameters:
+
+a (object ) – Array to have its shape expanded.
+axis (int | tuple [int , ... ] ) – Position(s) in the expanded axes where the new axis (or axes) is/are placed.
+If multiple positions are provided, they should be unique (note that a position
+given by a positive index could also be referred to by a negative index -
+that will also result in an error).
+Default: (0,) .
+xp (ModuleType | None ) – The standard-compatible namespace for a . Default: infer.
+
+
+Returns:
+a with an expanded shape.
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> x = xp . asarray ([ 1 , 2 ])
+>>> x . shape
+(2,)
+
+
+The following is equivalent to x[xp.newaxis, :] or x[xp.newaxis] :
+>>> y = xpx . expand_dims ( x , axis = 0 , xp = xp )
+>>> y
+Array([[1, 2]], dtype=array_api_strict.int64)
+>>> y . shape
+(1, 2)
+
+
+The following is equivalent to x[:, xp.newaxis] :
+>>> y = xpx . expand_dims ( x , axis = 1 , xp = xp )
+>>> y
+Array([[1],
+ [2]], dtype=array_api_strict.int64)
+>>> y . shape
+(2, 1)
+
+
+axis may also be a tuple:
+>>> y = xpx . expand_dims ( x , axis = ( 0 , 1 ), xp = xp )
+>>> y
+Array([[[1, 2]]], dtype=array_api_strict.int64)
+
+
+>>> y = xpx . expand_dims ( x , axis = ( 2 , 0 ), xp = xp )
+>>> y
+Array([[[1],
+ [2]]], dtype=array_api_strict.int64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.isclose.html b/generated/array_api_extra.isclose.html
new file mode 100644
index 00000000..eed59ee5
--- /dev/null
+++ b/generated/array_api_extra.isclose.html
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+ isclose - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+isclose
+
+
+Return a boolean array where two arrays are element-wise equal within a tolerance.
+The tolerance values are positive, typically very small numbers. The relative
+difference (rtol * abs(b)) and the absolute difference atol are added together
+to compare against the absolute difference between a and b .
+NaNs are treated as equal if they are in the same place and if equal_nan=True .
+Infs are treated as equal if they are in the same place and of the same sign in both
+arrays.
+
+Parameters:
+
+a (object | complex ) – Input objects to compare. At least one must be an array.
+b (object | complex ) – Input objects to compare. At least one must be an array.
+rtol (float ) – The relative tolerance parameter (see Notes).
+atol (float ) – The absolute tolerance parameter (see Notes).
+equal_nan (bool ) – Whether to compare NaN’s as equal. If True, NaN’s in a will be considered
+equal to NaN’s in b in the output array.
+xp (ModuleType | None ) – The standard-compatible namespace for a and b . Default: infer.
+
+
+Returns:
+A boolean array of shape broadcasted from a and b , containing True where
+a is close to b , and False otherwise.
+
+Return type:
+object
+
+
+
+
Warning
+
The default atol is not appropriate for comparing numbers with magnitudes much
+smaller than one (see notes).
+
+
+
See also
+
+math.isclose Similar function in stdlib for Python scalars.
+
+
+
+Notes
+For finite values, isclose uses the following equation to test whether two
+floating point values are equivalent:
+absolute ( a - b ) <= ( atol + rtol * absolute ( b ))
+
+
+Unlike the built-in math.isclose ,
+the above equation is not symmetric in a and b ,
+so that isclose(a, b) might be different from isclose(b, a) in some rare
+cases.
+The default value of atol is not appropriate when the reference value b has
+magnitude smaller than one. For example, it is unlikely that a = 1e-9 and
+b = 2e-9 should be considered “close”, yet isclose(1e-9, 2e-9) is True
+with default settings. Be sure to select atol for the use case at hand, especially
+for defining the threshold below which a non-zero value in a will be considered
+“close” to a very small or zero value in b .
+The comparison of a and b uses standard broadcasting, which means that a and
+b need not have the same shape in order for isclose(a, b) to evaluate to
+True .
+isclose is not defined for non-numeric data types.
+bool is considered a numeric data-type for this purpose.
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.isin.html b/generated/array_api_extra.isin.html
new file mode 100644
index 00000000..2dc03980
--- /dev/null
+++ b/generated/array_api_extra.isin.html
@@ -0,0 +1,398 @@
+
+
+
+
+
+
+
+
+ isin - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+isin
+
+
+Determine whether each element in a is present in b .
+This is array_api.isin() , with additional assume_unique
+and kind parameters.
+
+Parameters:
+
+a (object ) – Input elements.
+b (object ) – The elements against which to test each element of a .
+assume_unique (bool ) – If True, the input arrays are both assumed to be unique which can speed
+up the calculation. Default: False.
+invert (bool ) – If True, the values in the returned array are inverted. Default: False.
+kind (str | None ) – The algorithm or method to use. This will not affect the final result,
+but will affect the speed and memory use.
+For NumPy the options are {None, “sort”, “table”}.
+For Jax the mapped parameter is instead method and the options are
+{“compare_all”, “binary_search”, “sort”, and “auto” (default)}
+For CuPy, Dask, Torch and the default case this parameter is not present and
+thus ignored. Default: None.
+xp (ModuleType | None ) – The standard-compatible namespace for a and b . Default: infer.
+
+
+Returns:
+An array having the same shape as that of a that is True for elements
+that are in b and False otherwise.
+
+Return type:
+object
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.kron.html b/generated/array_api_extra.kron.html
new file mode 100644
index 00000000..d87da6e7
--- /dev/null
+++ b/generated/array_api_extra.kron.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+ kron - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+kron
+
+
+Kronecker product of two arrays.
+Computes the Kronecker product, a composite array made of blocks of the
+second array scaled by the first.
+Equivalent to numpy.kron for NumPy arrays.
+
+Parameters:
+
+a (object | complex ) – Input arrays or scalars. At least one must be an array.
+b (object | complex ) – Input arrays or scalars. At least one must be an array.
+xp (ModuleType | None ) – The standard-compatible namespace for a and b . Default: infer.
+
+
+Returns:
+The Kronecker product of a and b .
+
+Return type:
+object
+
+
+Notes
+The function assumes that the number of dimensions of a and b
+are the same, if necessary prepending the smallest with ones.
+If a.shape = (r0,r1,..,rN) and b.shape = (s0,s1,...,sN) ,
+the Kronecker product has shape (r0*s0, r1*s1, ..., rN*SN) .
+The elements are products of elements from a and b , organized
+explicitly by:
+kron ( a , b )[ k0 , k1 , ... , kN ] = a [ i0 , i1 , ... , iN ] * b [ j0 , j1 , ... , jN ]
+
+
+where:
+kt = it * st + jt , t = 0 , ... , N
+
+
+In the common 2-D case (N=1), the block structure can be visualized:
+[[ a [ 0 , 0 ] * b , a [ 0 , 1 ] * b , ... , a [ 0 , - 1 ] * b ],
+ [ ... ... ],
+ [ a [ - 1 , 0 ] * b , a [ - 1 , 1 ] * b , ... , a [ - 1 , - 1 ] * b ]]
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> xpx . kron ( xp . asarray ([ 1 , 10 , 100 ]), xp . asarray ([ 5 , 6 , 7 ]), xp = xp )
+Array([ 5, 6, 7, 50, 60, 70, 500,
+ 600, 700], dtype=array_api_strict.int64)
+
+
+>>> xpx . kron ( xp . asarray ([ 5 , 6 , 7 ]), xp . asarray ([ 1 , 10 , 100 ]), xp = xp )
+Array([ 5, 50, 500, 6, 60, 600, 7,
+ 70, 700], dtype=array_api_strict.int64)
+
+
+>>> xpx . kron ( xp . eye ( 2 ), xp . ones (( 2 , 2 )), xp = xp )
+Array([[1., 1., 0., 0.],
+ [1., 1., 0., 0.],
+ [0., 0., 1., 1.],
+ [0., 0., 1., 1.]], dtype=array_api_strict.float64)
+
+
+>>> a = xp . reshape ( xp . arange ( 100 ), ( 2 , 5 , 2 , 5 ))
+>>> b = xp . reshape ( xp . arange ( 24 ), ( 2 , 3 , 4 ))
+>>> c = xpx . kron ( a , b , xp = xp )
+>>> c . shape
+(2, 10, 6, 20)
+>>> I = ( 1 , 3 , 0 , 2 )
+>>> J = ( 0 , 2 , 1 )
+>>> J1 = ( 0 ,) + J # extend to ndim=4
+>>> S1 = ( 1 ,) + b . shape
+>>> K = tuple ( xp . asarray ( I ) * xp . asarray ( S1 ) + xp . asarray ( J1 ))
+>>> c [ K ] == a [ I ] * b [ J ]
+Array(True, dtype=array_api_strict.bool)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.lazy_apply.html b/generated/array_api_extra.lazy_apply.html
new file mode 100644
index 00000000..c809f529
--- /dev/null
+++ b/generated/array_api_extra.lazy_apply.html
@@ -0,0 +1,488 @@
+
+
+
+
+
+
+
+
+ lazy_apply - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+lazy_apply
+
+
+
+Overloads:
+
+func (Callable[P, Array | ArrayLike] ), args (Array | complex | None ), shape (tuple[int | None, …] | None ), dtype (DType | None ), as_numpy (bool ), xp (ModuleType | None ), kwargs (P.kwargs ) → Array
+func (Callable[P, Sequence[Array | ArrayLike]] ), args (Array | complex | None ), shape (Sequence[tuple[int | None, …]] ), dtype (Sequence[DType] | None ), as_numpy (bool ), xp (ModuleType | None ), kwargs (P.kwargs ) → tuple[Array, …]
+
+
+
+Lazily apply an eager function.
+If the backend of the input arrays is lazy, e.g. Dask or jitted JAX, the execution
+of the function is delayed until the graph is materialized; if it’s eager, the
+function is executed immediately.
+
+Parameters:
+
+func (Callable [[ParamSpec (P , bound= None )], object | ArrayLike | Sequence [object | ArrayLike ]] ) –
The function to apply.
+It must accept one or more array API compliant arrays as positional arguments.
+If as_numpy=True , inputs are converted to NumPy before they are passed to
+func .
+It must return either a single array-like or a sequence of array-likes.
+func must be a pure function, i.e. without side effects, as depending on the
+backend it may be executed more than once or never.
+
+*args (object | complex | None ) –
One or more Array API compliant arrays, Python scalars, or None’s.
+If as_numpy=True , you need to be able to apply numpy.asarray() to
+non-None args to convert them to NumPy; read notes below about specific
+backends.
+
+shape (tuple [int | None , ... ] | Sequence [tuple [int | None , ... ]] | None ) – Output shape or sequence of output shapes, one for each output of func .
+Default: assume single output and broadcast shapes of the input arrays.
+dtype (object | Sequence [object ] | None ) – Output dtype or sequence of output dtypes, one for each output of func .
+dtype(s) must belong to the same array namespace as the input arrays.
+Default: infer the result type(s) from the input arrays.
+as_numpy (bool ) –
+If True, convert the input arrays to NumPy before passing them to func . This is particularly useful to make NumPy-only functions, e.g. written in Cython
+
+or Numba, work transparently with array API-compliant arrays. Default: False.
+
+
+
+xp (ModuleType | None ) – The standard-compatible namespace for args . Default: infer.
+**kwargs (ParamSpecKwargs ) – Additional keyword arguments to pass verbatim to func .
+They cannot contain Array objects.
+
+
+Returns:
+The result(s) of func applied to the input arrays, wrapped in the same
+array namespace as the inputs.
+If shape is omitted or a single tuple[int | None, …] , return a single array.
+Otherwise, return a tuple of arrays.
+
+Return type:
+Array | tuple [Array, …]
+
+
+Notes
+
+JAX This allows applying eager functions to jitted JAX arrays, which are lazy.
+The function won’t be applied until the JAX array is materialized.
+When running inside jax.jit , shape must be fully known, i.e. it cannot
+contain any None elements.
+
+
Warning
+
func must never raise inside jax.jit , as the resulting behavior is
+undefined.
+
+Using this with as_numpy=False is particularly useful to apply non-jittable
+JAX functions to arrays on GPU devices.
+If as_numpy=True , the Transfer guard may prevent arrays on a GPU
+device from being transferred back to CPU. This is treated as an implicit
+transfer.
+
+PyTorch, CuPy If as_numpy=True , these backends raise by default if you attempt to convert
+arrays on a GPU device to NumPy.
+
+Sparse If as_numpy=True , by default sparse prevents implicit densification through
+numpy.asarray() . This safety mechanism can be disabled .
+
+Dask This allows applying eager functions to Dask arrays.
+The Dask graph won’t be computed until the user calls compute() or
+persist() down the line.
+The function name will be prominently visible on the user-facing Dask
+dashboard and on Prometheus metrics, so it is recommended for it to be
+meaningful.
+lazy_apply doesn’t know if func reduces along any axes; also, shape
+changes are non-trivial in chunked Dask arrays. For these reasons, all inputs
+will be rechunked into a single chunk.
+
+
Warning
+
The whole operation needs to fit in memory all at once on a single worker.
+
+The outputs will also be returned as a single chunk and you should consider
+rechunking them into smaller chunks afterwards.
+If you want to distribute the calculation across multiple workers, you
+should use dask.array.map_blocks() , dask.array.map_overlap() ,
+dask.array.blockwise() , or a native Dask wrapper instead of
+lazy_apply .
+
+Dask wrapping around other backends If as_numpy=False , func will receive in input eager arrays of the meta
+namespace, as defined by the ._meta attribute of the input Dask arrays.
+The outputs of func will be wrapped by the meta namespace, and then wrapped
+again by Dask.
+
+
+
+Raises:
+
+ValueError – When xp=jax.numpy , the output shape is unknown (it contains None on
+ one or more axes) and this function was called inside jax.jit .
+RuntimeError – When xp=sparse and auto-densification is disabled.
+Exception ( backend-specific ) – When the backend disallows implicit device to host transfers and the input
+ arrays are on a non-CPU device, e.g. on GPU.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.nan_to_num.html b/generated/array_api_extra.nan_to_num.html
new file mode 100644
index 00000000..65eccec9
--- /dev/null
+++ b/generated/array_api_extra.nan_to_num.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+ nan_to_num - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+nan_to_num
+
+
+Replace NaN with zero and infinity with large finite numbers (default behaviour).
+If x is inexact, NaN is replaced by zero or by the user defined value in the
+fill_value keyword, infinity is replaced by the largest finite floating
+point value representable by x.dtype , and -infinity is replaced by the
+most negative finite floating point value representable by x.dtype .
+For complex dtypes, the above is applied to each of the real and
+imaginary components of x separately.
+
+Parameters:
+
+x (object | float | complex ) – Input data.
+fill_value (int | float ) – Value to be used to fill NaN values. If no value is passed
+then NaN values will be replaced with 0.0.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+x , with the non-finite values replaced.
+
+Return type:
+object
+
+
+
+
See also
+
+array_api.isnan Shows which elements are Not a Number (NaN).
+
+
+
+Examples
+>>> import array_api_extra as xpx
+>>> import array_api_strict as xp
+>>> xpx . nan_to_num ( xp . inf )
+1.7976931348623157e+308
+>>> xpx . nan_to_num ( - xp . inf )
+-1.7976931348623157e+308
+>>> xpx . nan_to_num ( xp . nan )
+0.0
+>>> x = xp . asarray ([ xp . inf , - xp . inf , xp . nan , - 128 , 128 ])
+>>> xpx . nan_to_num ( x )
+array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, # may vary
+ -1.28000000e+002, 1.28000000e+002])
+>>> y = xp . asarray ([ complex ( xp . inf , xp . nan ), xp . nan , complex ( xp . nan , xp . inf )])
+array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, # may vary
+ -1.28000000e+002, 1.28000000e+002])
+>>> xpx . nan_to_num ( y )
+array([ 1.79769313e+308 +0.00000000e+000j, # may vary
+ 0.00000000e+000 +0.00000000e+000j,
+ 0.00000000e+000 +1.79769313e+308j])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.nunique.html b/generated/array_api_extra.nunique.html
new file mode 100644
index 00000000..87445c06
--- /dev/null
+++ b/generated/array_api_extra.nunique.html
@@ -0,0 +1,386 @@
+
+
+
+
+
+
+
+
+ nunique - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+nunique
+
+
+Count the number of unique elements in an array.
+Compatible with JAX and Dask, whose laziness would be otherwise
+problematic.
+
+Parameters:
+
+
+Returns:
+array – The number of unique elements in x . It can be lazy.
+
+Return type:
+object
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.one_hot.html b/generated/array_api_extra.one_hot.html
new file mode 100644
index 00000000..f6d553a5
--- /dev/null
+++ b/generated/array_api_extra.one_hot.html
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+ one_hot - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+one_hot
+
+
+One-hot encode the given indices.
+Each index in the input x is encoded as a vector of zeros of length num_classes
+with the element at the given index set to one.
+
+Parameters:
+
+x (object ) – An array with integral dtype whose values are between 0 and num_classes - 1 .
+num_classes (int ) – Number of classes in the one-hot dimension.
+dtype (object | None ) – The dtype of the return value. Defaults to the default float dtype (usually
+float64).
+axis (int ) – Position in the expanded axes where the new axis is placed. Default: -1.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+
An array having the same shape as x except for a new axis at the position
+given by axis having size num_classes . If axis is unspecified, it
+defaults to -1, which appends a new axis.
+If x < 0 or x >= num_classes , then the result is undefined, may raise
+an exception, or may even cause a bad state. x is not checked.
+
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_extra as xpx
+>>> import array_api_strict as xp
+>>> xpx . one_hot ( xp . asarray ([ 1 , 2 , 0 ]), 3 )
+Array([[0., 1., 0.],
+ [0., 0., 1.],
+ [1., 0., 0.]], dtype=array_api_strict.float64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.pad.html b/generated/array_api_extra.pad.html
new file mode 100644
index 00000000..0dbe6587
--- /dev/null
+++ b/generated/array_api_extra.pad.html
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+ pad - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+pad
+
+
+Pad the input array.
+
+Parameters:
+
+x (object ) – Input array.
+pad_width (int | tuple [int , int ] | Sequence [tuple [int , int ]] ) – Pad the input array with this many elements from each side.
+If a sequence of tuples, [(before_0, after_0), ... (before_N, after_N)] ,
+each pair applies to the corresponding axis of x .
+A single tuple, (before, after) , is equivalent to a list of x.ndim
+copies of this tuple.
+mode (Literal ['constant' ] ) – Only “constant” mode is currently supported, which pads with
+the value passed to constant_values .
+constant_values (complex ) – Use this value to pad the input. Default is zero.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+The input array,
+padded with pad_width elements equal to constant_values .
+
+Return type:
+object
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.partition.html b/generated/array_api_extra.partition.html
new file mode 100644
index 00000000..3d31f6ce
--- /dev/null
+++ b/generated/array_api_extra.partition.html
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+ partition - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+partition
+
+
+Return a partitioned copy of an array.
+Creates a copy of the array and partially sorts it in such a way that the value
+of the element in k-th position is in the position it would be in a sorted array.
+In the output array, all elements smaller than the k-th element are located to
+the left of this element and all equal or greater are located to its right.
+The ordering of the elements in the two partitions on the either side of
+the k-th element in the output array is undefined.
+
+Parameters:
+
+a (object ) – Input array.
+kth (int ) – Element index to partition by.
+axis (int | None ) – Axis along which to partition. The default is -1 (the last axis).
+If None , the flattened array is used.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+Array of the same type and shape as a .
+
+Return type:
+object
+
+
+Notes
+If xp implements partition or an equivalent function
+(e.g. topk for torch), complexity will likely be O(n).
+If not, this function simply calls xp.sort and complexity is O(n log n).
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.searchsorted.html b/generated/array_api_extra.searchsorted.html
new file mode 100644
index 00000000..763f7560
--- /dev/null
+++ b/generated/array_api_extra.searchsorted.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+ searchsorted - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+searchsorted
+
+
+Find indices where elements should be inserted to maintain order.
+Find the indices into a sorted array x1 such that if the elements in x2
+were inserted before the indices, the resulting array would remain sorted.
+The behavior of this function is similar to that of array_api.searchsorted() ,
+but it relaxes the requirement that x1 must be one-dimensional.
+This function is vectorized, treating slices along the last axis
+as elements and preceding axes as batch (or “loop”) dimensions.
+
+Parameters:
+
+x1 (object ) – Input array. Should have a real-valued data type. Must be sorted in ascending
+order along the last axis.
+x2 (object ) – Array containing search values. Should have a real-valued data type. Must have
+the same shape as x1 except along the last axis.
+side (Literal ['left' , 'right' ] ) – Argument controlling which index is returned if an element of x2 is equal to
+one or more elements of x1 : 'left' returns the index of the first of
+these elements; 'right' returns the next index after the last of these
+elements. Default: 'left' .
+xp (ModuleType | None ) – The standard-compatible namespace for the array arguments. Default: infer.
+
+
+Returns:
+Array – An array of indices with the same shape as x2 .
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> x = xp . asarray ([ 11 , 12 , 13 , 13 , 14 , 15 ])
+>>> xpx . searchsorted ( x , xp . asarray ([ 10 , 11.5 , 14.5 , 16 ]), xp = xp )
+Array([0, 1, 5, 6], dtype=array_api_strict.int64)
+>>> xpx . searchsorted ( x , xp . asarray ( 13 ), xp = xp )
+Array(2, dtype=array_api_strict.int64)
+>>> xpx . searchsorted ( x , xp . asarray ( 13 ), side = 'right' , xp = xp )
+Array(4, dtype=array_api_strict.int64)
+
+
+searchsorted is vectorized along the last axis.
+>>> x1 = xp . asarray ([[ 1. , 2. , 3. , 4. ], [ 5. , 6. , 7. , 8. ]])
+>>> x2 = xp . asarray ([[ 1.1 , 3.3 ], [ 6.6 , 8.8 ]])
+>>> xpx . searchsorted ( x1 , x2 , xp = xp )
+Array([[1, 3],
+ [2, 4]], dtype=array_api_strict.int64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.setdiff1d.html b/generated/array_api_extra.setdiff1d.html
new file mode 100644
index 00000000..a745f924
--- /dev/null
+++ b/generated/array_api_extra.setdiff1d.html
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+ setdiff1d - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+setdiff1d
+
+
+Find the set difference of two arrays.
+Return the unique values in x1 that are not in x2 .
+
+Parameters:
+
+x1 (object | complex ) – Input array.
+x2 (object | complex ) – Input comparison array.
+assume_unique (bool ) – If True , the input arrays are both assumed to be unique, which
+can speed up the calculation. Default is False .
+xp (ModuleType | None ) – The standard-compatible namespace for x1 and x2 . Default: infer.
+
+
+Returns:
+1D array of values in x1 that are not in x2 . The result
+is sorted when assume_unique is False , but otherwise only sorted
+if the input is sorted.
+
+Return type:
+object
+
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+
+
+>>> x1 = xp . asarray ([ 1 , 2 , 3 , 2 , 4 , 1 ])
+>>> x2 = xp . asarray ([ 3 , 4 , 5 , 6 ])
+>>> xpx . setdiff1d ( x1 , x2 , xp = xp )
+Array([1, 2], dtype=array_api_strict.int64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.sinc.html b/generated/array_api_extra.sinc.html
new file mode 100644
index 00000000..60c9860a
--- /dev/null
+++ b/generated/array_api_extra.sinc.html
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+
+
+ sinc - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+sinc
+
+
+Return the normalized sinc function.
+The sinc function is equal to \(\sin(\pi x)/(\pi x)\) for any argument
+\(x\ne 0\) . sinc(0) takes the limit value 1, making sinc not
+only everywhere continuous but also infinitely differentiable.
+
+
Note
+
Note the normalization factor of pi used in the definition.
+This is the most commonly used definition in signal processing.
+Use sinc(x / xp.pi) to obtain the unnormalized sinc function
+\(\sin(x)/x\) that is more common in mathematics.
+
+
+Parameters:
+
+x (object ) – Array (possibly multi-dimensional) of values for which to calculate
+sinc(x) . Must have a real floating point dtype.
+xp (ModuleType | None ) – The standard-compatible namespace for x . Default: infer.
+
+
+Returns:
+sinc(x) calculated elementwise, which has the same shape as the input.
+
+Return type:
+object
+
+
+Notes
+The name sinc is short for “sine cardinal” or “sinus cardinalis”.
+The sinc function is used in various signal processing applications,
+including in anti-aliasing, in the construction of a Lanczos resampling
+filter, and in interpolation.
+For bandlimited interpolation of discrete-time signals, the ideal
+interpolation kernel is proportional to the sinc function.
+References
+
+Weisstein, Eric W. “Sinc Function.” From MathWorld–A Wolfram Web
+Resource. https://mathworld.wolfram.com/SincFunction.html
+Wikipedia, “Sinc function”,
+https://en.wikipedia.org/wiki/Sinc_function
+
+Examples
+>>> import array_api_strict as xp
+>>> import array_api_extra as xpx
+>>> x = xp . linspace ( - 4 , 4 , 41 )
+>>> xpx . sinc ( x , xp = xp )
+Array([-3.89817183e-17, -4.92362781e-02,
+ -8.40918587e-02, -8.90384387e-02,
+ -5.84680802e-02, 3.89817183e-17,
+ 6.68206631e-02, 1.16434881e-01,
+ 1.26137788e-01, 8.50444803e-02,
+ -3.89817183e-17, -1.03943254e-01,
+ -1.89206682e-01, -2.16236208e-01,
+ -1.55914881e-01, 3.89817183e-17,
+ 2.33872321e-01, 5.04551152e-01,
+ 7.56826729e-01, 9.35489284e-01,
+ 1.00000000e+00, 9.35489284e-01,
+ 7.56826729e-01, 5.04551152e-01,
+ 2.33872321e-01, 3.89817183e-17,
+ -1.55914881e-01, -2.16236208e-01,
+ -1.89206682e-01, -1.03943254e-01,
+ -3.89817183e-17, 8.50444803e-02,
+ 1.26137788e-01, 1.16434881e-01,
+ 6.68206631e-02, 3.89817183e-17,
+ -5.84680802e-02, -8.90384387e-02,
+ -8.40918587e-02, -4.92362781e-02,
+ -3.89817183e-17], dtype=array_api_strict.float64)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.assert_close.html b/generated/array_api_extra.testing.assert_close.html
new file mode 100644
index 00000000..01c5fc73
--- /dev/null
+++ b/generated/array_api_extra.testing.assert_close.html
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+ testing.assert_close - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.assert_close
+
+
+Check that two arrays are close, up to tolerance atol + rtol * abs(desired) .
+This is an interface to numpy.testing.assert_allclose() which accepts
+any standard-compatible array and performs additional array namespace,
+shape, and dtype checks.
+
+Parameters:
+
+actual (object ) – The array produced by the tested function.
+desired (object ) – The expected array (typically hardcoded).
+rtol (float | object | None ) – Relative tolerance. Default: dtype-dependent.
+atol (float | object ) – Absolute tolerance. Default: 0.
+equal_nan (bool ) – Whether to consider NaNs in corresponding locations as equal.
+err_msg (str ) – Error message to display on failure.
+verbose (bool ) – Whether to include the conflicting arrays in the error message on failure.
+check_dtype (bool ) – Whether to check agreement between actual and desired dtypes.
+check_shape (bool ) – Whether to check agreement between actual and desired shapes.
+check_scalar (bool ) – NumPy only: whether to check agreement between actual and desired types —
+0-D numpy.ndarray vs scalar (e.g. numpy.double ).
+xp (ModuleType | None ) – A standard-compatible namespace which actual and desired must match.
+
+
+Raises:
+
+
+
+
+
+Return type:
+None
+
+
+Notes
+The default atol and rtol differ from xp.all(xpx.isclose(a, b)) .
+For inexact dtypes, the default rtol is
+xp.finfo(actual.dtype).eps ** 0.5 * 4 , which for float64 is roughly halfway
+between \(\sqrt{\epsilon}\) and the default for
+numpy.testing.assert_allclose() , 1e-7 .
+This gives a more reasonable default for lower precision dtypes,
+for example approximately 1e-3 for float32 .
+For exact dtypes, the default 1e-7 is used.
+Array arguments to atol and rtol must be valid input to float .
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.assert_close_nulp.html b/generated/array_api_extra.testing.assert_close_nulp.html
new file mode 100644
index 00000000..3086edd4
--- /dev/null
+++ b/generated/array_api_extra.testing.assert_close_nulp.html
@@ -0,0 +1,419 @@
+
+
+
+
+
+
+
+
+ testing.assert_close_nulp - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.assert_close_nulp
+
+
+Compare two arrays relatively to their spacing.
+This is an interface to numpy.testing.assert_array_almost_equal_nulp()
+which accepts any standard-compatible array and performs
+additional array namespace, shape, and dtype checks.
+
+Parameters:
+
+actual (object ) – The array produced by the tested function.
+desired (object ) – The expected array (typically hardcoded).
+nulp (int ) – The maximum number of units in the last place
+for the tolerance check. Default: 1 .
+check_dtype (bool ) – Whether to check agreement between actual and desired dtypes.
+check_shape (bool ) – Whether to check agreement between actual and desired shapes.
+check_scalar (bool ) – NumPy only: whether to check agreement between actual and desired types —
+0-D numpy.ndarray vs scalar (e.g. numpy.double ).
+xp (ModuleType | None ) – A standard-compatible namespace which actual and desired must match.
+
+
+Raises:
+
+
+
+
+
+Return type:
+None
+
+
+Notes
+This is a relatively robust method to compare two arrays whose amplitude is
+variable.
+An assertion is raised if the following condition is not met:
+abs ( actual - desired ) <= nulp * spacing ( maximum ( abs ( actual ), abs ( desired )))
+
+
+where spacing(x) is the distance between x and the nearest adjacent number
+representable by in the data type of x .
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.assert_equal.html b/generated/array_api_extra.testing.assert_equal.html
new file mode 100644
index 00000000..d94f018d
--- /dev/null
+++ b/generated/array_api_extra.testing.assert_equal.html
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+ testing.assert_equal - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.assert_equal
+
+
+Check that two arrays are equal.
+This is an interface to numpy.testing.assert_array_equal() which accepts
+any standard-compatible array and performs additional array namespace,
+shape, and dtype checks.
+
+Parameters:
+
+actual (object ) – The array produced by the tested function.
+desired (object ) – The expected array (typically hardcoded).
+err_msg (str ) – Error message to display on failure.
+verbose (bool ) – Whether to include the conflicting arrays in the error message on failure.
+check_dtype (bool ) – Whether to check agreement between actual and desired dtypes.
+check_shape (bool ) – Whether to check agreement between actual and desired shapes.
+check_scalar (bool ) – NumPy only: whether to check agreement between actual and desired types —
+0-D numpy.ndarray vs scalar (e.g. numpy.double ).
+xp (ModuleType | None ) – A standard-compatible namespace which actual and desired must match.
+
+
+Raises:
+
+
+
+
+
+Return type:
+None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.assert_less.html b/generated/array_api_extra.testing.assert_less.html
new file mode 100644
index 00000000..eee881f6
--- /dev/null
+++ b/generated/array_api_extra.testing.assert_less.html
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+ testing.assert_less - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.assert_less
+
+
+Check that two arrays are ordered by less than.
+This is an interface to numpy.testing.assert_array_less() which accepts
+any standard-compatible array and performs additional array namespace,
+shape, and dtype checks.
+
+Parameters:
+
+x (object ) – Array to compare according to x < y (elementwise).
+y (object ) – Array to compare according to x < y (elementwise).
+err_msg (str ) – Error message to display on failure.
+verbose (bool ) – Whether to include the conflicting arrays in the error message on failure.
+check_dtype (bool ) – Whether to check agreement between the dtypes of x and y .
+check_shape (bool ) – Whether to check agreement between the shapes of x and y .
+check_scalar (bool ) – NumPy only: whether to check agreement between actual and desired types —
+0-D numpy.ndarray vs scalar (e.g. numpy.double ).
+xp (ModuleType | None ) – A standard-compatible namespace which x and y must match.
+
+
+Raises:
+
+
+
+
+
+Return type:
+None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.lazy_xp_function.html b/generated/array_api_extra.testing.lazy_xp_function.html
new file mode 100644
index 00000000..7e15d6ec
--- /dev/null
+++ b/generated/array_api_extra.testing.lazy_xp_function.html
@@ -0,0 +1,504 @@
+
+
+
+
+
+
+
+
+ testing.lazy_xp_function - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.lazy_xp_function
+
+
+Tag a function to be tested on lazy backends.
+Tag a function so that when any tests are executed with xp=jax.numpy the
+function is replaced with a jitted version of itself, and when it is executed with
+xp=dask.array the function will raise if it attempts to materialize the graph.
+This will be later expanded to provide test coverage for other lazy backends.
+In order for the tag to be effective, the test or a fixture must call
+patch_lazy_xp_functions() .
+
+Parameters:
+
+func (Callable [... , Any ] | tuple [type , str ] ) – Function to be tested, or a tuple containing an (uninstantiated) class and a
+method name to specify a class method to be tested.
+allow_dask_compute (bool | int ) –
Whether func is allowed to internally materialize the Dask graph, or maximum
+number of times it is allowed to do so. This is typically triggered by
+bool() , float() , or np.asarray() .
+Set to 1 if you are aware that func converts the input parameters to NumPy and
+want to let it do so at least for the time being, knowing that it is going to be
+extremely detrimental for performance.
+If a test needs values higher than 1 to pass, it is a canary that the conversion
+to NumPy/bool/float is happening multiple times, which translates to multiple
+computations of the whole graph. Short of making the function fully lazy, you
+should at least add explicit calls to np.asarray() early in the function.
+Note: the counter of allow_dask_compute resets after each call to func , so
+a test function that invokes func multiple times should still work with this
+parameter set to 1.
+Set to True to allow func to materialize the graph an unlimited number
+of times.
+Default: False, meaning that func must be fully lazy and never materialize the
+graph.
+
+jax_jit (bool ) –
Set to True to replace func with a smart variant of jax.jit(func) after
+calling the patch_lazy_xp_functions() test helper with xp=jax.numpy .
+This is the default behaviour.
+Set to False if func is only compatible with eager (non-jitted) JAX.
+Unlike with vanilla jax.jit , all arguments and return types that are not JAX
+arrays are treated as static; the function can accept and return arbitrary
+wrappers around JAX arrays. This difference is because, in real life, most users
+won’t wrap the function directly with jax.jit but rather they will use it
+within their own code, which is itself then wrapped by jax.jit , and
+internally consume the function’s outputs.
+In other words, the pattern that is being tested is:
+>>> @jax . jit
+... def user_func ( x ):
+... y = user_prepares_inputs ( x )
+... z = func ( y , some_static_arg = True )
+... return user_consumes ( z )
+
+
+Default: True.
+
+static_argnums (Deprecated ) – Deprecated; ignored.
+static_argnames (Deprecated ) – Deprecated; ignored.
+
+
+
+
+
See also
+
+patch_lazy_xp_functions Companion function to call from the test or fixture.
+
+jax.jit JAX function to compile a function for performance.
+
+
+
+
+Return type:
+None
+
+
+Examples
+In test_mymodule.py :
+from array_api_extra.testing import lazy_xp_function from mymodule import myfunc
+
+lazy_xp_function ( myfunc )
+
+def test_myfunc ( xp ):
+ a = xp . asarray ([ 1 , 2 ])
+ # When xp=jax.numpy, this is similar to `b = jax.jit(myfunc)(a)`
+ # When xp=dask.array, crash on compute() or persist()
+ b = myfunc ( a )
+
+
+Notes
+In order for this tag to be effective, the test function must be imported into the
+test module globals without its namespace; alternatively its namespace must be
+declared in a lazy_xp_modules list in the test module globals.
+Example 1:
+from mymodule import myfunc
+
+lazy_xp_function ( myfunc )
+
+def test_myfunc ( xp ):
+ x = myfunc ( xp . asarray ([ 1 , 2 ]))
+
+
+Example 2:
+import mymodule
+
+lazy_xp_modules = [ mymodule ]
+lazy_xp_function ( mymodule . myfunc )
+
+def test_myfunc ( xp ):
+ x = mymodule . myfunc ( xp . asarray ([ 1 , 2 ]))
+
+
+A test function can circumvent this monkey-patching system by using a namespace
+outside of the two above patterns. You need to sanitize your code to make sure this
+only happens intentionally.
+Example 1:
+import mymodule
+from mymodule import myfunc
+
+lazy_xp_function ( myfunc )
+
+def test_myfunc ( xp ):
+ a = xp . asarray ([ 1 , 2 ])
+ b = myfunc ( a ) # This is wrapped when xp=jax.numpy or xp=dask.array
+ c = mymodule . myfunc ( a ) # This is not
+
+
+Example 2:
+import mymodule
+
+class naked :
+ myfunc = mymodule . myfunc
+
+lazy_xp_modules = [ mymodule ]
+lazy_xp_function ( mymodule . myfunc )
+
+def test_myfunc ( xp ):
+ a = xp . asarray ([ 1 , 2 ])
+ b = mymodule . myfunc ( a ) # This is wrapped when xp=jax.numpy or xp=dask.array
+ c = naked . myfunc ( a ) # This is not
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.testing.patch_lazy_xp_functions.html b/generated/array_api_extra.testing.patch_lazy_xp_functions.html
new file mode 100644
index 00000000..6886cdf2
--- /dev/null
+++ b/generated/array_api_extra.testing.patch_lazy_xp_functions.html
@@ -0,0 +1,422 @@
+
+
+
+
+
+
+
+
+ testing.patch_lazy_xp_functions - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+testing.patch_lazy_xp_functions
+
+
+Test lazy execution of functions tagged with lazy_xp_function() .
+If xp==jax.numpy , search for all functions and methods which have been tagged
+with lazy_xp_function() in the globals of the module that defines the current
+test, as well as in the lazy_xp_modules list in the globals of the same module,
+and wrap them with jax.jit() .
+Unwrap them at the end of the test.
+If xp==dask.array , wrap the functions with a decorator that disables
+compute() and persist() and ensures that exceptions and warnings are raised
+eagerly.
+This function should be typically called by your library’s xp fixture that runs
+tests on multiple backends:
+@pytest . fixture ( params = [
+ numpy ,
+ array_api_strict ,
+ pytest . param ( jax . numpy , marks = pytest . mark . thread_unsafe ),
+ pytest . param ( dask . array , marks = pytest . mark . thread_unsafe ),
+])
+def xp ( request ):
+ with patch_lazy_xp_functions ( request , xp = request . param ):
+ yield request . param
+
+
+but it can be otherwise be called by the test itself too.
+
+Parameters:
+
+request (FixtureRequest ) – Pytest fixture, as acquired by the test itself or by one of its fixtures.
+monkeypatch (MonkeyPatch | None ) – Deprecated.
+xp (ModuleType ) – Array namespace to be tested.
+
+
+Returns:
+Testing context manager.
+
+Return type:
+AbstractContextManager [None ]
+
+
+
+
See also
+
+lazy_xp_function Tag a function to be tested on lazy backends.
+
+pytest.FixtureRequest request test function parameter.
+
+
+
+Notes
+This context manager monkey-patches modules and as such is thread unsafe
+on Dask and JAX. If you run your test suite with
+pytest-run-parallel ,
+you should mark these backends with @pytest.mark.thread_unsafe , as shown in
+the example above.
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/generated/array_api_extra.union1d.html b/generated/array_api_extra.union1d.html
new file mode 100644
index 00000000..6aca6685
--- /dev/null
+++ b/generated/array_api_extra.union1d.html
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+ union1d - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+union1d
+
+
+Find the union of two arrays.
+Return the unique, sorted array of values that are in either of the two
+input arrays.
+
+Parameters:
+
+a (object ) – Input arrays. They are flattened internally if they are not already 1D.
+b (object ) – Input arrays. They are flattened internally if they are not already 1D.
+xp (ModuleType | None ) – The standard-compatible namespace for a and b . Default: infer.
+
+
+Returns:
+Unique, sorted union of the input arrays.
+
+Return type:
+object
+
+
+
+Notes
+This function is not compatible with jax.jit .
+See the docstring of the corresponding JAX function for more information.
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/genindex.html b/genindex.html
new file mode 100644
index 00000000..e949c0c6
--- /dev/null
+++ b/genindex.html
@@ -0,0 +1,493 @@
+
+
+
+
+
+
+ Index - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..9afe5032
--- /dev/null
+++ b/index.html
@@ -0,0 +1,538 @@
+
+
+
+
+
+
+
+
+ array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lefthook.yml b/lefthook.yml
deleted file mode 100644
index 57fdcc5d..00000000
--- a/lefthook.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-lefthook: pixi run --no-progress --environment=lint --frozen lefthook
-
-templates:
- run: run --quiet --no-progress --environment=lint --frozen
-
-colors: true
-
-output:
- - meta # Print lefthook version
- - summary # Print summary block (successful and failed steps)
- - empty_summary # Print summary heading when there are no steps to run
- # - success # Print successful steps
- # - failure # Print failed steps printing
- # - execution # Print any execution logs
- # - execution_out # Print execution output
- # - execution_info # Print `EXECUTE > ...` logging
- - skips # Print "skip" (i.e. no files matched)
-
-pre-commit:
- parallel: true
- jobs:
- - name: dprint
- glob: "*.{json,jsonc,md,toml,yaml,yml}"
- stage_fixed: true
- run: pixi {run} dprint
- - name: ruff
- glob: "*.{py,pyi}"
- stage_fixed: true
- group:
- piped: true
- jobs:
- - name: ruff check
- run: pixi {run} ruff-check {staged_files}
- - name: ruff format
- run: pixi {run} ruff-format {staged_files}
- - name: pyright
- glob: "*.{py,pyi}"
- run: pixi {run} pyright
- - name: mypy
- glob: "*.{py,pyi}"
- run: pixi {run} mypy
- - name: pyrefly
- glob: "*.{py, pyi}"
- run: pixi {run} pyrefly
- - name: typos
- stage_fixed: true
- run: pixi {run} typos
- - name: actionlint
- run: pixi {run} actionlint
- - name: zizmor
- run: pixi {run} zizmor
- - name: blacken-docs
- glob: "*.md"
- stage_fixed: true
- run: pixi {run} blacken-docs {staged_files}
- - name: validate-pyproject
- glob: "pyproject.toml"
- run: pixi {run} validate-pyproject
- - name: numpydoc
- glob: "*.py"
- run: pixi {run} numpydoc {staged_files}
diff --git a/meson.build b/meson.build
deleted file mode 100644
index d79a7a5f..00000000
--- a/meson.build
+++ /dev/null
@@ -1,40 +0,0 @@
-project(
- 'array-api-extra',
- version: '0.11.1.dev0'
-)
-
-py = import('python').find_installation()
-
-# NOTE: downstream projects may rely on this variable name when vendoring,
-# do not change it without consulting with downstream projects
-sources = {
- 'array_api_extra': files(
- 'src/array_api_extra/__init__.py',
- 'src/array_api_extra/_delegation.py',
- 'src/array_api_extra/py.typed',
- 'src/array_api_extra/testing.py',
- ),
- 'array_api_extra/_lib': files(
- 'src/array_api_extra/_lib/__init__.py',
- 'src/array_api_extra/_lib/_at.py',
- 'src/array_api_extra/_lib/_backends.py',
- 'src/array_api_extra/_lib/_funcs.py',
- 'src/array_api_extra/_lib/_lazy.py',
- 'src/array_api_extra/_lib/_testing.py',
- ),
- 'array_api_extra/_lib/_utils': files(
- 'src/array_api_extra/_lib/_utils/__init__.py',
- 'src/array_api_extra/_lib/_utils/_compat.py',
- 'src/array_api_extra/_lib/_utils/_compat.pyi',
- 'src/array_api_extra/_lib/_utils/_helpers.py',
- 'src/array_api_extra/_lib/_utils/_typing.py',
- 'src/array_api_extra/_lib/_utils/_typing.pyi',
- ),
-}
-
-foreach subdir, files : sources
- py.install_sources(files, subdir: subdir)
-endforeach
-
-subdir('tests')
-subdir('vendor_tests')
diff --git a/objects.inv b/objects.inv
new file mode 100644
index 00000000..eb163910
Binary files /dev/null and b/objects.inv differ
diff --git a/pixi.lock b/pixi.lock
deleted file mode 100644
index 2b1b9f45..00000000
--- a/pixi.lock
+++ /dev/null
@@ -1,14998 +0,0 @@
-version: 7
-platforms:
-- name: linux-64
-- name: osx-64
-- name: osx-arm64
-- name: win-64
-environments:
- default:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- dev:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.12-h8bc977c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ast-serialize-0.5.0-py310hd8a072f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/astroid-4.0.4-py314hdafbbf9_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py314h28848ee_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cpu_py314h3a2952f_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.1.9-hfc2019e_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cpu_mkl_h55d9b97_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py314h6477eea_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mypy-2.1.0-py314h518bba1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nodejs-26.3.0-he4ff34a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py314h9891dd4_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyrefly-1.0.0-h2b88eb6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.11.0-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytokens-0.4.1-py314h0f05182_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cpu_mkl_py314_h94e416f_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.15.16-h6a952e8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/typos-1.47.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zizmor-1.25.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.12-h5220d24_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ast-serialize-0.5.0-py310hb9b2626_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/astroid-4.0.4-py314hee6578b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py314hd534dbf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py314h66e2b45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.1.9-h5839d16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py314h613bbd0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mypy-2.1.0-py314h00bde9c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/nodejs-26.3.0-hf3170e9_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py314h34b395f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py314h0963f2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/psutil-7.2.2-py314hd330473_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyrefly-1.0.0-he97e7a4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-librt-0.11.0-py314h0b69929_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytokens-0.4.1-py314h0b69929_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py314_h02f7b3f_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.15.16-h1ddadc8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/typos-1.47.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.25.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.12-h7969508_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ast-serialize-0.5.0-py310h3b8a9b8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-4.0.4-py314h4dc9dd8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py314hf9f5e1b_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py314h2543417_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.1.9-hf76c51c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py314hdd732f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-2.1.0-py314h2fbedac_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-26.3.0-h7039424_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py314h6cfcd04_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyrefly-1.0.0-h4dd0d4f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.11.0-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytokens-0.4.1-py314ha14b1ff_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py314_h30a3122_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.15.16-h80928e0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.47.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.25.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyhe2676ad_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.12-h11b0a5a_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ast-serialize-0.5.0-py310ha413424_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.1.9-h11686cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cpu_mkl_haf7133b_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/mypy-2.1.0-py314h13f4da2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/nodejs-26.3.0-h80d1838_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py314h909e829_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyrefly-1.0.0-hfe91638_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.11.0-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cpu_mkl_py314_h7f060ac_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/ruff-0.15.16-h45713df_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py314h221f224_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/typos-1.47.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zizmor-1.25.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- dev-cuda:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.12-h8bc977c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ast-serialize-0.5.0-py310hd8a072f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/astroid-4.0.4-py314hdafbbf9_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-dev-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cudnn-9.10.2.21-hbcb9cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-14.1.1-py314h3d8d815_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-core-14.1.1-py314hf9e62a7_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py314h28848ee_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cuda129_py314hfcd48a0_200.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.1.9-hfc2019e_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-dev-9.10.2.21-h58dd1b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudss-0.7.1.4-h58dd1b1_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-dev-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-dev-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-dev-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cuda129_mkl_hda1b8b5_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py314h6477eea_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mypy-2.1.0-py314h518bba1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nccl-2.30.4.1-h4d09622_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nodejs-26.3.0-he4ff34a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py314h9891dd4_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyrefly-1.0.0-h2b88eb6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.11.0-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytokens-0.4.1-py314h0f05182_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cuda129_mkl_py314_hfa65069_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.15.16-h6a952e8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/triton-3.6.0-cuda129py314h2b49ec1_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/typos-1.47.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zizmor-1.25.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.12-h5220d24_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ast-serialize-0.5.0-py310hb9b2626_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/astroid-4.0.4-py314hee6578b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py314hd534dbf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py314h66e2b45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.1.9-h5839d16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py314h613bbd0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mypy-2.1.0-py314h00bde9c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/nodejs-26.3.0-hf3170e9_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py314h34b395f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py314h0963f2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/psutil-7.2.2-py314hd330473_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyrefly-1.0.0-he97e7a4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-librt-0.11.0-py314h0b69929_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytokens-0.4.1-py314h0b69929_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py314_h02f7b3f_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.15.16-h1ddadc8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/typos-1.47.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.25.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.12-h7969508_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ast-serialize-0.5.0-py310h3b8a9b8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-4.0.4-py314h4dc9dd8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py314hf9f5e1b_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py314h2543417_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.1.9-hf76c51c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py314hdd732f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-2.1.0-py314h2fbedac_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-26.3.0-h7039424_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py314h6cfcd04_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyrefly-1.0.0-h4dd0d4f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.11.0-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytokens-0.4.1-py314ha14b1ff_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py314_h30a3122_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.15.16-h80928e0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.47.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.25.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyhe2676ad_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.12-h11b0a5a_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ast-serialize-0.5.0-py310ha413424_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cupti-12.9.79-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-14.1.1-py314h7882ca2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-core-14.1.1-py314h95bfa35_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.1.9-h11686cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcublas-12.9.2.10-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudnn-9.10.2.21-hca898b4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudss-0.7.1.4-hca898b4_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcufft-11.4.1.4-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcurand-10.3.10.19-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusolver-11.7.5.82-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusparse-12.5.10.65-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmagma-2.10.0-hb6a17ea_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cuda128_mkl_h2cf6d90_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/mypy-2.1.0-py314h13f4da2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/nodejs-26.3.0-h80d1838_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py314h909e829_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyrefly-1.0.0-hfe91638_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.11.0-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cuda128_mkl_py314_h642f7e6_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/ruff-0.15.16-h45713df_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.16.3-py314h221f224_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/typos-1.47.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zizmor-1.25.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- docs:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- lint:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.12-h8bc977c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ast-serialize-0.5.0-py310hd8a072f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/astroid-4.0.4-py314hdafbbf9_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.1.9-hfc2019e_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mypy-2.1.0-py314h518bba1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nodejs-26.3.0-he4ff34a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyrefly-1.0.0-h2b88eb6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.11.0-py314h0f05182_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytokens-0.4.1-py314h0f05182_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.15.16-h6a952e8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/typos-1.47.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zizmor-1.25.2-hb17b654_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.12-h5220d24_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ast-serialize-0.5.0-py310hb9b2626_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/astroid-4.0.4-py314hee6578b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.1.9-h5839d16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mypy-2.1.0-py314h00bde9c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/nodejs-26.3.0-hf3170e9_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/psutil-7.2.2-py314hd330473_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyrefly-1.0.0-he97e7a4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-librt-0.11.0-py314h0b69929_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytokens-0.4.1-py314h0b69929_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.15.16-h1ddadc8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/typos-1.47.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.25.2-h19f9e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.12-h7969508_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ast-serialize-0.5.0-py310h3b8a9b8_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-4.0.4-py314h4dc9dd8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.1.9-hf76c51c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mypy-2.1.0-py314h2fbedac_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-26.3.0-h7039424_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyrefly-1.0.0-h4dd0d4f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.11.0-py314ha14b1ff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytokens-0.4.1-py314ha14b1ff_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.15.16-h80928e0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.47.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.25.2-h6fdd925_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.12-h11b0a5a_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ast-serialize-0.5.0-py310ha413424_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/lefthook-2.1.9-h11686cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/mypy-2.1.0-py314h13f4da2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/nodejs-26.3.0-h80d1838_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyrefly-1.0.0-hfe91638_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-librt-0.11.0-py314hc5dbbe4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/ruff-0.15.16-h45713df_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/typos-1.47.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zizmor-1.25.2-h18a1a76_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py314h221f224_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-backends:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py314h28848ee_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cpu_py314h3a2952f_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cpu_mkl_h55d9b97_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py314h6477eea_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py314h9891dd4_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cpu_mkl_py314_h94e416f_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py314hd534dbf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py314h66e2b45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py314h613bbd0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py314h34b395f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py314h0963f2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py314_h02f7b3f_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py314hf9f5e1b_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py314h2543417_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py314hdd732f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py314h6cfcd04_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py314_h30a3122_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cpu_mkl_haf7133b_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py314h909e829_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cpu_mkl_py314_h7f060ac_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py314h221f224_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-backends-py311:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py311h3778330_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py311h92a432a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cpu_py311hceffaa2_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cpu_mkl_h55d9b97_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py311h41a00d4_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py311h912ec1f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py311h3c884d5_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py311hdf67eae_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cpu_mkl_py311_h338015a_101.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py311ha8ae342_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py311hee6c895_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py311hc34a41d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py311h2a7c09c_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py311ha8ae342_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py311hca72124_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py311h7fce02c_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py311h2c4eb96_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py311hd8befaf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py311_h1a2d5a6_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py311h53ebfaf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py311h556693a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py311hc290fe0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py311hafb79fe_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py311h001ef46_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py311h5d75059_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py311hc290fe0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py311hb7ce6e1_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py311h7b83a5e_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py311hbd1492f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py311h572238d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py311_hbaf2b46_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py311hc290fe0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py311h9a58382_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py311h3f79411_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cpu_mkl_haf7133b_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py311h4f568be_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py311h3f79411_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py311h34437f8_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py311h3fd045d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cpu_mkl_py311_h29716f0_100.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py311h3f79411_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py311h9c22a71_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-cuda:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-dev-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cudnn-9.10.2.21-hbcb9cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-14.1.1-py314h3d8d815_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-core-14.1.1-py314hf9e62a7_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py314h28848ee_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cuda129_py314hfcd48a0_200.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-dev-9.10.2.21-h58dd1b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudss-0.7.1.4-h58dd1b1_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-dev-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-dev-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-dev-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cuda129_mkl_hda1b8b5_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py314h6477eea_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nccl-2.30.4.1-h4d09622_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py314h9891dd4_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cuda129_mkl_py314_hfa65069_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/triton-3.6.0-cuda129py314h2b49ec1_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py314hd534dbf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py314h66e2b45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py314h613bbd0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py314h34b395f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py314h0963f2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py314_h02f7b3f_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py314hf9f5e1b_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py314h2543417_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py314hdd732f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py314h6cfcd04_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py314_h30a3122_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cupti-12.9.79-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-14.1.1-py314h7882ca2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-core-14.1.1-py314h95bfa35_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcublas-12.9.2.10-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudnn-9.10.2.21-hca898b4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudss-0.7.1.4-hca898b4_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcufft-11.4.1.4-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcurand-10.3.10.19-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusolver-11.7.5.82-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusparse-12.5.10.65-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmagma-2.10.0-hb6a17ea_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cuda128_mkl_h2cf6d90_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py314h909e829_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cuda128_mkl_py314_h642f7e6_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.16.3-py314h221f224_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-cuda-py311:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py311h3778330_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-dev-12.9.79-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cudnn-9.10.2.21-hbcb9cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-14.1.1-py311hc89daa0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/cupy-core-14.1.1-py311he30c881_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/flatbuffers-25.9.23-hb7d4c21_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py311h92a432a_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cuda129_py311h6689f8c_200.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudnn-dev-9.10.2.21-h58dd1b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcudss-0.7.1.4-h58dd1b1_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufft-dev-11.4.1.4-hecca717_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcurand-dev-10.3.10.19-h676940d_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-dev-11.7.5.82-h676940d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cuda129_mkl_hda1b8b5_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py311h41a00d4_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py311h912ec1f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/nccl-2.30.4.1-h4d09622_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py311h3c884d5_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py311hdf67eae_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cuda129_mkl_py311_h6b7d41d_300.conda
- - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.16.3-py311hbe70eeb_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/triton-3.6.0-cuda129py311h2e1fb5d_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py311ha8ae342_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py311hee6c895_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py311hc34a41d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py311h2a7c09c_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py311ha8ae342_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py311hca72124_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py311h7fce02c_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py311h2c4eb96_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py311hd8befaf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py311_h1a2d5a6_101.conda
- - conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py311h53ebfaf_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py311h556693a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jax-0.9.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py311hc290fe0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/flatbuffers-25.9.23-h9e8ef45_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/fmt-12.1.0-h403dcb5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py311hafb79fe_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py311h001ef46_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py311h5d75059_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py311hc290fe0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py311hb7ce6e1_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py311h7b83a5e_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py311hbd1492f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py311h572238d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py311_hbaf2b46_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py311hc290fe0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py311h9a58382_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py311h3f79411_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-cupti-12.9.79-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-14.1.1-py311h9ddb863_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/cupy-core-14.1.1-py311h49c6b33_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcublas-12.9.2.10-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudnn-9.10.2.21-hca898b4_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcudss-0.7.1.4-hca898b4_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcufft-11.4.1.4-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcurand-10.3.10.19-hac47afa_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusolver-11.7.5.82-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcusparse-12.5.10.65-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmagma-2.10.0-hb6a17ea_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cuda128_mkl_h2cf6d90_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py311h4f568be_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py311h3f79411_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py311h34437f8_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py311h3fd045d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cuda128_mkl_py311_h2eca7bd_300.conda
- - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py311h3f79411_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.16.3-py311h9c22a71_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-nogil:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.2-py313hfc84e54_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.13-h0c81058_0_cp313t.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py313h0dc34c3_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/coverage-7.14.1-pyh7db6752_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-run-parallel-0.9.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-freethreading-3.13.13-h92d6c8b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313t.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/coverage-7.14.1-pyh7db6752_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-run-parallel-0.9.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-freethreading-3.13.13-h92d6c8b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313t.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.2-py313h210eedd_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.13-h4fb2cf0_0_cp313t.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py313habc7bd5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/coverage-7.14.1-pyh7db6752_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-run-parallel-0.9.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-freethreading-3.13.13-h92d6c8b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313t.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.2-py313hbb1b99b_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.13-h76e3b2d_0_cp313t.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py313hf3ca9c9_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/coverage-7.14.1-pyh7db6752_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-run-parallel-0.9.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python-freethreading-3.13.13-h92d6c8b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313t.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.2-py313hfb2b801_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.13.13-ha261ea0_0_cp313t.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py313hff732fb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-numpy1:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py311h3778330_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-1.24.1-py311h8e6699e_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py311ha8ae342_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-1.24.1-py311ha9d2c9f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.15.2-py311h0c91ca8_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py311hc290fe0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.24.1-py311h60f8152_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.2-py311h0675101_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py311h3f79411_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-1.24.1-py311h0b4df5a_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.2-py311h99d06ae_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_38.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-py311:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py311h3778330_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py311ha8ae342_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py311h2c4eb96_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py311h556693a_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py311hc290fe0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py311hbd1492f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py311h9a58382_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py311h3f79411_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py311h9c22a71_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-py314:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py314h221f224_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
- tests-run-deps:
- channels:
- - url: https://prefix.dev/conda-forge/
- packages:
- linux-64:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda_source: array-api-extra[2e1bead4] @ .
- osx-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- - conda_source: array-api-extra[192fdc2f] @ .
- osx-arm64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
- - conda_source: array-api-extra[24d19263] @ .
- win-64:
- - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda
- - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- - conda_source: array-api-extra[a6b7f981] @ .
-packages:
-- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- build_number: 20
- sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9
- md5: a9f577daf3de00bca7c3c76c0ecbd1de
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgomp >=7.5.0
- constrains:
- - openmp_impl <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- strong:
- - _openmp_mutex >=4.5
- size: 28948
- timestamp: 1770939786096
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - _openmp_mutex >=4.5
- size: 8244
- timestamp: 1764092331208
-- conda: https://prefix.dev/conda-forge/linux-64/actionlint-1.7.12-h8bc977c_0.conda
- sha256: 1fff5ee0d83045ef90104ca83f52b4c44feb4ab2036fc7903fe9733f50721209
- md5: bab393750db08f50eebaf96f50d18734
- depends:
- - libgcc >=14
- - __glibc >=2.17
- - __glibc >=2.17,<3.0.a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 2131192
- timestamp: 1774975766537
-- conda: https://prefix.dev/conda-forge/linux-64/ast-serialize-0.5.0-py310hd8a072f_1.conda
- noarch: python
- sha256: cf1cf3d0fa59fe0ab6bc3af722d820c1a85a9233c786f614f377c651fec6a7f9
- md5: 6adea4814147f458d6278d053850b0ac
- depends:
- - python >=3.10
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - _python_abi3_support 1.*
- - cpython >=3.10
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 1125371
- timestamp: 1780396651124
-- conda: https://prefix.dev/conda-forge/linux-64/astroid-4.0.4-py314hdafbbf9_0.conda
- sha256: 64b35b179ffc0e2409eced094c6280f89c4bbbba5715ae2ba18d37e18e00fce0
- md5: bc30c5eab5cb4daeff7931dd6523e1d7
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: LGPL-2.1-or-later
- license_family: LGPL
- run_exports: {}
- size: 540737
- timestamp: 1770634493936
-- conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda
- sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0
- md5: 8910d2c46f7e7b519129f486e0fe927a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - libbrotlicommon 1.2.0 hb03c661_1
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 367376
- timestamp: 1764017265553
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - bzip2 >=1.0.8,<2.0a0
- size: 260182
- timestamp: 1771350215188
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - c-ares >=1.34.6,<2.0a0
- size: 207882
- timestamp: 1765214722852
-- conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py311h3778330_0.conda
- sha256: ebefe7c8a41d14e4a50c5b862cf0226b3ac745495415bb6fb0db364b945cfe3a
- md5: f875c239f662e1b31fbf32282f1da087
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 399156
- timestamp: 1779838054673
-- conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda
- sha256: 4fb298517c0aff45eb449bf4bd484c0f4d0ab36d4e5c1005b7f0312e68330b57
- md5: 2af0e1fec00680b1b6ef3859585ca8fa
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 413054
- timestamp: 1779837945378
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda
- sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45
- md5: 503a94e20d2690d534d676a764a1852c
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 29138
- timestamp: 1753975252445
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda
- sha256: 57d1294ecfaf9dc8cdb5fc4be3e63ebc7614538bddb5de53cfd9b1b7de43aed5
- md5: cb15315d19b58bd9cd424084e58ad081
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-cudart_linux-64 12.9.79 h3f2d84a_0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=13
- - libstdcxx >=13
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 23242
- timestamp: 1749218416505
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda
- sha256: 113c354cb176eee131cc193507214a471bef73e000f5a143f7367c0e48d92959
- md5: 55a83761db33f82d92d7d7a4a61662e5
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-nvdisasm
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 245074
- timestamp: 1761107448598
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_1.conda
- sha256: f46c13ab4335281a683f428376cb599019dfd25adafabc39c223824daab7ccae
- md5: a2ddf359dcb9e6a3d0173b10f58f4db9
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 1841757
- timestamp: 1761098689894
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-cupti-dev-12.9.79-h676940d_1.conda
- sha256: f51eabcbdd3162857c98129d34641acd4467b72015ac9c629b82ff72aaf2bc67
- md5: 6465379b0c7dcea5f2abb20a66c2b737
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-cupti 12.9.79 h676940d_1
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - cuda-cupti-static >=12.9.79
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - cuda-cupti >=12.9.79,<13.0a0
- size: 4626081
- timestamp: 1761098739697
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda
- sha256: 0e849be7b5e4832ca218ec2c48a9ba3a15a984f629e2e54f38a53f4f57220341
- md5: dc256c9864c2e8e9c817fbca1c84a4bc
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-crt-tools 12.9.86 ha770c72_2
- - cuda-nvvm-tools 12.9.86 h4bc722e_2
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=12
- - libstdcxx >=12
- constrains:
- - gcc_impl_linux-64 >=6,<15.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 27380012
- timestamp: 1753975454194
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda
- sha256: 6851de88381f2ea0cbc5d18a91ae8a8ff6e682c6ee58c03c922902a0c25eb1a7
- md5: 5e7845d208a5067cb1461a429ff887e0
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 5518360
- timestamp: 1761098730432
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda
- sha256: 68f81268c25befa9b70dc49af469ab0eb131960e3700b9a4edb46a32da343a28
- md5: 53f0062e2243b26e43ddac0b5267c6a3
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 67168282
- timestamp: 1760723629347
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda
- sha256: b16600e48ef3247366b83d5f195852fcefbc4d52bb245f82a632c7129d1d6283
- md5: b4a3411fa031c409f98cfbd4b2db9ad7
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 29436
- timestamp: 1761098820386
-- conda: https://prefix.dev/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda
- sha256: 45f5e881ed0d973132a5475a0b5c066db6e748ef3a831a14dba8374b252e0067
- md5: f9af26e4079adcd72688a8e8dbecb229
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=12
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 24246736
- timestamp: 1753975332907
-- conda: https://prefix.dev/conda-forge/linux-64/cudnn-9.10.2.21-hbcb9cd8_0.conda
- sha256: 5760ad9de2ecff210b018503168d26996497604608cf59f93df90f01ea4eb982
- md5: c8168e26c0a9f50425ac05d6a5201c12
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12,<13.0a0
- - libcudnn-dev 9.10.2.21 h58dd1b1_0
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - cudnn-jit <0a
- license: LicenseRef-cuDNN-Software-License-Agreement
- run_exports:
- weak:
- - cudnn >=9.10.2.21,<10.0a0
- size: 19646
- timestamp: 1762823905292
-- conda: https://prefix.dev/conda-forge/linux-64/cupy-14.1.1-py311hc89daa0_0.conda
- sha256: ffe8522e38f8898ae890eb61218e2f40933e684cbc2518930772d54cd65cd80a
- md5: cc16c8ff6cb1f50367bd2dbd3926e014
- depends:
- - cuda-cudart-dev_linux-64
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - cupy-core 14.1.1 py311he30c881_0
- - libcublas
- - libcufft
- - libcurand
- - libcusolver
- - libcusparse
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 420713
- timestamp: 1780317312390
-- conda: https://prefix.dev/conda-forge/linux-64/cupy-14.1.1-py314h3d8d815_0.conda
- sha256: a9b23a34430aee57a341d886c4588917a837de669e451298c5c737e0fd731cc1
- md5: 8a141941d33443a7c0e4ba91d14ba174
- depends:
- - cuda-cudart-dev_linux-64
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - cupy-core 14.1.1 py314hf9e62a7_0
- - libcublas
- - libcufft
- - libcurand
- - libcusolver
- - libcusparse
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 421169
- timestamp: 1780317081541
-- conda: https://prefix.dev/conda-forge/linux-64/cupy-core-14.1.1-py311he30c881_0.conda
- sha256: eefa399ca8b709822d323b3bfb200e84b1351cd6b7ce009142282438fa2c12f2
- md5: 56109f073c4ea6f4072da6146e609ea7
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-pathfinder >=1.3.4,<2.0a0
- - libgcc >=14
- - libstdcxx >=14
- - numpy >=1.23,<3
- - numpy >=2.0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - cuda-version >=12,<13.0a0
- - libcusparse >=12,<13.0a0
- - cutensor >=2.6.0.4,<3.0a0
- - libcufft >=11,<12.0a0
- - optuna ~=3.0
- - cupy >=14.1.1,<14.2.0a0
- - scipy >=1.14,<1.17
- - nccl >=2.30.4.1,<3.0a0
- - libcusolver >=11,<12.0a0
- - libcublas >=12,<13.0a0
- - cuda-nvrtc >=12,<13.0a0
- - __cuda >=12.0
- - libcurand >=10,<11.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 61176662
- timestamp: 1780317193557
-- conda: https://prefix.dev/conda-forge/linux-64/cupy-core-14.1.1-py314hf9e62a7_0.conda
- sha256: 5a47312809790eea673c52fb14e4897539279222c4df060752314c2253622e19
- md5: 9238bb6db4ea0951a89eebfd0e8c2624
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-pathfinder >=1.3.4,<2.0a0
- - libgcc >=14
- - libstdcxx >=14
- - numpy >=1.23,<3
- - numpy >=2.0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - cupy >=14.1.1,<14.2.0a0
- - libcusparse >=12,<13.0a0
- - __cuda >=12.0
- - scipy >=1.14,<1.17
- - cutensor >=2.6.0.4,<3.0a0
- - libcusolver >=11,<12.0a0
- - optuna ~=3.0
- - libcufft >=11,<12.0a0
- - cuda-nvrtc >=12,<13.0a0
- - nccl >=2.30.4.1,<3.0a0
- - libcublas >=12,<13.0a0
- - cuda-version >=12,<13.0a0
- - libcurand >=10,<11.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 61221466
- timestamp: 1780317024419
-- conda: https://prefix.dev/conda-forge/linux-64/dprint-0.50.0-hb23c6cf_0.conda
- sha256: 84a7ab17f3d3d50242a28506e599cc06b1ecea8f4f4d5e6e808d6c15d19ba6f7
- md5: aa32af075fd0d097fbb7f42a1886611b
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 6006705
- timestamp: 1747623395464
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - flatbuffers >=25.9.23,<25.9.24.0a0
- size: 1584732
- timestamp: 1761142459651
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - fmt >=12.1.0,<12.2.0a0
- size: 198107
- timestamp: 1767681153946
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - gmp >=6.3.0,<7.0a0
- size: 460055
- timestamp: 1718980856608
-- conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py311h92a432a_1.conda
- sha256: 6e44e97d28019f6e51df28a674bff30868b73e34b3abf0c463801410534092cc
- md5: 7d7764bcd71545948497be8a7103a2ef
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 242098
- timestamp: 1773245101836
-- conda: https://prefix.dev/conda-forge/linux-64/gmpy2-2.3.0-py314h28848ee_1.conda
- sha256: c542d8f0097f9b51175a94246c2d4b40755cc1c156bf893911a44ec94ddf8478
- md5: a99b82fda10aecd4ed853172bf4f6a28
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 254716
- timestamp: 1773245106880
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - icu >=78.3,<79.0a0
- size: 12723451
- timestamp: 1773822285671
-- conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cpu_py311hceffaa2_0.conda
- sha256: a1f7775aaf24099126ca11fef9e9f23e543f49d7a6628b053e5d8443d3b07d2e
- md5: d73ce4a057acfc8aa4ff43e60e135fdb
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - onednn-cpu-threadpool
- - __glibc >=2.17,<3.0.a0
- - libgcc >=15
- - libstdcxx >=15
- - python_abi 3.11.* *_cp311
- - openssl >=3.5.5,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - onednn >=3.11.1,<4.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libgrpc >=1.78.1,<1.79.0a0
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - libre2-11 >=2025.11.5
- - re2
- - numpy >=1.23,<3
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 61180672
- timestamp: 1774451690632
-- conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cpu_py314h3a2952f_0.conda
- sha256: 966f9ed62f2c13fbb84ae86544bd0c8364752418e35c4577627e8af6086b19eb
- md5: 6b950a3589f50b10c0934f4534d0c8b1
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - onednn-cpu-threadpool
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=15
- - libgcc >=15
- - python_abi 3.14.* *_cp314
- - libzlib >=1.3.2,<2.0a0
- - onednn >=3.11.1,<4.0a0
- - openssl >=3.5.5,<4.0a0
- - libgrpc >=1.78.1,<1.79.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - numpy >=1.23,<3
- - libre2-11 >=2025.11.5
- - re2
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 61331938
- timestamp: 1774453141101
-- conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cuda129_py311h6689f8c_200.conda
- sha256: 881517cdcc675e6fe5adb4d940c178963e5562c93cfe62a16e2dbc54eac4223b
- md5: 813269bba2bb6fbfcd1ec20e700dcc77
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - onednn-cpu-threadpool
- - __cuda
- - cuda-nvcc-tools
- - cuda-cupti-dev
- - libcublas-dev
- - libcufft-dev
- - libcurand-dev
- - libcusolver-dev
- - libcusparse-dev
- - libstdcxx >=15
- - libgcc >=15
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<13
- - onednn >=3.11.1,<4.0a0
- - openssl >=3.5.5,<4.0a0
- - cuda-cudart >=12.9.79,<13.0a0
- - libre2-11 >=2025.11.5
- - re2
- - libcublas >=12.9.1.4,<13.0a0
- - libcufft >=11.4.1.4,<12.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - nccl >=2.29.3.1,<3.0a0
- - libzlib >=1.3.2,<2.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- - python_abi 3.11.* *_cp311
- - cudnn >=9.10.2.21,<10.0a0
- - cuda-nvtx >=12.9.79,<13.0a0
- - libcusparse >=12.5.10.65,<13.0a0
- - libgrpc >=1.78.1,<1.79.0a0
- - numpy >=1.23,<3
- - libcurand >=10.3.10.19,<11.0a0
- - libcusolver >=11.7.5.82,<12.0a0
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 196392271
- timestamp: 1774453866825
-- conda: https://prefix.dev/conda-forge/linux-64/jaxlib-0.9.2-cuda129_py314hfcd48a0_200.conda
- sha256: 7ab0ba0bb8d5e13f0358193cf285a47e5f4ab43025b96a6b23c78d3b8f759a44
- md5: 1d2e2ba4116c95c14790f2b2572736ec
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - onednn-cpu-threadpool
- - __cuda
- - cuda-nvcc-tools
- - cuda-cupti-dev
- - libcublas-dev
- - libcufft-dev
- - libcurand-dev
- - libcusolver-dev
- - libcusparse-dev
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<13
- - libstdcxx >=15
- - libgcc >=15
- - numpy >=1.23,<3
- - libcusolver >=11.7.5.82,<12.0a0
- - cuda-nvtx >=12.9.79,<13.0a0
- - libcurand >=10.3.10.19,<11.0a0
- - libcufft >=11.4.1.4,<12.0a0
- - libcusparse >=12.5.10.65,<13.0a0
- - onednn >=3.11.1,<4.0a0
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- - python_abi 3.14.* *_cp314
- - libzlib >=1.3.2,<2.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libcublas >=12.9.1.4,<13.0a0
- - openssl >=3.5.5,<4.0a0
- - nccl >=2.29.3.1,<3.0a0
- - cuda-cudart >=12.9.79,<13.0a0
- - libgrpc >=1.78.1,<1.79.0a0
- - libre2-11 >=2025.11.5
- - re2
- - cudnn >=9.10.2.21,<10.0a0
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 196560911
- timestamp: 1774460446028
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 728002
- timestamp: 1774197446916
-- conda: https://prefix.dev/conda-forge/linux-64/lefthook-2.1.9-hfc2019e_0.conda
- sha256: ffe97c8b3ae18bf2a188175c7a082e732fab710da4ece5912a17190130f9fe28
- md5: 676bfcba66656c0e510b53b929aef54a
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 5509214
- timestamp: 1780061033418
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil =*=cxx17*
- size: 1384817
- timestamp: 1770863194876
-- conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda
- build_number: 8
- sha256: b2da6bfd72a1c9cb143ccf64bf5b28790cb4eb58bd1cb978f6537b2322f7d48b
- md5: 00fc660ab1b2f5ca07e92b4900d10c79
- depends:
- - libopenblas >=0.3.33,<0.3.34.0a0
- - libopenblas >=0.3.33,<1.0a0
- constrains:
- - blas 2.308 openblas
- - mkl <2027
- - libcblas 3.11.0 8*_openblas
- - liblapack 3.11.0 8*_openblas
- - liblapacke 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.11.0,<4.0a0
- size: 18804
- timestamp: 1779859100675
-- conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h5875eb1_mkl.conda
- build_number: 8
- sha256: e30f7fa2a2fb6985f9ac6604575cb318b9ae44e263f6cacc282daee9dbd6127d
- md5: 8ae84a87356b604a62f1aee136ef8efb
- depends:
- - mkl >=2026.0.0,<2027.0a0
- constrains:
- - blas 2.308 mkl
- - libcblas 3.11.0 8*_mkl
- - liblapacke 3.11.0 8*_mkl
- - liblapack 3.11.0 8*_mkl
- track_features:
- - blas_mkl
- - blas_mkl_2
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.11.0,<4.0a0
- size: 19257
- timestamp: 1779859078137
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libbrotlicommon >=1.2.0,<1.3.0a0
- size: 79965
- timestamp: 1764017188531
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libbrotlidec >=1.2.0,<1.3.0a0
- size: 34632
- timestamp: 1764017199083
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libbrotlienc >=1.2.0,<1.3.0a0
- size: 298378
- timestamp: 1764017210931
-- conda: https://prefix.dev/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda
- sha256: cc8c9fc6ddf0fbd3d1275b558ae9abad6cda23bced268732e2da21a87bb358cd
- md5: f9f17eab7f3df1c6fd4b1a548a2f683a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcap >=2.78,<2.79.0a0
- size: 124335
- timestamp: 1775488792584
-- conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda
- build_number: 8
- sha256: 1a2bc77bb26520255904a3d9b1f40e6bf0bf9d8d3405c7709dd162282820915a
- md5: 33a413f1095f8325e5c30fde3b0d2445
- depends:
- - libblas 3.11.0 8_h4a7cf45_openblas
- constrains:
- - blas 2.308 openblas
- - liblapacke 3.11.0 8*_openblas
- - liblapack 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.11.0,<4.0a0
- size: 18778
- timestamp: 1779859107964
-- conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_hfef963f_mkl.conda
- build_number: 8
- sha256: a3ea22126a74321ddf754a0efaf998486ffb8b9ec69fc735b3f0eacb6ffc8a4e
- md5: 2101410a3915785b2c1595d1ae94e32c
- depends:
- - libblas 3.11.0 8_h5875eb1_mkl
- constrains:
- - blas 2.308 mkl
- - liblapacke 3.11.0 8*_mkl
- - liblapack 3.11.0 8*_mkl
- track_features:
- - blas_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.11.0,<4.0a0
- size: 18902
- timestamp: 1779859085492
-- conda: https://prefix.dev/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda
- sha256: 16666002786d59dd7d62ddbeffe08c4118d882c986c6bf72443c7f983c24fb0a
- md5: 55dfb580a84aea59185586a306bf9605
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-nvrtc
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 467672248
- timestamp: 1778771595911
-- conda: https://prefix.dev/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda
- sha256: 3a68ef147c0a7fdd59286e49c4dd1a03be9ea6180b12ee5324ecd555c17419bb
- md5: 7f35376e196eecc81ffe97f63b2b7e3a
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-crt-dev_linux-64
- - cuda-cudart-dev_linux-64
- - cuda-version >=12.9,<12.10.0a0
- - libcublas 12.9.2.10 h676940d_0
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcublas-static >=12.9.2.10
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - libcublas >=12.9.2.10,<13.0a0
- size: 94143
- timestamp: 1778772159259
-- conda: https://prefix.dev/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda
- sha256: dc6b89e874867b2cdf08224059bd1543cbb72ed646da177c1454596469c9a4bb
- md5: a178a1f3642521f104ecceeefa138d01
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - libcublas
- - libgcc >=14
- - libstdcxx >=14
- - libzlib >=1.3.1,<2.0a0
- constrains:
- - libcudnn-jit <0a
- license: LicenseRef-cuDNN-Software-License-Agreement
- run_exports: {}
- size: 526823453
- timestamp: 1762823414388
-- conda: https://prefix.dev/conda-forge/linux-64/libcudnn-dev-9.10.2.21-h58dd1b1_0.conda
- sha256: e9fef18b943a8181427734bc9fada8a594e3a8391fa2a8d59d980acfe1c2cf04
- md5: 7d7a47d067261531c3089dcec326d6fa
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12,<13.0a0
- - libcudnn 9.10.2.21 hf7e9902_0
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcudnn-jit-dev <0a
- license: LicenseRef-cuDNN-Software-License-Agreement
- run_exports:
- weak:
- - libcudnn >=9.10.2.21,<10.0a0
- size: 44188
- timestamp: 1762823889020
-- conda: https://prefix.dev/conda-forge/linux-64/libcudss-0.7.1.4-h58dd1b1_1.conda
- sha256: 6f2b115c72ea3dc28626f0dbc43d9d5a2e1b391fcca5750750e6f0eafbf8f79c
- md5: c5b8ea827c65e5811d61aa49cd0bae9a
- depends:
- - __glibc >=2.28,<3.0.a0
- - _openmp_mutex >=4.5
- - cuda-version >=12,<13.0a0
- - libcublas
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcudss0 <0.0.0a0
- - libcudss-commlayer-nccl 0.7.1.4 h4d09622_1
- - libcudss-commlayer-mpi 0.7.1.4 h09b4041_1
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 59974143
- timestamp: 1770671837721
-- conda: https://prefix.dev/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda
- sha256: 62d4214c182c89cfb02271a42eaac56a41f50bbbea3b0d795a8e33f167a39a4e
- md5: 75ae571353ec92c8f34d4cf6ec6ba264
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 162080769
- timestamp: 1761098842719
-- conda: https://prefix.dev/conda-forge/linux-64/libcufft-dev-11.4.1.4-hecca717_1.conda
- sha256: 1cec99c995b321f4184075194bf0306584092e5ac4bdd39c48a22b56b0ab3cee
- md5: a5da289982801cc89244633a4775f055
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libcufft 11.4.1.4 hecca717_1
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcufft-static >=11.4.1.4
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - libcufft >=11.4.1.4,<12.0a0
- size: 35188
- timestamp: 1761099156569
-- conda: https://prefix.dev/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda
- sha256: 5fa43e8a8d335fc0c3a6aeb2e7b0debc7d8495b8a60a56ac30f23b0e852ab74a
- md5: cab1818eada3952ed09c8dcbb7c26af7
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- - rdma-core >=59.0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 969845
- timestamp: 1761098818759
-- conda: https://prefix.dev/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda
- sha256: 3d40daf956b220cc367a6306ede1e259446fb844051bcfed87c46539cc1aaf03
- md5: 2a91559a9345bedf09af8b7903deb6e6
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 46221876
- timestamp: 1761098855347
-- conda: https://prefix.dev/conda-forge/linux-64/libcurand-dev-10.3.10.19-h676940d_1.conda
- sha256: b506f93e7bea6d0e060f09f4bac6db3f57586084ac309db0d44b3756f5b0bc80
- md5: fc716aaff5af15b80ccbd28b3e67672c
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libcurand 10.3.10.19 h676940d_1
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcurand-static >=10.3.10.19
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - libcurand >=10.3.10.19,<11.0a0
- size: 249874
- timestamp: 1761098955940
-- conda: https://prefix.dev/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda
- sha256: 8691cf6b1585cf6251663029e00485da5a912f6ca0ff7e5c31a6d8d604b29253
- md5: bb6e31a0daa64ede76fe8d3fff01c06f
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libcublas >=12.9.1.4,<12.10.0a0
- - libcusparse >=12.5.10.65,<12.6.0a0
- - libgcc >=14
- - libnvjitlink >=12.9.86,<13.0a0
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 205149446
- timestamp: 1761098826989
-- conda: https://prefix.dev/conda-forge/linux-64/libcusolver-dev-11.7.5.82-h676940d_2.conda
- sha256: f2a974af90ecf6e47c2780741b5351c5f21d20bf6b9fb4448966f07d23ad27b8
- md5: 0fe12e558abf507458bcec839e29778d
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libcusolver 11.7.5.82 h676940d_2
- - libgcc >=14
- - libstdcxx >=14
- constrains:
- - libcusolver-static >=11.7.5.82
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - libcusolver >=11.7.5.82,<12.0a0
- size: 61710
- timestamp: 1761099187356
-- conda: https://prefix.dev/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda
- sha256: 7b511549a22df408d36dadbeabdfd9c35b124d9d6f000b29ffcbe4b38b7faeb7
- md5: 890ebfaad48c887d3d82847ec9d6bc79
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libgcc >=14
- - libnvjitlink >=12.9.86,<13.0a0
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 208846028
- timestamp: 1761069913328
-- conda: https://prefix.dev/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda
- sha256: c6d7ec3ccef6dce988c3acc93198973ec9ff5aa9ffe99e07dd953c2d3b409a3b
- md5: db94469fbd554c107acc3afd0af5d8ec
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<12.10.0a0
- - libcusparse 12.5.10.65 hecca717_2
- - libgcc >=14
- - libnvjitlink >=12.9.86,<13.0a0
- - libstdcxx >=14
- constrains:
- - libcusparse-static >=12.5.10.65
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - libcusparse >=12.5.10.65,<13.0a0
- size: 52779
- timestamp: 1761070300821
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libev >=4.33,<4.34.0a0
- size: 112766
- timestamp: 1702146165126
-- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7
- md5: 93764a5ca80616e9c10106cdaec92f74
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - expat 2.8.1.*
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 77294
- timestamp: 1779278686680
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libffi >=3.5.2,<3.6.0a0
- size: 58592
- timestamp: 1769456073053
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 1041084
- timestamp: 1778269013026
-- conda: https://prefix.dev/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
- run_exports:
- strong:
- - libgcc
- size: 27694
- timestamp: 1778269016987
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 27655
- timestamp: 1778269042954
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 2483673
- timestamp: 1778269025089
-- conda: https://prefix.dev/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
- run_exports:
- strong:
- - _openmp_mutex >=4.5
- size: 603817
- timestamp: 1778268942614
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libgrpc >=1.78.1,<1.79.0a0
- size: 7021360
- timestamp: 1774020290672
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libhwloc >=2.13.0,<2.13.1.0a0
- size: 2436378
- timestamp: 1770953868164
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libiconv >=1.18,<2.0a0
- size: 790176
- timestamp: 1754908768807
-- conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda
- build_number: 8
- sha256: 168e327d737059553e15cc6ec36d76b9bbb3931c2a7721555fd68b4c9348b247
- md5: 809be8ba8712c77bc7d44c2d99390dc4
- depends:
- - libblas 3.11.0 8_h4a7cf45_openblas
- constrains:
- - blas 2.308 openblas
- - libcblas 3.11.0 8*_openblas
- - liblapacke 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.11.0,<3.12.0a0
- size: 18790
- timestamp: 1779859115086
-- conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h5e43f62_mkl.conda
- build_number: 8
- sha256: 0cb26d433dfa15a392eaeeb8a96ac468f4d007d7e7e37ef7bf46856aaf9a9785
- md5: 370e81464714060008e60ee53825bb3e
- depends:
- - libblas 3.11.0 8_h5875eb1_mkl
- constrains:
- - blas 2.308 mkl
- - libcblas 3.11.0 8*_mkl
- - liblapacke 3.11.0 8*_mkl
- track_features:
- - blas_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.11.0,<3.12.0a0
- size: 18921
- timestamp: 1779859092867
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - liblzma >=5.8.3,<6.0a0
- size: 113478
- timestamp: 1775825492909
-- conda: https://prefix.dev/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda
- sha256: e324b70b74495c00f582dc89cda6676963b4685ffefca0facfd6e3e8635f8258
- md5: 21cfdc5459decaca16af5e00aa6addb1
- depends:
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex >=4.5
- - cuda-cudart
- - cuda-version >=12,<13.0a0
- - libblas >=3.9.0,<4.0a0
- - libcublas
- - libcusparse
- - libgcc >=14
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx >=14
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 545950720
- timestamp: 1773083369944
-- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843
- md5: 2c21e66f50753a083cbe6b80f38268fa
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 92400
- timestamp: 1769482286018
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libnghttp2 >=1.68.1,<2.0a0
- size: 663344
- timestamp: 1773854035739
-- conda: https://prefix.dev/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda
- sha256: ba7c5d294e3d80f08ac5a39564217702d1a752e352e486210faff794ac5001b4
- md5: db63358239cbe1ff86242406d440e44a
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=13
- license: LGPL-2.1-or-later
- license_family: LGPL
- run_exports:
- weak:
- - libnl >=3.11.0,<4.0a0
- size: 741323
- timestamp: 1731846827427
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libnsl >=2.0.1,<2.1.0a0
- size: 33731
- timestamp: 1750274110928
-- conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda
- sha256: 3b1c851f4fc42d347ce1c1606bdd195343a47f121e0fceb7a1f1e5aa1d497da9
- md5: 3461b0f2d5cbb7973d361f9e85241d98
- depends:
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12,<12.10.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 30515495
- timestamp: 1760723776293
-- conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda
- sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903
- md5: 2d3278b721e40468295ca755c3b84070
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- constrains:
- - openblas >=0.3.33,<0.3.34.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libopenblas >=0.3.33,<1.0a0
- size: 5931919
- timestamp: 1776993658641
-- conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda
- sha256: a59aa3f076d5710c618ca8fd12d9cd8211d8b738f6b0e0c98517c0162f23a5de
- md5: 7a4b11f3dd7374f1991a4088390d07c1
- depends:
- - __glibc >=2.17,<3.0.a0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libgcc >=14
- - libstdcxx >=14
- - libzlib >=1.3.2,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libprotobuf >=6.33.5,<6.33.6.0a0
- size: 3675765
- timestamp: 1780003831209
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- size: 213122
- timestamp: 1768190028309
-- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- sha256: 1ab603b6ec93933e76027e1f23b21b22b858ba1b56f1e1695ef6fe5e80cb7358
- md5: 062b0ac602fb0adf250e3dfa86f221c4
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libzlib >=1.3.2,<2.0a0
- license: blessing
- run_exports:
- weak:
- - libsqlite >=3.53.2,<4.0a0
- size: 957849
- timestamp: 1780574429573
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 5852044
- timestamp: 1778269036376
-- conda: https://prefix.dev/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
- run_exports:
- strong:
- - libstdcxx
- size: 27776
- timestamp: 1778269074600
-- conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda
- sha256: 2293884d59cf0436c37fc0a4bad71011a8de2a6913610d1c701a7703377c1f75
- md5: ea0da9c20bbb221b530810c3c68bbe62
- depends:
- - __glibc >=2.17,<3.0.a0
- - libcap >=2.78,<2.79.0a0
- - libgcc >=14
- license: LGPL-2.1-or-later
- run_exports: {}
- size: 493022
- timestamp: 1780084748140
-- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cpu_mkl_h55d9b97_101.conda
- sha256: 7398ec4bef471c7514810feeaa82518ae1ad08a099fdaa086ef9dd1d12904989
- md5: d9da6e77d9d6293715776d77a6001f37
- 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.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- constrains:
- - pytorch 2.11.0 cpu_mkl_*_101
- - pytorch-gpu <0.0a0
- - pytorch-cpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 61855001
- timestamp: 1781056155936
-- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.11.0-cuda129_mkl_hda1b8b5_300.conda
- sha256: 5a80b340a439f01c296176bdcfbcb8366bdce3b31830cb571c22bb9068f45fb7
- md5: bed067d920d0ca1f0bdee6187f883b61
- depends:
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex * *_llvm
- - _openmp_mutex >=4.5
- - cuda-cudart >=12.9.79,<13.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- - cuda-nvrtc >=12.9.86,<13.0a0
- - cuda-nvtx >=12.9.79,<13.0a0
- - cuda-version >=12.9,<13
- - fmt >=12.1.0,<12.2.0a0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.11.0,<4.0a0
- - libcublas >=12.9.2.10,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.4.1.4,<12.0a0
- - libcufile >=1.14.1.1,<2.0a0
- - libcurand >=10.3.10.19,<11.0a0
- - libcusolver >=11.7.5.82,<12.0a0
- - libcusparse >=12.5.10.65,<13.0a0
- - libgcc >=14
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libstdcxx >=14
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - nccl >=2.28.9.1,<3.0a0
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- constrains:
- - pytorch-cpu <0.0a0
- - pytorch-gpu 2.11.0
- - pytorch 2.11.0 cuda129_mkl_*_300
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 800519058
- timestamp: 1780542472876
-- conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda
- sha256: 287d05680e49eea51b8145fbf34bc213c0618b04f32e450e9da5d715e5134e38
- md5: 89e5671a076d99516a6acd72a35b1640
- depends:
- - __glibc >=2.17,<3.0.a0
- - libcap >=2.78,<2.79.0a0
- - libgcc >=14
- license: LGPL-2.1-or-later
- run_exports: {}
- size: 145969
- timestamp: 1780084753104
-- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231
- md5: 7d0a66598195ef00b6efc55aefc7453b
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libuuid >=2.42.1,<3.0a0
- size: 40163
- timestamp: 1779118517630
-- conda: https://prefix.dev/conda-forge/linux-64/libuv-1.52.1-h280c20c_0.conda
- sha256: e28e4519223f78b3163599ca89c3f2d80bfb53e907e7fc74e806e60d1efa578b
- md5: 4e33d49bf4fc853855a3b00643aa5484
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libuv >=1.52.1,<2.0a0
- size: 419935
- timestamp: 1779396012261
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libxcrypt >=4.4.36
- size: 100393
- timestamp: 1702724383534
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 559775
- timestamp: 1776376739004
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libxml2
- - libxml2-16 >=2.15.3
- size: 46810
- timestamp: 1776376751152
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libzlib >=1.3.2,<2.0a0
- size: 63629
- timestamp: 1774072609062
-- conda: https://prefix.dev/conda-forge/linux-64/llvm-openmp-22.1.7-h4922eb0_0.conda
- sha256: 41941a6edc8358ec41617252cfec6b9e560cdfdf6d5a5c7d3c2562f43a3b66cb
- md5: 362702bd1f3c1b06ba5908ff18ef6d8c
- depends:
- - __glibc >=2.17,<3.0.a0
- constrains:
- - openmp 22.1.7|22.1.7.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- run_exports:
- strong:
- - llvm-openmp >=22.1.7
- - _openmp_mutex >=4.5
- - _openmp_mutex * *_llvm
- size: 6119827
- timestamp: 1780455599472
-- conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py311h41a00d4_1.conda
- sha256: 689cc23dc0f80c008094931aaa54ec229dd9dbabd169e825e13ea262d5e6dade
- md5: 62d9d69ab00067a2b3cdf60407f4c491
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - libzlib >=1.3.2,<2.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 34108807
- timestamp: 1776076742653
-- conda: https://prefix.dev/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda
- sha256: e77292afb920e8b46f75c98a370d79aa4a922ff1ebed38c54381ad5d613c834e
- md5: 22feb934c64b2d62b3b2b278eb40629e
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - libzlib >=1.3.2,<2.0a0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 34134565
- timestamp: 1776076748673
-- conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda
- sha256: 710e207b2e91308a34bcfe547c60ad86c1fa294827266ba18548c1fe1a9d8333
- md5: f9efdf9b0f3d0cc309d56af6edf2a6b0
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 26756
- timestamp: 1772445078834
-- conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda
- sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf
- md5: 9a17c4307d23318476d7fbf0fedc0cde
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 27424
- timestamp: 1772445227915
-- conda: https://prefix.dev/conda-forge/linux-64/mkl-2026.0.0-hecca717_915.conda
- sha256: 740a02cf7b3c0d6dd47dbb4d2e222ed23d326971fe608d737614db1033bd107d
- md5: 09feb8740f611ceb96f8b598bf08cdba
- depends:
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex * *_llvm
- - _openmp_mutex >=4.5
- - libgcc >=14
- - libstdcxx >=14
- - llvm-openmp >=22.1.7
- - onemkl-license 2026.0.0 ha770c72_915
- - tbb >=2023.0.0
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- run_exports: {}
- size: 143201396
- timestamp: 1781016571972
-- conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py311h912ec1f_1.conda
- sha256: 0b9b24d1d6da203729d75c74c531a632e965d0a5a973da964b666637948f5a0b
- md5: 81be6dcbed9f37c8afb78c2e24de3fe4
- depends:
- - python
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - numpy >=1.23,<3
- - python_abi 3.11.* *_cp311
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 345364
- timestamp: 1771362487210
-- conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.4-np2py314h6477eea_1.conda
- sha256: bf58f5b2d89958e8880cfde4e5e3d86f230485c5f5f1043fc47a56656f9655c6
- md5: af93de29d470abbe21a6adc2ec58516e
- depends:
- - python
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=14
- - libgcc >=14
- - python_abi 3.14.* *_cp314
- - numpy >=1.23,<3
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 345273
- timestamp: 1771362516002
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - mpc >=1.4.0,<2.0a0
- size: 100245
- timestamp: 1774472435333
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - mpfr >=4.2.2,<5.0a0
- size: 730422
- timestamp: 1773413915171
-- conda: https://prefix.dev/conda-forge/linux-64/mypy-2.1.0-py314h518bba1_0.conda
- sha256: 9fcf9e7343c30fdeab75e8440caa2814798eeff22a6dc5f7a556df8372e1b0ca
- md5: 5625fce7423d7579e60f9cbcc5738d2b
- depends:
- - ast-serialize >=0.3.0,<1.0.0
- - mypy_extensions >=1.0.0
- - pathspec >=1.0.0
- - python
- - python-librt >=0.11.0
- - typing_extensions >=4.6.0
- - psutil >=4.0
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 22860519
- timestamp: 1780315602311
-- conda: https://prefix.dev/conda-forge/linux-64/nccl-2.30.4.1-h4d09622_0.conda
- sha256: cda7e6c516e0af5d99721f152860c8793a709ba5c2c2cb209886b17d5f86e663
- md5: 5f6cad41cf88e7938996445f694d76c6
- depends:
- - __glibc >=2.28,<3.0.a0
- - cuda-version >=12,<13.0a0
- - libgcc >=14
- - libstdcxx >=14
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - nccl >=2.30.4.1,<3.0a0
- size: 299472349
- timestamp: 1777582121878
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - ncurses >=6.6,<7.0a0
- size: 918956
- timestamp: 1777422145199
-- conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- sha256: 6f7d59dbec0a7b00bf5d103a4306e8886678b796ff2151b62452d4582b2a53fb
- md5: b518e9e92493721281a60fa975bddc65
- depends:
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 186323
- timestamp: 1763688260928
-- conda: https://prefix.dev/conda-forge/linux-64/nodejs-26.3.0-he4ff34a_0.conda
- sha256: 74196be176ee25ec65a147944b18b52c02cd42fe3d1322d3d5534b684c4a2d9b
- md5: d77e48ccf1a21839da1a1208c93c998e
- depends:
- - __glibc >=2.28,<3.0.a0
- - libstdcxx >=14
- - libgcc >=14
- - openssl >=3.5.6,<4.0a0
- - libsqlite >=3.53.1,<4.0a0
- - c-ares >=1.34.6,<2.0a0
- - libbrotlicommon >=1.2.0,<1.3.0a0
- - libbrotlienc >=1.2.0,<1.3.0a0
- - libbrotlidec >=1.2.0,<1.3.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libzlib >=1.3.2,<2.0a0
- - libnghttp2 >=1.68.1,<2.0a0
- - libuv >=1.52.1,<2.0a0
- - icu >=78.3,<79.0a0
- - zstd >=1.5.7,<1.6.0a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - nodejs >=26.3.0,<27.0a0
- size: 19766298
- timestamp: 1780382988934
-- conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py311h3c884d5_1.conda
- sha256: 5f6eacaba962cadba6da07756138492291c837cc83ac4d6d51224db6ac596953
- md5: 89bb99267eee107ffb38f37fba4c973f
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - tbb >=2021.6.0
- - cuda-version >=11.2
- - cuda-python >=11.6
- - scipy >=1.0
- - libopenblas !=0.3.6
- - cudatoolkit >=11.2
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5866836
- timestamp: 1778390477250
-- conda: https://prefix.dev/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda
- sha256: 750f8893a16721394969c030e7778212b99c54aab137a9744cafdb70a6fd513d
- md5: d74691e038386bb543a574122c72d834
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - scipy >=1.0
- - tbb >=2021.6.0
- - cudatoolkit >=11.2
- - libopenblas !=0.3.6
- - cuda-python >=11.6
- - cuda-version >=11.2
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5793221
- timestamp: 1778390483212
-- conda: https://prefix.dev/conda-forge/linux-64/numpy-1.24.1-py311h8e6699e_0.conda
- sha256: fd2dd9e14a2d6758883bc6732009d8ba8651fba5480ccac47244a17a019c0069
- md5: bd7c9bf413aa9478ea5f68123e796ab1
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc-ng >=12
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx-ng >=12
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.24.1,<2.0a0
- size: 7826922
- timestamp: 1675039288489
-- conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.2-py313hfc84e54_1.conda
- sha256: 87a6ea295ccdc3afcfe53d32e8a5e4987896bf57620667eb9c652167dee0eda6
- md5: b46a2eaa90bfee7e7a899d4d81d7e67e
- depends:
- - python
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - liblapack >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - python_abi 3.13.* *_cp313t
- - libblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 8900253
- timestamp: 1770098515277
-- conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda
- sha256: 8e8fb64c1a51282e8940d57d116aec54a4d66da59594973ae9c0b35d419b9a81
- md5: 5d4e35d7097b88c8b1455ef9f6ddf511
- depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=14
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.11.* *_cp311
- - liblapack >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 9389525
- timestamp: 1779169198155
-- conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda
- sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47
- md5: f49b5f950379e0b97c35ca97682f7c6a
- depends:
- - python
- - libstdcxx >=14
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - liblapack >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 8928909
- timestamp: 1779169198391
-- conda: https://prefix.dev/conda-forge/linux-64/onednn-3.12-threadpool_h77e0eb8_0.conda
- sha256: 5ea89f2055bbf5749ed9caf357e92c5d7470d9a8ffb46414411e49e9127ee04e
- md5: bafa179fb027220b8bb08b8885aae452
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=14
- track_features:
- - onednn-p-0
- license: Apache-2.0
- license_family: APACHE
- run_exports:
- weak:
- - onednn >=3.12,<4.0a0
- size: 12995502
- timestamp: 1779565991731
-- conda: https://prefix.dev/conda-forge/linux-64/onednn-cpu-threadpool-3.12-threadpool_hc2f90bd_0.conda
- sha256: 3fd55525a5449553618eab86703be7156b1cb4993756aee38ae323ff0b57d253
- md5: 195c5b9d47c485a21085597d753bf55a
- depends:
- - onednn ==3.12 threadpool_h77e0eb8_0
- - onednn >=3.12,<4.0a0
- track_features:
- - onednn-cpu-threadpool-p-0
- license: Apache-2.0
- license_family: APACHE
- run_exports:
- weak:
- - onednn >=3.12,<4.0a0
- size: 10826
- timestamp: 1779565991731
-- conda: https://prefix.dev/conda-forge/linux-64/onemkl-license-2026.0.0-ha770c72_915.conda
- sha256: 80008386bb19f8dffc8873d6c1c16f22bb63f19c960d774b647b9a01e99ad624
- md5: 0f40953c960dc51ed18611a48f4b22a0
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- run_exports: {}
- size: 39966
- timestamp: 1781016460562
-- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b
- md5: 79dd2074b5cd5c5c6b2930514a11e22d
- depends:
- - __glibc >=2.17,<3.0.a0
- - ca-certificates
- - libgcc >=14
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - openssl >=3.6.3,<4.0a0
- size: 3159683
- timestamp: 1781069855778
-- conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py311hdf67eae_0.conda
- sha256: 35dac95d20a7f63f2a613a4830cd0f7e7d1ff323d3101db686eef6cdc2ddf5d9
- md5: c81c6109e593265c80d6b18ff4ba5150
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - typing-extensions >=4.6
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 487687
- timestamp: 1778047683874
-- conda: https://prefix.dev/conda-forge/linux-64/optree-0.19.1-py314h9891dd4_0.conda
- sha256: 0bc01fdc2dccad1a38f680249414c0f6a006ce3bd3c3043bde89711ec7b3d074
- md5: 44ffc8b345a7844a847d4fdf469d64ea
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libstdcxx >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - typing-extensions >=4.12
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 513161
- timestamp: 1778047690925
-- conda: https://prefix.dev/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda
- sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5
- md5: 4f225a966cfee267a79c5cb6382bd121
- depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 231303
- timestamp: 1769678156552
-- conda: https://prefix.dev/conda-forge/linux-64/pyrefly-1.0.0-h2b88eb6_0.conda
- sha256: 225d491c94a6962b92377154b33b424cb0cc30aa2fe0b433c6c110d05da7283d
- md5: 132a1bc9d31e17d6e12d7188ca7ddfb8
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 10962615
- timestamp: 1778629320799
-- conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda
- sha256: bf6a32c69889d38482436a786bea32276756cedf0e9805cc856ffd088e8d00f0
- md5: a5ebcefec0c12a333bcd6d7bf3bddc1f
- 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.11.* *_cp311
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.11.* *_cp311
- noarch:
- - python
- size: 30949404
- timestamp: 1772730362552
-- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.13-h0c81058_0_cp313t.conda
- sha256: cf905c5a184292ba0b3b0ca0cd5e02d0c5179f387b3b5edca2e1fc6cf8668cbc
- md5: 3c2114eec1a6e271045137e48ed29557
- depends:
- - __glibc >=2.17,<3.0.a0
- - bzip2 >=1.0.8,<2.0a0
- - ld_impl_linux-64 >=2.36.1
- - libexpat >=2.7.5,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - libgcc >=14
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.52.0,<4.0a0
- - libuuid >=2.42,<3.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.5,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.13.* *_cp313t
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- track_features:
- - py_freethreading
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.13.* *_cp313t
- noarch:
- - python
- size: 45857922
- timestamp: 1775614898991
- python_site_packages_path: lib/python3.13t/site-packages
-- conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- build_number: 100
- sha256: 55eed9bf2a3f6e90311276f0834737fe7c2d9ec3e5e2e557507858df4c7521e6
- md5: da92e59ff92f2d5ede4f612af20f583f
- depends:
- - __glibc >=2.17,<3.0.a0
- - bzip2 >=1.0.8,<2.0a0
- - ld_impl_linux-64 >=2.36.1
- - libexpat >=2.8.0,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - libgcc >=14
- - liblzma >=5.8.3,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libuuid >=2.42.1,<3.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.6,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.14.* *_cp314
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.14.* *_cp314
- noarch:
- - python
- size: 36745188
- timestamp: 1779236923603
- python_site_packages_path: lib/python3.14/site-packages
-- conda: https://prefix.dev/conda-forge/linux-64/python-librt-0.11.0-py314h0f05182_0.conda
- sha256: 4529fdc71dcaa13ad25c4708751029c56f507f7d26f1748f20875cea85a158fa
- md5: 1c6a332e01cd8f81f350434fbf7bcaad
- depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 156252
- timestamp: 1778511622812
-- conda: https://prefix.dev/conda-forge/linux-64/pytokens-0.4.1-py314h0f05182_2.conda
- sha256: 17cd445cbdf0a33a247934497c867195edc2bf51faad8011c74332460d47634b
- md5: 711ddd4f498e10b56f687683ae76e059
- depends:
- - python
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 291078
- timestamp: 1778688806850
-- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cpu_mkl_py311_h338015a_101.conda
- sha256: a49b251b9e7d704c2283796fee381dff4fba0b89e3df10b3781e112ab88a799b
- md5: 68fe5a34355fde8b60a9ae3ef658e672
- 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.11.0 cpu_mkl_h55d9b97_101
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-gpu <0.0a0
- - pytorch-cpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 25212845
- timestamp: 1781056746113
-- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cpu_mkl_py314_h94e416f_101.conda
- sha256: 9fd632d4974f460e2700f997fa051f2ce9b129c21102482cb0fd0bfcc1964210
- md5: b907e3947e888a584d088a3750876ef5
- 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.11.0 cpu_mkl_h55d9b97_101
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-gpu <0.0a0
- - pytorch-cpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 26111099
- timestamp: 1781057537372
-- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cuda129_mkl_py311_h6b7d41d_300.conda
- sha256: 2758cb1313250b70b520d24f286a441fd1beca32e73e844416d5735f632f6f9d
- md5: 857b8f3da5ab9cc71fe9565d50dd94e5
- depends:
- - __cuda
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex * *_llvm
- - _openmp_mutex >=4.5
- - cuda-cudart >=12.9.79,<13.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- - cuda-nvrtc >=12.9.86,<13.0a0
- - cuda-nvtx >=12.9.79,<13.0a0
- - cuda-version >=12.9,<13
- - 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
- - libcublas >=12.9.2.10,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.4.1.4,<12.0a0
- - libcufile >=1.14.1.1,<2.0a0
- - libcurand >=10.3.10.19,<11.0a0
- - libcusolver >=11.7.5.82,<12.0a0
- - libcusparse >=12.5.10.65,<13.0a0
- - libgcc >=14
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libstdcxx >=14
- - libtorch 2.11.0 cuda129_mkl_hda1b8b5_300
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - nccl >=2.28.9.1,<3.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - triton 3.6.0
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-cpu <0.0a0
- - pytorch-gpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 25445356
- timestamp: 1780545105739
-- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.11.0-cuda129_mkl_py314_hfa65069_300.conda
- sha256: 88c7fc872be4e74a25944bd85c37ee506162106905939f1f0c15146506222796
- md5: 77edf022d71d137969145e972251fb24
- depends:
- - __cuda
- - __glibc >=2.17,<3.0.a0
- - _openmp_mutex * *_llvm
- - _openmp_mutex >=4.5
- - cuda-cudart >=12.9.79,<13.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- - cuda-nvrtc >=12.9.86,<13.0a0
- - cuda-nvtx >=12.9.79,<13.0a0
- - cuda-version >=12.9,<13
- - 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
- - libcublas >=12.9.2.10,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.4.1.4,<12.0a0
- - libcufile >=1.14.1.1,<2.0a0
- - libcurand >=10.3.10.19,<11.0a0
- - libcusolver >=11.7.5.82,<12.0a0
- - libcusparse >=12.5.10.65,<13.0a0
- - libgcc >=14
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libstdcxx >=14
- - libtorch 2.11.0 cuda129_mkl_hda1b8b5_300
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - nccl >=2.28.9.1,<3.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - triton 3.6.0
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-cpu <0.0a0
- - pytorch-gpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 26331894
- timestamp: 1780545624079
-- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda
- sha256: c9a6cd2c290d7c3d2b30ea34a0ccda30f770e8ddb2937871f2c404faf60d0050
- md5: a24add9a3bababee946f3bc1c829acfe
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 206190
- timestamp: 1770223702917
-- conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda
- sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d
- md5: 2035f68f96be30dc60a5dfd7452c7941
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 202391
- timestamp: 1770223462836
-- conda: https://prefix.dev/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda
- sha256: f0931894c751b22be09d7c976343a2957a14a59cfe0db04d916d1b93bd66ffcf
- md5: da47d3251c0f0d16b2801afe5a77b532
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- - libnl >=3.11.0,<4.0a0
- - libstdcxx >=14
- - libsystemd0 >=257.13
- - libudev1 >=257.13
- license: Linux-OpenIB
- license_family: BSD
- run_exports:
- weak:
- - rdma-core >=63.0
- size: 1281605
- timestamp: 1778528449130
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- - re2
- size: 27469
- timestamp: 1768190052132
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - readline >=8.3,<9.0a0
- size: 345073
- timestamp: 1765813471974
-- conda: https://prefix.dev/conda-forge/linux-64/ruff-0.15.16-h6a952e8_0.conda
- noarch: python
- sha256: 8b0f50a439826eedfcd2741985aa55d8af7d281a4cebde7a8c2ceda6bbeb1bc4
- md5: 8d5840b229d9e957ac2af3c3b4e0eadc
- depends:
- - python
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 9192459
- timestamp: 1780611849620
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda
- sha256: 6d0902775e3ff96dd1d36ac627e03fe6c0b3d2159bb71e115dd16a1f31693b25
- md5: 5ec0a1732a05376241e1e4c6d50e0e91
- depends:
- - __glibc >=2.17,<3.0.a0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc >=13
- - libgfortran
- - libgfortran5 >=13.3.0
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx >=13
- - numpy <2.5
- - numpy >=1.19,<3
- - numpy >=1.23.5
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 17193126
- timestamp: 1739791897768
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.16.3-py311hbe70eeb_2.conda
- sha256: a13084f1556674ea74de2ecbe50333d938dab8ef27f536408592ba312363c400
- md5: 1f9587850322d7d77ea14d4fee3d16d8
- depends:
- - __glibc >=2.17,<3.0.a0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx >=14
- - numpy <2.6
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 17026343
- timestamp: 1766108701646
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda
- sha256: 652f9a235051c1d39ccd2fe7e9326792b046a1d93de42171977fa1ba9668a0e8
- md5: ee95e8bb52e35c3267a53d3ee1347cc4
- depends:
- - __glibc >=2.17,<3.0.a0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc >=14
- - libgfortran
- - libgfortran5 >=14.3.0
- - liblapack >=3.9.0,<4.0a0
- - libstdcxx >=14
- - numpy <2.6
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 16982488
- timestamp: 1766108668132
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda
- sha256: 3ae2ff1d1cc5930de2ca6ac03216118bdf13b2af6098e28e827f1ba25bfcbc4e
- md5: 089de2ee37e4e19885c985a4fe4aaf14
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 17303931
- timestamp: 1779874783665
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py313h0dc34c3_0.conda
- sha256: 7933e9846630b6e5a720c607d0a5ed2154d5e15a21077240f1378d7fa4b5b7eb
- md5: eb1b9c20267655bf049fb09c155c4d20
- 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.13,<3.14.0a0
- - python_abi 3.13.* *_cp313t
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 17175042
- timestamp: 1771880794357
-- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda
- sha256: 505e3466e97c16d125a9adb61a80bdfc2fefe62bc9f0bfe798eda88706e4b0ed
- md5: 718437171257e579e7d1f3b51c62536f
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 16995364
- timestamp: 1779874760991
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - sleef >=3.9.0,<4.0a0
- size: 1951720
- timestamp: 1756274576844
-- conda: https://prefix.dev/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
- license_family: APACHE
- run_exports: {}
- size: 182331
- timestamp: 1778673758649
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - tk >=8.6.13,<8.7.0a0
- size: 3301196
- timestamp: 1769460227866
-- conda: https://prefix.dev/conda-forge/linux-64/triton-3.6.0-cuda129py311h2e1fb5d_2.conda
- sha256: 6c4a2c17007c32d98f93cd96d97996b70853548bcbee899c01b1ca97a96cf8f8
- md5: c70d9f57d9b0d87ae16aae538d768f7a
- depends:
- - python
- - setuptools
- - cuda-nvcc-tools
- - cuda-cuobjdump
- - cuda-cudart
- - cuda-cupti
- - cuda-version >=12.9,<13
- - __glibc >=2.17,<3.0.a0
- - libstdcxx >=14
- - libgcc >=14
- - zstd >=1.5.7,<1.6.0a0
- - python_abi 3.11.* *_cp311
- - libzlib >=1.3.2,<2.0a0
- - cuda-cupti >=12.9.79,<13.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 236155474
- timestamp: 1779452390686
-- conda: https://prefix.dev/conda-forge/linux-64/triton-3.6.0-cuda129py314h2b49ec1_2.conda
- sha256: da5243c7f03e5dd5162f5434bbaa0b4a59f29f28dd0eaeb73cdc84d963ad4f6a
- md5: ec39e29cc9ed8706e5eabce88a271d9c
- depends:
- - python
- - setuptools
- - cuda-nvcc-tools
- - cuda-cuobjdump
- - cuda-cudart
- - cuda-cupti
- - __glibc >=2.17,<3.0.a0
- - cuda-version >=12.9,<13
- - libstdcxx >=14
- - libgcc >=14
- - zstd >=1.5.7,<1.6.0a0
- - libzlib >=1.3.2,<2.0a0
- - python_abi 3.14.* *_cp314
- - cuda-cupti >=12.9.79,<13.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 236063811
- timestamp: 1779452383937
-- conda: https://prefix.dev/conda-forge/linux-64/typos-1.47.2-hb17b654_0.conda
- sha256: 7233fc37d9026c5f568aa860e2b9dc978f50b5061b402aad7f05de08c8336c12
- md5: 02f4ab7bf6ac3749482c2916f5d23f34
- depends:
- - __glibc >=2.17,<3.0.a0
- - libgcc >=14
- constrains:
- - __glibc >=2.17
- license: MIT OR Apache-2.0
- run_exports: {}
- size: 3360112
- timestamp: 1780547308581
-- conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- sha256: 29bbedc6b59436d89ac91f6b0fafc73de1ef4c31b77063590c6ced61b3ce0e58
- md5: 1109c2afdae2f3d06b40ab73f82d9b6f
- depends:
- - libgcc >=14
- - libstdcxx >=14
- - __glibc >=2.17,<3.0.a0
- constrains:
- - __glibc >=2.17
- license: Apache-2.0 OR MIT
- run_exports: {}
- size: 19491066
- timestamp: 1780539158388
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - yaml >=0.2.5,<0.3.0a0
- size: 85189
- timestamp: 1753484064210
-- conda: https://prefix.dev/conda-forge/linux-64/zizmor-1.25.2-hb17b654_0.conda
- sha256: 4886a9d6b6110d76cb986845a14fec92af8ae1447483f2c08a3e7e24180a0f86
- md5: acd23eff438bd24feaa41b4cc95ffd1e
- depends:
- - libgcc >=14
- - __glibc >=2.17,<3.0.a0
- constrains:
- - __glibc >=2.17
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 7009161
- timestamp: 1778922170103
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - zstd >=1.5.7,<1.6.0a0
- size: 601375
- timestamp: 1764777111296
-- conda: https://prefix.dev/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda
- sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661
- md5: aaa2a381ccc56eac91d63b6c1240312f
- depends:
- - cpython
- - python-gil
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 8191
- timestamp: 1744137672556
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 1326096
- timestamp: 1734956217254
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 18684
- timestamp: 1733750512696
-- conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda
- sha256: 328865729d20c18ad2bb2472ae88dbe04e20291b4e36d9fab89d10b5a2badf35
- md5: c316aba22bb6b6f1e1cacc609c007973
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 62003
- timestamp: 1780923775972
-- conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.5-pyhcf101f3_0.conda
- sha256: 2134909f7a04ddb046018625931d2f38fb8d824b54cf02aa5eaf3a147c766cf0
- md5: e65c7d49168ef8014ad0563ea0d94ff1
- depends:
- - python >=3.10
- - numpy
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 63403
- timestamp: 1771867402299
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 28797
- timestamp: 1763410017955
-- conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda
- sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab
- md5: c6b0543676ecb1fb2d7643941fe375f2
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 64927
- timestamp: 1773935801332
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 7684321
- timestamp: 1772555330347
-- conda: https://prefix.dev/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda
- noarch: generic
- sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe
- md5: 1133126d840e75287d83947be3fc3e71
- depends:
- - python >=3.14
- license: BSD-3-Clause AND MIT AND EPL-2.0
- run_exports: {}
- size: 7533
- timestamp: 1778594057496
-- conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.39.7-pyhcf101f3_0.conda
- sha256: 6b2c59ab836033d3ff6b45f17a2827cf6f437e4126a518ff09f9f52bd8611caa
- md5: d3c34ab663f07000bcbfe82aafebf717
- depends:
- - python >=3.10
- - nodejs >=20
- - nodejs-wheel >=20.13.1
- - python
- license: MIT AND Apache-2.0
- run_exports: {}
- size: 9395247
- timestamp: 1780840598727
-- conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda
- sha256: aed4b9dcf68ec2a75e5645fed14d77fd884d38d2e52bfa6ef4b278d90cd88781
- md5: 3b261da3fe9b4168738712832410b022
- depends:
- - python >=3.10
- - soupsieve >=1.2
- - typing-extensions
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 92704
- timestamp: 1780853175566
-- conda: https://prefix.dev/conda-forge/noarch/black-26.5.1-pyh866005b_0.conda
- sha256: f194e91242b26a7fd2244bf0ab0acb59c3f20ecbfe81d095d753e9183defbfb7
- md5: 651a8c2065be6883e86ec0e8471ed5ce
- 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
- run_exports: {}
- size: 176838
- timestamp: 1779460936776
-- conda: https://prefix.dev/conda-forge/noarch/blacken-docs-1.20.0-pyhd8ed1ab_0.conda
- sha256: e1fea6544f8783bbf1dbe2735cc138f54b70bd325d4f54a8213f8a6cf3613ce3
- md5: dc0bd62e2ec90f958d12476cc65482fb
- depends:
- - black >=22.1
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 14477
- timestamp: 1757367329732
-- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- sha256: 86981d764e4ea1883409d30447ff9da46127426d31a63df08315aaded768e652
- md5: c9b86eece2f944541b86441c94117ab3
- depends:
- - __win
- license: ISC
- run_exports: {}
- size: 130182
- timestamp: 1779289939595
-- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b
- md5: 489b8e97e666c93f68fdb35c3c9b957f
- depends:
- - __unix
- license: ISC
- run_exports: {}
- size: 129868
- timestamp: 1779289852439
-- conda: https://prefix.dev/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda
- sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490
- md5: 9fefff2f745ea1cc2ef15211a20c054a
- depends:
- - python >=3.10
- license: ISC
- run_exports: {}
- size: 134201
- timestamp: 1779285131141
-- conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda
- sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457
- md5: a9167b9571f3baa9d448faa2139d1089
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 58872
- timestamp: 1775127203018
-- conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda
- sha256: 5b8e8d8876ace41735f51ca43c43cdc9e1b4fbbae0f415d6b8441fec826d8c47
- md5: f73f35eedcd8e89d6c4407df15101233
- depends:
- - __win
- - colorama
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 104080
- timestamp: 1779900586237
-- conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda
- sha256: c253a41cdf898b651a0786cbb76c6d5fc101d0dbbe719f93a124bc4fde5cdd6a
- md5: 554304a07e581a85891b15e39ea9f268
- depends:
- - __unix
- - python
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 104999
- timestamp: 1779900548735
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 27353
- timestamp: 1765303462831
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 27011
- timestamp: 1733218222191
-- conda: https://prefix.dev/conda-forge/noarch/coverage-7.14.1-pyh7db6752_0.conda
- sha256: cab663d2ccdc1a795fb04d2a550168f22211ee6544d9eb581862ed97fa606c0f
- md5: f740a050738d48172b3f4c878ae16ba2
- depends:
- - python >=3.10
- - tomli
- track_features:
- - coverage_no_compile
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 167594
- timestamp: 1779837904259
-- conda: https://prefix.dev/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda
- noarch: generic
- sha256: 4811072ccc369c80cb94156fb96fa234db1b90120c0859dc173bea42d49a57b5
- md5: bf0d09d5c2b61aaf7b11c551c8545cfa
- depends:
- - python >=3.11,<3.12.0a0
- - python_abi * *_cp311
- license: Python-2.0
- run_exports: {}
- size: 48036
- timestamp: 1772730257686
-- conda: https://prefix.dev/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_0.conda
- noarch: generic
- sha256: 3ae7a3b70f5812a3341ac3dc99ca374d717e75ff2b2c1d5d2da8dd27736c4fe1
- md5: 6ed98526d41a82be99644908cf8e0bcc
- depends:
- - python >=3.13,<3.14.0a0
- - python_abi * *_cp313t
- license: Python-2.0
- run_exports: {}
- size: 48310
- timestamp: 1775613698855
-- conda: https://prefix.dev/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda
- noarch: generic
- sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b
- md5: a749029ce5d0632a913db19d17f944ab
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi * *_cp314
- license: Python-2.0
- run_exports: {}
- size: 50212
- timestamp: 1779236682725
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda
- sha256: 2ee3b9564ca326226e5cda41d11b251482df8e7c757e333d28ec75213c75d126
- md5: 87ff6381e33b76e5b9b179a2cdd005ec
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 1150650
- timestamp: 1746189825236
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda
- sha256: 681eb1d9afd596e04329a82b04734c0e37c6ecb94b3380f3a378d61983e2a8cc
- md5: 8f897dca7111f3bb4ded97ba6947b186
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 1139649
- timestamp: 1746189858434
-- conda: https://prefix.dev/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda
- sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304
- md5: 79d280de61e18010df5997daea4743df
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 94239
- timestamp: 1753975242354
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5
- md5: 86e40eb67d83f1a58bdafdd44e5a77c6
- depends:
- - cuda-cccl_linux-64
- - cuda-cudart-static_linux-64
- - cuda-cudart_linux-64
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - cuda-cudart >=12.9.79,<13.0a0
- size: 389140
- timestamp: 1749218427266
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda
- sha256: e022d36a333420130faf6473c49f8dab54bf976cf320577ffb06db0a0797b734
- md5: 3c3e2f6b5455783fd332a072d632ea78
- depends:
- - cuda-cccl_win-64
- - cuda-cudart-static_win-64
- - cuda-cudart_win-64
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports:
- weak:
- - cuda-cudart >=12.9.79,<13.0a0
- size: 1190184
- timestamp: 1749218971019
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032
- md5: b87bf315d81218dd63eb46cc1eaef775
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 1148889
- timestamp: 1749218381225
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda
- sha256: 6a3410cd7ce07955cb705801055ef129ebee1cd6390c6fe9e5f607b67c3dba36
- md5: 0dd152a1493d90356037604a865f050f
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 354611
- timestamp: 1749218544740
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda
- sha256: 6cde0ace2b995b49d0db2eefb7bc30bf00ffc06bb98ef7113632dec8f8907475
- md5: 64508631775fbbf9eca83c84b1df0cae
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 197249
- timestamp: 1749218394213
-- conda: https://prefix.dev/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda
- sha256: 6a89a53cdbcfafa0bb55abee1b58492c6a9a28e688abe04f48f0d01649c5f3e4
- md5: 71c9c2ab52226f990f268164381d8494
- depends:
- - cuda-version >=12.9,<12.10.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 23260
- timestamp: 1749218569458
-- conda: https://prefix.dev/conda-forge/noarch/cuda-pathfinder-1.5.5-pyhc364b38_0.conda
- sha256: 482d0082926006e1132b01c38916cc2503f9ae2c72d46b7d7ae0b2152f44c7e2
- md5: 61b9137919ce01625767161067bc2b18
- depends:
- - python >=3.10
- - cuda-version >=12.0,<14
- - python
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 45383
- timestamp: 1779846202856
-- conda: https://prefix.dev/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda
- sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656
- md5: b6d5d7f1c171cbd228ea06b556cfa859
- constrains:
- - cudatoolkit 12.9|12.9.*
- - __cuda >=12
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 21578
- timestamp: 1746134436166
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 1066502
- timestamp: 1773823162829
-- conda: https://prefix.dev/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda
- sha256: 430bd9d731b265f0bedb3183ac3ecfaa1656390c092b6e864ff8cc1229843c8c
- md5: 61dcf784d59ef0bd62c57d982b154ace
- depends:
- - python >=3.10
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 16102
- timestamp: 1779115228886
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 95462
- timestamp: 1768863743943
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 438002
- timestamp: 1766092633160
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 21333
- timestamp: 1763918099466
-- conda: https://prefix.dev/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda
- sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad
- md5: ff9efb7f7469aed3c4a8106ffa29593c
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 30753
- timestamp: 1756729456476
-- conda: https://prefix.dev/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda
- sha256: ab7c43874d451c36a11b1516a3fbdf23803c05fcb01063a3877549dfb3e34ec4
- md5: 917880ebad7632e8a52eada085b98ce9
- depends:
- - python >=3.10
- license: Unlicense
- run_exports: {}
- size: 34899
- timestamp: 1780521975987
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 149694
- timestamp: 1777547807038
-- conda: https://prefix.dev/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda
- sha256: 0b6c349fb314515b6d0bda4973edeab83366e4ebe6d57a435c028193ebe1e6f6
- md5: a119df8b5f08fe7b185f5923ab8c4c0e
- depends:
- - accessible-pygments >=0.0.5
- - beautifulsoup4
- - pygments >=2.7
- - python >=3.10
- - sphinx >=7.0,<10.0
- - sphinx-basic-ng
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 83092
- timestamp: 1772974091117
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 95967
- timestamp: 1756364871835
-- conda: https://prefix.dev/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba
- md5: 0a802cb9888dd14eeefc611f05c40b6e
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 30731
- timestamp: 1737618390337
-- conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8
- md5: 8e6923fc12f1fe8f8c4e5c9f343256ac
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- size: 17397
- timestamp: 1737618427549
-- conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.2-pyha770c72_0.conda
- sha256: ba55c0dce7aa063fe9bf00dcdb2caa4a25be0aced5fe8527a63dfccfd525dbaa
- md5: 211e13260293e6b4b3841dba94921558
- depends:
- - attrs >=22.2.0
- - click >=7.0
- - exceptiongroup >=1.0.0
- - python >=3.10
- - setuptools
- - sortedcontainers >=2.1.0,<3.0.0
- license: MPL-2.0
- license_family: MOZILLA
- run_exports: {}
- size: 388561
- timestamp: 1780712711416
-- conda: https://prefix.dev/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda
- sha256: f9fe1f9e539c544405ccb7ba632d4ba79edf243c05554d76ace073158a80b691
- md5: c75e517ebd7a5c5272fe111e8b162228
- depends:
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 56858
- timestamp: 1779999227630
-- conda: https://prefix.dev/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda
- sha256: 5a047f9eac290e679b4e6f6f4cbfcc5acdfbf031a4f06824d4ddb590cdbb850b
- md5: 92617c2ba2847cca7a6ed813b6f4ab79
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 15729
- timestamp: 1773752188889
-- conda: https://prefix.dev/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda
- sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8
- md5: ffc17e785d64e12fc311af9184221839
- depends:
- - python >=3.10
- - zipp >=3.20
- - python
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 34766
- timestamp: 1779714582554
-- conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda
- sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19
- md5: 9614359868482abba1bd15ce465e3c42
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 13387
- timestamp: 1760831448842
-- conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyh53cf698_0.conda
- sha256: a3f76e06c31bcf1bda0f633d5c9f1c834286b4f6decc6626067a6cffee283318
- md5: fbd58549b374103c1a80577f09a328ef
- 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
- run_exports: {}
- size: 652893
- timestamp: 1780654403616
-- conda: https://prefix.dev/conda-forge/noarch/ipython-9.14.1-pyhe2676ad_0.conda
- sha256: 3c5f2269e357118abfa49d21fdca3a35420ee5b251c2f5cb705310b38843db40
- md5: bf12187c2d1ef0bb63df01ace31ff26b
- depends:
- - __win
- - 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
- - colorama >=0.4.4
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 652076
- timestamp: 1780654438137
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 13993
- timestamp: 1737123723464
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 72146
- timestamp: 1772278531671
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 2038954
- timestamp: 1775680194539
-- conda: https://prefix.dev/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
- size: 843646
- timestamp: 1733300981994
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 120685
- timestamp: 1764517220861
-- conda: https://prefix.dev/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
- size: 8250
- timestamp: 1650660473123
-- conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda
- sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f
- md5: 6d03368f2b2b0a5fb6839df53b2eb5e0
- depends:
- - mdurl >=0.1,<1
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 69017
- timestamp: 1778169663339
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 15725
- timestamp: 1778264403247
-- conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda
- sha256: 9b0037171dad0100f0296699a11ae7d355237b55f42f9094aebc0f41512d96a1
- md5: 827064ddfe0de2917fb29f1da4f8f533
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 12934
- timestamp: 1733216573915
-- conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda
- sha256: 49db23cbfb1c1d414a14d7540195208b994ebd747beba0f15c903f3a0a2dc446
- md5: ad6821df7a98510117db06e9a833281f
- depends:
- - markdown-it-py >=2.0.0,<5.0.0
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 50460
- timestamp: 1778692223625
-- conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda
- sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7
- md5: 592132998493b3ff25fd7479396e8351
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 14465
- timestamp: 1733255681319
-- conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- sha256: 1cd625d7358edba307e8a4d10ed15ce7c59a1dc0296b678c2111b0d76c594915
- md5: ced6358cc61d7e381e68fc128f7b63db
- depends:
- - python >=3.10
- - ninja >=1.8.2
- - python
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 776653
- timestamp: 1776755211908
-- conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- sha256: f608b7ee5ef089c31a80ea3b5dd42765f6792438a5c23efaad8419ad4e47b96d
- md5: 369afcc2d4965e7a6a075ab82e2a26b8
- depends:
- - meson >=0.64.0
- - ninja
- - packaging >=23.2
- - pyproject-metadata >=0.9.0
- - python >=3.10
- - tomli >=1.0.0
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 94339
- timestamp: 1769082901525
-- conda: https://prefix.dev/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda
- sha256: 5bbf2f8179ec43d34d67ca8e4989d216c1bdb4b749fe6cb40e86ebf88c1b5300
- md5: 2e81b32b805f406d23ba61938a184081
- depends:
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 464918
- timestamp: 1773662068273
-- conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda
- sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1
- md5: e9c622e0d00fa24a6292279af3ab6d06
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 11766
- timestamp: 1745776666688
-- conda: https://prefix.dev/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda
- sha256: 94235bc1f769cf35029942ecb2ca796f18e730c1bf5aeef95e72680ebcfacfef
- md5: 580615e59fc7c07741e4d2ab052cfc8b
- depends:
- - docutils >=0.20,<0.23
- - jinja2
- - markdown-it-py >=4.2.0,<4.3.0
- - mdit-py-plugins >=0.6.1,<0.7
- - python >=3.11
- - pyyaml
- - sphinx >=8,<10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 74888
- timestamp: 1778696564508
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 1587439
- timestamp: 1765215107045
-- conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-24.16.0-pyhd8ed1ab_0.conda
- sha256: 5e633548a503f559b9b5f7177d7e1eecbdc32218b2da2cc5cd51856ac9b008fe
- md5: 1f1f289f5049df1a2263052f714739e6
- depends:
- - nodejs
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 13002
- timestamp: 1780162010976
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 3843
- timestamp: 1582593857545
-- conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda
- sha256: 482d94fce136c4352b18c6397b9faf0a3149bfb12499ab1ffebad8db0cb6678f
- md5: 3aa4b625f20f55cf68e92df5e5bf3c39
- depends:
- - python >=3.10
- - sphinx >=6
- - tomli >=1.1.0
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 65801
- timestamp: 1764715638266
-- conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda
- sha256: af71aabb2bfa4b2c89b7b06403e5cec23b418452cae9f9772bd7ac3f9ea1ff44
- md5: 52919815cd35c4e1a0298af658ccda04
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 62479
- timestamp: 1733688053334
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 91574
- timestamp: 1777103621679
-- conda: https://prefix.dev/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda
- sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e
- md5: 39894c952938276405a1bd30e4ce2caf
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 82472
- timestamp: 1777722955579
-- conda: https://prefix.dev/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
- size: 20884
- timestamp: 1715026639309
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 56559
- timestamp: 1777271601895
-- conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda
- sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a
- md5: d0d408b1f18883a944376da5cf8101ea
- depends:
- - ptyprocess >=0.5
- - python >=3.9
- license: ISC
- run_exports: {}
- size: 53561
- timestamp: 1733302019362
-- conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda
- sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d
- md5: 2c5ef45db85d34799771629bd5860fd7
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 26308
- timestamp: 1779972894916
-- conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda
- sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e
- md5: d7585b6550ad04c8c5e21097ada2888e
- depends:
- - python >=3.9
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 25877
- timestamp: 1764896838868
-- conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda
- sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae
- md5: edb16f14d920fb3faf17f5ce582942d6
- depends:
- - python >=3.10
- - wcwidth
- constrains:
- - prompt_toolkit 3.0.52
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 273927
- timestamp: 1756321848365
-- conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda
- sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83
- md5: 7d9daffbb8d8e0af0f769dbbcd173a54
- depends:
- - python >=3.9
- license: ISC
- size: 19457
- timestamp: 1733302371990
-- conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda
- sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0
- md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04
- depends:
- - python >=3.9
- license: MIT
- license_family: MIT
- size: 16668
- timestamp: 1733569518868
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 232875
- timestamp: 1755953378112
-- conda: https://prefix.dev/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda
- sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1
- md5: f0599959a2447c1e544e216bddf393fa
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pybind11-abi ==11
- size: 14671
- timestamp: 1752769938071
-- conda: https://prefix.dev/conda-forge/noarch/pybind11-global-3.0.1-pyh5e4992e_0.conda
- sha256: fff9c4f726644a1889a4b631aca547d8f302c72109d75518ae32997a3d54f23a
- md5: 58564979e28f8b18955ec56c4dc6b252
- depends:
- - python >=3.8
- - __win
- - python
- constrains:
- - pybind11-abi ==11
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 227797
- timestamp: 1755953378113
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 228871
- timestamp: 1755953338243
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 893031
- timestamp: 1774796815820
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 391910
- timestamp: 1771619020969
-- conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- sha256: 7e709bde682104c241674f8005fd560d7ea8599458c94d03ed51ef8a4ae7d737
- md5: cd6dae6c673c8f12fe7267eac3503961
- depends:
- - packaging >=23.2
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 25200
- timestamp: 1770672303277
-- conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca
- md5: e2fd202833c4a981ce8a65974fe4abd1
- depends:
- - __win
- - python >=3.9
- - win_inet_pton
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 21784
- timestamp: 1733217448189
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 21085
- timestamp: 1733217331982
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 299984
- timestamp: 1775644472530
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 29559
- timestamp: 1774139250481
-- conda: https://prefix.dev/conda-forge/noarch/pytest-run-parallel-0.9.1-pyhd8ed1ab_0.conda
- sha256: 590f58d378724a620b94ca5961f0fc0b94ebabb3a5cf163060dfd85106e0d54f
- md5: 35e2cc981ca9a0e237f7a2f2286556ad
- depends:
- - pytest >=6.2.0
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 24431
- timestamp: 1780554839359
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 244628
- timestamp: 1755304154927
-- conda: https://prefix.dev/conda-forge/noarch/python-freethreading-3.13.13-h92d6c8b_0.conda
- sha256: 62e6ac22f5679d8987dc4fa23a8ff1845ea8723d9ade21ec8ae8d566b0c2e8ca
- md5: af490f9dc429f08a20182a3a678df568
- depends:
- - cpython 3.13.13.*
- - python_abi * *_cp313t
- license: Python-2.0
- run_exports: {}
- size: 48346
- timestamp: 1775613766801
-- conda: https://prefix.dev/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda
- sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943
- md5: 41954747ba952ec4b01e16c2c9e8d8ff
- depends:
- - cpython 3.14.5.*
- - python_abi * *_cp314
- license: Python-2.0
- run_exports: {}
- size: 50212
- timestamp: 1779236703009
-- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- build_number: 8
- sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894
- md5: 8fcb6b0e2161850556231336dae58358
- constrains:
- - python 3.11.* *_cpython
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 7003
- timestamp: 1752805919375
-- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.13-8_cp313t.conda
- build_number: 8
- sha256: 592a3d800fb02331e6c54abd4acea354fce43b5c670da277a29cd57aaed9f2fd
- md5: e1dd2408e4ff08393fbc3502fbe4316d
- constrains:
- - python 3.13.* *_cp313t
- track_features:
- - freethreading
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 6968
- timestamp: 1752805914057
-- conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- build_number: 8
- sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
- md5: 0539938c55b6b1a59b560e843ad864a4
- constrains:
- - python 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 6989
- timestamp: 1752805904792
-- conda: https://prefix.dev/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda
- sha256: 5f938d208c284cc1f910fd84f2adffe59d01de73f62d8448ae311eb4f0340bd3
- md5: 1fd14e3bb9bd8dac4caa30da123b8a93
- depends:
- - python >=3.10.*
- - yaml
- track_features:
- - pyyaml_no_compile
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 45525
- timestamp: 1770223374054
-- conda: https://prefix.dev/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda
- sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da
- md5: 4a85203c1d80c1059086ae860836ffb9
- 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
- run_exports: {}
- size: 68709
- timestamp: 1778851103479
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 13814
- timestamp: 1766003022813
-- conda: https://prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
- sha256: 6ecf738d5590bf228f09c4ecd1ea91d811f8e0bd9acdef341bc4d6c36beb13a3
- md5: d629a398d7bf872f9ed7b27ab959de15
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 676888
- timestamp: 1770456470072
-- conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda
- sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1
- md5: 8e194e7b992f99a5015edbd4ebd38efd
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 639697
- timestamp: 1773074868565
-- conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda
- sha256: ad89284ea94821c20ff87e64b948e4afc690cf5202d14c009355b0594cf23aea
- md5: 46b6abe31482f6bca064b965696ae807
- depends:
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 74456
- timestamp: 1780468201547
-- conda: https://prefix.dev/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
- size: 28657
- timestamp: 1738440459037
-- conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda
- sha256: 2afa5fe9331c09b4c4689ddf6ace8fc16c837eae547c57dab325b844072fdd77
- md5: 9e21f087f087f805debe877d88e00a14
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 38802
- timestamp: 1779635534390
-- conda: https://prefix.dev/conda-forge/noarch/sparse-0.18.0-pyhcf101f3_0.conda
- sha256: b18229272e7b662f8b3e1be4d768753e7b6e6fdf36c5a82878aeec759c6bfaf5
- md5: c67d2c8ce612c88ece7221fe0b5357f2
- depends:
- - python >=3.11
- - numpy >=1.17
- - numba >=0.49
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 124963
- timestamp: 1771482567549
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 1584836
- timestamp: 1767271941650
-- conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.10.5-pyhd8ed1ab_0.conda
- sha256: 388fcdd65f24eaca820e57631c8b3d42fdf51a6958b9042116bc7cfb272ae1f8
- md5: fde8f992fc261069e83a9348bc51c552
- depends:
- - python >=3.12
- - sphinx >=9.1
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 38484
- timestamp: 1780574304748
-- conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda
- sha256: 90d900d31afe0bd6f42cf1e529e23e6eac4284b48bc64e5e942f19f5bf8ef0f2
- md5: a090580065b21d9c56662ebe68f6e7a6
- depends:
- - python >=3.9
- - sphinx >=4.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 20495
- timestamp: 1737748706101
-- conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda
- sha256: 8cd892e49cb4d00501bc4439fb0c73ca44905f01a65b2b7fa05ba0e8f3924f19
- md5: bf22cb9c439572760316ce0748af3713
- depends:
- - python >=3.9
- - sphinx >=1.8
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 17893
- timestamp: 1734573117732
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 29752
- timestamp: 1733754216334
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 24536
- timestamp: 1733754232002
-- conda: https://prefix.dev/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
- size: 32895
- timestamp: 1733754385092
-- conda: https://prefix.dev/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
- size: 10462
- timestamp: 1733753857224
-- conda: https://prefix.dev/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
- size: 26959
- timestamp: 1733753505008
-- conda: https://prefix.dev/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
- size: 28669
- timestamp: 1733750596111
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 26988
- timestamp: 1733569565672
-- conda: https://prefix.dev/conda-forge/noarch/sympy-1.14.0-pyh04b8f61_6.conda
- sha256: 772a39271b96ce77fbaf169f43c1097b8e2c8d34c2685e5048cd72459a38ea24
- md5: 1e739b165ad827042e48978718e6532b
- depends:
- - mpmath >=1.1.0,<1.5
- - python >=3.10
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 4626620
- timestamp: 1771952365446
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 4661767
- timestamp: 1771952371059
-- conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd
- md5: b5325cf06a000c5b14970462ff5e4d58
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 21561
- timestamp: 1774492402955
-- conda: https://prefix.dev/conda-forge/noarch/tomlkit-0.15.0-pyha770c72_0.conda
- sha256: 1cd52f9ccb4854c4d731438afe0e833b6b71edaf5ede661152aa98efb3a7cc70
- md5: 42ef10a8f7f5d55a2e267c0d5daa6387
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 41169
- timestamp: 1778423744478
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 53978
- timestamp: 1760707830681
-- conda: https://prefix.dev/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda
- sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431
- md5: 37e3be7b6e2977d37b8fa5da229f5dc0
- depends:
- - python >=3.10
- - python
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 115158
- timestamp: 1780507822178
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 91383
- timestamp: 1756220668932
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 51692
- timestamp: 1756220668932
-- conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c
- md5: ad659d0a2b3e47e38d829aa8cad2d610
- license: LicenseRef-Public-Domain
- run_exports: {}
- size: 119135
- timestamp: 1767016325805
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 103560
- timestamp: 1778188657149
-- conda: https://prefix.dev/conda-forge/noarch/validate-pyproject-0.25-pyhd8ed1ab_0.conda
- sha256: 775707796ae17f8c1e3cf1018eb7e239d020fd619da6b5f81499078b6ee53505
- md5: f01f6526efe9f727c9d787b3fc849f81
- depends:
- - python >=3.10
- - python-fastjsonschema <=3,>=2.16.2
- license: BSD-3-Clause AND MIT AND MPL-2.0
- run_exports: {}
- size: 50550
- timestamp: 1770079209549
-- conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda
- sha256: 5ddde23d65aecde7e8dac0b9d9c7821ead2b87a320d787f9e4288c0ee00fa332
- md5: 19c961dd9cab6c3e13cd195f0176dbfa
- depends:
- - python >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 133769
- timestamp: 1780932915297
-- conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f
- md5: 46e441ba871f524e2b067929da3051c2
- depends:
- - __win
- - python >=3.9
- license: LicenseRef-Public-Domain
- size: 9555
- timestamp: 1733130678956
-- conda: https://prefix.dev/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda
- sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423
- md5: ba3dcdc8584155c97c648ae9c044b7a3
- depends:
- - python >=3.10
- - python
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 24190
- timestamp: 1779159948016
-- conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda
- build_number: 7
- sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7
- md5: eaac87c21aff3ed21ad9656697bb8326
- depends:
- - llvm-openmp >=9.0.1
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - _openmp_mutex >=4.5
- size: 8328
- timestamp: 1764092562779
-- conda: https://prefix.dev/conda-forge/osx-64/actionlint-1.7.12-h5220d24_0.conda
- sha256: 0a3f0f673f7a1c3dcc5bd04f759b977676e3d680ec50346e9013a0c067426d3c
- md5: 7a360d28a2a40006bc138f05b93188d1
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=10.12
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 2079880
- timestamp: 1774975813961
-- conda: https://prefix.dev/conda-forge/osx-64/ast-serialize-0.5.0-py310hb9b2626_1.conda
- noarch: python
- sha256: 9d38da0aa9f1034eecf97151a26686f8a6261cbfe27eb486e80e0d86e0169d33
- md5: 839c5895cae30ab26a5d561955b9db25
- depends:
- - python >=3.10
- - __osx >=11.0
- - _python_abi3_support 1.*
- - cpython >=3.10
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 1122556
- timestamp: 1780396847113
-- conda: https://prefix.dev/conda-forge/osx-64/astroid-4.0.4-py314hee6578b_0.conda
- sha256: 6dbcfadbb3b2cf215adc32fe1e6ea16e24d8b4922f951881b69badba1980849d
- md5: cf75d02837f1ac7c6e2d5402a47b0b12
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: LGPL-2.1-or-later
- license_family: LGPL
- run_exports: {}
- size: 540834
- timestamp: 1770634697046
-- conda: https://prefix.dev/conda-forge/osx-64/brotli-python-1.2.0-py314h3262eb8_1.conda
- sha256: 2e34922abda4ac5726c547887161327b97c3bbd39f1204a5db162526b8b04300
- md5: 389d75a294091e0d7fa5a6fc683c4d50
- depends:
- - __osx >=10.13
- - libcxx >=19
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - libbrotlicommon 1.2.0 h8616949_1
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 390153
- timestamp: 1764017784596
-- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42
- md5: 4173ac3b19ec0a4f400b4f782910368b
- depends:
- - __osx >=10.13
- license: bzip2-1.0.6
- license_family: BSD
- run_exports:
- weak:
- - bzip2 >=1.0.8,<2.0a0
- size: 133427
- timestamp: 1771350680709
-- conda: https://prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda
- sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea
- md5: fc9a153c57c9f070bebaa7eef30a8f17
- depends:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - c-ares >=1.34.6,<2.0a0
- size: 186122
- timestamp: 1765215100384
-- conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py311ha8ae342_0.conda
- sha256: 286d4d6bf016f56d71f58c2dd495410213fb5e4053a0545d48638bfd346683bc
- md5: 145a45fb204a76aac34696a6fac42ece
- depends:
- - __osx >=11.0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 396933
- timestamp: 1779838320779
-- conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.1-py314h77fa6c7_0.conda
- sha256: 29db019fee55fe7709db55c65f8919ab8f10ece710b149b7a4648cc86c95b938
- md5: 0b15b52281394a1b864c5192c845e49d
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 414951
- timestamp: 1779838238137
-- conda: https://prefix.dev/conda-forge/osx-64/dprint-0.50.0-hd2571bf_0.conda
- sha256: c9d5be21192cdc537b5058b3452b2a2d97234313e973ada938df07511978fe69
- md5: fc3e6231b1b9d7913c79494f2ab8cc23
- depends:
- - __osx >=10.13
- constrains:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 5938302
- timestamp: 1747623421024
-- conda: https://prefix.dev/conda-forge/osx-64/flatbuffers-25.9.23-h6982a40_0.conda
- sha256: 7d430e5fbe47e690e00345e4c5a856d2469aa1ea6afc573e8dabd0eb8aabea5f
- md5: 314a166f491f531788ad6220acad496c
- depends:
- - __osx >=10.13
- - libcxx >=19
- license: Apache-2.0
- license_family: APACHE
- run_exports:
- weak:
- - flatbuffers >=25.9.23,<25.9.24.0a0
- size: 1358478
- timestamp: 1761142801269
-- conda: https://prefix.dev/conda-forge/osx-64/fmt-12.1.0-hda137b5_0.conda
- sha256: 3c56fc4b3528acb29d89d139f9800b86425e643be8d9caddd4d6f4a8b09a8db4
- md5: 265ec3c628a7e2324d86a08205ada7a8
- depends:
- - __osx >=10.13
- - libcxx >=19
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - fmt >=12.1.0,<12.2.0a0
- size: 188352
- timestamp: 1767681462452
-- conda: https://prefix.dev/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda
- sha256: 75aa5e7a875afdcf4903b7dc98577672a3dc17b528ac217b915f9528f93c85fc
- md5: 427101d13f19c4974552a4e5b072eef1
- depends:
- - __osx >=10.13
- - libcxx >=16
- license: GPL-2.0-or-later OR LGPL-3.0-or-later
- run_exports:
- weak:
- - gmp >=6.3.0,<7.0a0
- size: 428919
- timestamp: 1718981041839
-- conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py311hee6c895_1.conda
- sha256: e73bb4259e5e740c9ba26624351ff070ee8cbd3ddcc2ef80c77050f6a2c4c4cb
- md5: ffc59f8f42f62ac974df1bf0a1f18d5b
- depends:
- - __osx >=11.0
- - gmp >=6.3.0,<7.0a0
- - mpc >=1.3.1,<2.0a0
- - mpfr >=4.2.1,<5.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 197711
- timestamp: 1773245349393
-- conda: https://prefix.dev/conda-forge/osx-64/gmpy2-2.3.0-py314hd534dbf_1.conda
- sha256: 654113f779a67185647cabc23f0f299d48ef08ca1529c46137b950e75dc8cf49
- md5: 0df836109ffc6341d8464c3cc1f3db52
- depends:
- - __osx >=11.0
- - gmp >=6.3.0,<7.0a0
- - mpc >=1.3.1,<2.0a0
- - mpfr >=4.2.1,<5.0a0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 203405
- timestamp: 1773245755808
-- conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- sha256: 1294117122d55246bb83ad5b589e2a031aacdf2d0b1f99fd338aa4394f881735
- md5: 627eca44e62e2b665eeec57a984a7f00
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - icu >=78.3,<79.0a0
- size: 12273764
- timestamp: 1773822733780
-- conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py311hc34a41d_0.conda
- sha256: 791f183a2eac5eb38c5f43d6899db8f04439da1c683c05e96e8f0c38a6b1027d
- md5: 0511852b89de393c902e397090ce6923
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - __osx >=11.0
- - libcxx >=20
- - numpy >=1.23,<3
- - python_abi 3.11.* *_cp311
- - libzlib >=1.3.2,<2.0a0
- - onednn >=3.11.1,<4.0a0
- - libre2-11 >=2025.11.5
- - re2
- - openssl >=3.5.5,<4.0a0
- - libgrpc >=1.78.1,<1.79.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - flatbuffers >=25.9.23,<25.9.24.0a0
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 75609554
- timestamp: 1774537095697
-- conda: https://prefix.dev/conda-forge/osx-64/jaxlib-0.9.2-cpu_py314h66e2b45_0.conda
- sha256: da945deebb673c8a2d614d8ade47ca6c968605ef92378d223eed2792244e825f
- md5: 08ed2967456f021566b869efae8d8a41
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - __osx >=11.0
- - libcxx >=20
- - python_abi 3.14.* *_cp314
- - libre2-11 >=2025.11.5
- - re2
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - numpy >=1.23,<3
- - onednn >=3.11.1,<4.0a0
- - libgrpc >=1.78.1,<1.79.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libzlib >=1.3.2,<2.0a0
- - openssl >=3.5.5,<4.0a0
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 75770995
- timestamp: 1774510590551
-- conda: https://prefix.dev/conda-forge/osx-64/lefthook-2.1.9-h5839d16_0.conda
- sha256: 2378c5766971c515097d3107337d65357f45ebee0a01b50a60b7abe1f546c56e
- md5: 0665707f181f19a08e1c6cab287e9e3d
- constrains:
- - __osx >=10.12
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 5538012
- timestamp: 1780061100915
-- conda: https://prefix.dev/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
- sha256: 2b4ff36082ddfbacc47ac6e11d4dd9f3403cd109ce8d7f0fbee0cdd47cdef013
- md5: 317f40d7bd7bf6d54b56d4a5b5f5085d
- depends:
- - __osx >=10.13
- - libcxx >=19
- constrains:
- - libabseil-static =20260107.1=cxx17*
- - abseil-cpp =20260107.1
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil =*=cxx17*
- size: 1217836
- timestamp: 1770863510112
-- conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda
- build_number: 8
- sha256: 55cf9f92a2d07c33f8a32c44ff1528ea48fd69677cc003a4532d09b71cb8a316
- md5: 7da1e8ab7c4498db9457c191d82930a3
- depends:
- - libopenblas >=0.3.33,<0.3.34.0a0
- - libopenblas >=0.3.33,<1.0a0
- constrains:
- - mkl <2027
- - blas 2.308 openblas
- - liblapacke 3.11.0 8*_openblas
- - libcblas 3.11.0 8*_openblas
- - liblapack 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.11.0,<4.0a0
- size: 19048
- timestamp: 1779860008916
-- conda: https://prefix.dev/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda
- build_number: 20
- sha256: 808742b95f44dcc7c546e5c3bb7ed378b08aeaef3ee451d31dfe26cdf76d109f
- md5: 160fdc97a51d66d51dc782fb67d35205
- depends:
- - mkl >=2023.2.0,<2024.0a0
- constrains:
- - blas * mkl
- - libcblas 3.9.0 20_osx64_mkl
- - liblapack 3.9.0 20_osx64_mkl
- - liblapacke 3.9.0 20_osx64_mkl
- track_features:
- - blas_mkl
- - blas_backport_2
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.9.0,<4.0a0
- size: 15075
- timestamp: 1700568635315
-- conda: https://prefix.dev/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
- sha256: 4c19b211b3095f541426d5a9abac63e96a5045e509b3d11d4f9482de53efe43b
- md5: f157c098841474579569c85a60ece586
- depends:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libbrotlicommon >=1.2.0,<1.3.0a0
- size: 78854
- timestamp: 1764017554982
-- conda: https://prefix.dev/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
- sha256: 729158be90ae655a4e0427fe4079767734af1f9b69ff58cf94ca6e8d4b3eb4b7
- md5: 63186ac7a8a24b3528b4b14f21c03f54
- depends:
- - __osx >=10.13
- - libbrotlicommon 1.2.0 h8616949_1
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libbrotlidec >=1.2.0,<1.3.0a0
- size: 30835
- timestamp: 1764017584474
-- conda: https://prefix.dev/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda
- sha256: 8ece7b41b6548d6601ac2c2cd605cf2261268fc4443227cc284477ed23fbd401
- md5: 12a58fd3fc285ce20cf20edf21a0ff8f
- depends:
- - __osx >=10.13
- - libbrotlicommon 1.2.0 h8616949_1
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libbrotlienc >=1.2.0,<1.3.0a0
- size: 310355
- timestamp: 1764017609985
-- conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda
- build_number: 8
- sha256: 50eb650a17a34ea45fe2b31e60a98632d1f8c203308014dcef93043d54612482
- md5: 4f116127b172bbba835c1e0491efd86f
- depends:
- - libblas 3.11.0 8_he492b99_openblas
- constrains:
- - liblapacke 3.11.0 8*_openblas
- - blas 2.308 openblas
- - liblapack 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.11.0,<4.0a0
- size: 19049
- timestamp: 1779860025163
-- conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda
- build_number: 20
- sha256: a35e3c8f0efee2bee8926cbbf23dcb36c9cfe3100690af3b86f933bab26c4eeb
- md5: 51089a4865eb4aec2bc5c7468bd07f9f
- depends:
- - libblas 3.9.0 20_osx64_mkl
- constrains:
- - blas * mkl
- - liblapack 3.9.0 20_osx64_mkl
- - liblapacke 3.9.0 20_osx64_mkl
- track_features:
- - blas_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.9.0,<4.0a0
- size: 14694
- timestamp: 1700568672081
-- conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- sha256: c03c298355dea54b729ed6c5f1e6dbd0e2426906039eba8aa2ba1254d005b7d8
- md5: 423373b842c3861da6cfa8c8915798ce
- depends:
- - __osx >=11.0
- license: Apache-2.0 WITH LLVM-exception
- license_family: Apache
- run_exports: {}
- size: 564939
- timestamp: 1780442565078
-- conda: https://prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda
- sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43
- md5: 899db79329439820b7e8f8de41bca902
- license: BSD-2-Clause
- license_family: BSD
- run_exports:
- weak:
- - libev >=4.33,<4.34.0a0
- size: 106663
- timestamp: 1702146352558
-- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- sha256: 460afe7ba0882e6d2fcc0ad1568dce27025110ec09c2b9ce9e3b49d61e52ce6b
- md5: f95dc08366f2a452005062b5bcceac51
- depends:
- - __osx >=11.0
- constrains:
- - expat 2.8.1.*
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 75654
- timestamp: 1779279058576
-- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6
- md5: 66a0dc7464927d0853b590b6f53ba3ea
- depends:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libffi >=3.5.2,<3.6.0a0
- size: 53583
- timestamp: 1769456300951
-- conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda
- sha256: 17a5dcd818f89173db51d7d1acd77615cb77db7b4c2b5f571d4dafe559430ab5
- md5: 4bf33d5ca73f4b89d3495285a42414a4
- depends:
- - _openmp_mutex
- constrains:
- - libgomp 15.2.0 19
- - libgcc-ng ==15.2.0=*_19
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- run_exports: {}
- size: 424164
- timestamp: 1778271183296
-- conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda
- sha256: 519045363b87b870be779d38f0bfd325d4b787acdaa0a2136a92c1081eff5112
- md5: d362f41203d0a1d2d4940446f95374c9
- depends:
- - libgfortran5 15.2.0 hd16e46c_19
- constrains:
- - libgfortran-ng ==15.2.0=*_19
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- run_exports: {}
- size: 139925
- timestamp: 1778271458366
-- conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda
- sha256: c7f5f6e80357d6d5bc69588c16144205b0c79cf32cd090ccb5afef9d557632af
- md5: 1cddb3f7e54f5871297afc0fafa61c2c
- depends:
- - libgcc >=15.2.0
- constrains:
- - libgfortran 15.2.0
- license: GPL-3.0-only WITH GCC-exception-3.1
- license_family: GPL
- run_exports: {}
- size: 1063687
- timestamp: 1778271196574
-- conda: https://prefix.dev/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda
- sha256: ecf98c41dbde09fb3bf6878d7099613c10e256223ec7ccdb5eb401948eadc558
- md5: 69524227096cee1a8af2f4693cf6afa2
- 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
- run_exports:
- weak:
- - libgrpc >=1.78.1,<1.79.0a0
- size: 5153859
- timestamp: 1774015913341
-- conda: https://prefix.dev/conda-forge/osx-64/libhwloc-2.13.0-default_h4e3125e_1000.conda
- sha256: 8e051b990da280ca6eca2f025640572459a0ddfa2b3b71a113e4d14b4277aa33
- md5: c74c64d67f55426bc24d333a84aed0e3
- depends:
- - __osx >=10.13
- - libcxx >=19
- - libxml2
- - libxml2-16 >=2.14.6
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libhwloc >=2.13.0,<2.13.1.0a0
- size: 2363468
- timestamp: 1770954013361
-- conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda
- sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6
- md5: 210a85a1119f97ea7887188d176db135
- depends:
- - __osx >=10.13
- license: LGPL-2.1-only
- run_exports:
- weak:
- - libiconv >=1.18,<2.0a0
- size: 737846
- timestamp: 1754908900138
-- conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda
- build_number: 8
- sha256: 56a68fce5a63d4583a42c212324d62ac292376b8bf05986a551bd640e7fa137d
- md5: e11ee849bd2a573a0f6e53b1b67ebf37
- depends:
- - libblas 3.11.0 8_he492b99_openblas
- constrains:
- - liblapacke 3.11.0 8*_openblas
- - libcblas 3.11.0 8*_openblas
- - blas 2.308 openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.11.0,<3.12.0a0
- size: 19030
- timestamp: 1779860046842
-- conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda
- build_number: 20
- sha256: fdccac604746f9620fefaee313707aa2f500f73e51f8e3a4b690d5d4c90ce3dc
- md5: 58f08e12ad487fac4a08f90ff0b87aec
- depends:
- - libblas 3.9.0 20_osx64_mkl
- constrains:
- - blas * mkl
- - libcblas 3.9.0 20_osx64_mkl
- - liblapacke 3.9.0 20_osx64_mkl
- track_features:
- - blas_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.9.0,<3.10.0a0
- size: 14699
- timestamp: 1700568690313
-- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c
- md5: becdfbfe7049fa248e52aa37a9df09e2
- depends:
- - __osx >=11.0
- constrains:
- - xz 5.8.3.*
- license: 0BSD
- run_exports:
- weak:
- - liblzma >=5.8.3,<6.0a0
- size: 105724
- timestamp: 1775826029494
-- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd
- md5: ec88ba8a245855935b871a7324373105
- depends:
- - __osx >=10.13
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 79899
- timestamp: 1769482558610
-- conda: https://prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda
- sha256: 899551e16aac9dfb85bfc2fd98b655f4d1b7fea45720ec04ccb93d95b4d24798
- md5: dba4c95e2fe24adcae4b77ebf33559ae
- 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
- run_exports:
- weak:
- - libnghttp2 >=1.68.1,<2.0a0
- size: 606749
- timestamp: 1773854765508
-- conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda
- sha256: 2c2ffe7c3ab7becd47ad308946873d2bdc219625af32a53d10efbaa54b595d31
- md5: 30666a6f0afe1471e999eca7ae5c8179
- depends:
- - __osx >=11.0
- - libgfortran
- - libgfortran5 >=14.3.0
- - llvm-openmp >=19.1.7
- constrains:
- - openblas >=0.3.33,<0.3.34.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libopenblas >=0.3.33,<1.0a0
- size: 6287889
- timestamp: 1776996499823
-- conda: https://prefix.dev/conda-forge/osx-64/libprotobuf-6.33.5-hff14b61_1.conda
- sha256: c511b4e8026c94b152031a9ee410583991b4a610ebbb1b86992724c37d9abf50
- md5: 1450d8dbd5ac263d3d793fcf99612889
- depends:
- - __osx >=11.0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libprotobuf >=6.33.5,<6.33.6.0a0
- size: 2971082
- timestamp: 1780005104925
-- conda: https://prefix.dev/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda
- sha256: 092f1ed90ba105402b0868eda0a1a11fd1aedd93ea6bb7a57f6e2fc2218806d5
- md5: 154f9f623c04dac40752d279bfdecebf
- 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
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- size: 179250
- timestamp: 1768190310379
-- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- sha256: 4d4f3135d390d192ab9cdf3711d87e3be6bb7f3959c52a96e2f333b30960d6fb
- md5: 4c019bd25570899d0f9755de01b89021
- depends:
- - __osx >=11.0
- - icu >=78.3,<79.0a0
- - libzlib >=1.3.2,<2.0a0
- license: blessing
- run_exports:
- weak:
- - libsqlite >=3.53.2,<4.0a0
- size: 1010419
- timestamp: 1780575011758
-- conda: https://prefix.dev/conda-forge/osx-64/libtorch-2.11.0-cpu_mkl_hf457987_101.conda
- sha256: 6e0551989d04b74d0002b4dca5df10102138fb955a1647b5c87d26c6dfb518bb
- md5: 620a67508a8c9442698abdcd14b33be3
- depends:
- - __osx >=11.0
- - fmt >=12.1.0,<12.2.0a0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=19
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - mkl >=2023.2.0,<2024.0a0
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch 2.11.0 cpu_mkl_*_101
- - pytorch-gpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 50631360
- timestamp: 1781055846189
-- conda: https://prefix.dev/conda-forge/osx-64/libuv-1.52.1-ha3d0635_0.conda
- sha256: a77c3832a82b26afe8da3f4bbacca58a943cc62f2a5680547913650527a51299
- md5: 703303067839cd1da659528a84b3c0cc
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libuv >=1.52.1,<2.0a0
- size: 128150
- timestamp: 1779396112490
-- conda: https://prefix.dev/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda
- sha256: 437f003e299d77403db42d17e532d686236f357ac5c3d6bf466558c697902597
- md5: c74ae93cd7876e3a9c4b5569d5e29e34
- 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
- run_exports: {}
- size: 496338
- timestamp: 1776377250079
-- conda: https://prefix.dev/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda
- sha256: 24248928e63b5de45012c8ad3fd6b350ae1fe2fc355613bb89ee5f0a35835bea
- md5: 33f30d4878d1f047da82a669c33b307d
- 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 h7a90416_0
- - libzlib >=1.3.2,<2.0a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libxml2
- - libxml2-16 >=2.15.3
- size: 40836
- timestamp: 1776377277986
-- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7
- md5: 30439ff30578e504ee5e0b390afc8c65
- depends:
- - __osx >=11.0
- constrains:
- - zlib 1.3.2 *_2
- license: Zlib
- license_family: Other
- run_exports:
- weak:
- - libzlib >=1.3.2,<2.0a0
- size: 59000
- timestamp: 1774073052242
-- conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.7-h0d3cbff_0.conda
- sha256: c8eeb6bca45680db8974b78e0524b2ab3c285a9916a0b3356329d1f949b1311b
- md5: 301c1db2d75ac8a91f46d21652e08dd6
- depends:
- - __osx >=11.0
- constrains:
- - openmp 22.1.7|22.1.7.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- run_exports:
- strong:
- - llvm-openmp >=22.1.7
- size: 310879
- timestamp: 1780456054580
-- conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py311h2a7c09c_1.conda
- sha256: 307c38ebb38f9436d68ad71a56536c5f1d10e4cc3a388eabb724c9f9524f5ce2
- md5: 5777950d9751f0f58b20bcb72d4bd327
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 26023192
- timestamp: 1776077422673
-- conda: https://prefix.dev/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda
- sha256: 42f64fd8ad94981bdf8cef0a6897cb7ad7ed61baf9064d8a91e285e21e7ce780
- md5: 3184407147c2917aa4fbb7ce3848efd0
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 26003082
- timestamp: 1776077079350
-- conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py311ha8ae342_1.conda
- sha256: 8702d79aa3f5622d8ede5d5cc94faf135deab77b5caf95401f25f25179b22607
- md5: e14b7beea23c9e28b6500c24f5093d62
- depends:
- - __osx >=11.0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 25987
- timestamp: 1772445597250
-- conda: https://prefix.dev/conda-forge/osx-64/markupsafe-3.0.3-py314h77fa6c7_1.conda
- sha256: 74507b481299c3d35dc7d1c35f9c92e2e94e0eda819b264f5f25b7552f8a7d64
- md5: 5d45a74270e21481797387a209b3dec3
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 26740
- timestamp: 1772445674690
-- conda: https://prefix.dev/conda-forge/osx-64/mkl-2023.2.0-h694c41f_50502.conda
- sha256: 1841842ed23ddd61fd46b2282294b1b9ef332f39229645e1331739ee8c2a6136
- md5: 0bdfc939c8542e0bc6041cbd9a900219
- depends:
- - _openmp_mutex * *_kmp_*
- - _openmp_mutex >=4.5
- - tbb 2021.*
- license: LicenseRef-ProprietaryIntel
- license_family: Proprietary
- run_exports: {}
- size: 119058457
- timestamp: 1757091004348
-- conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py311hca72124_1.conda
- sha256: 973709b3c3c4ed16e46b4bc56677d7cdbe4a1a2423d98c0bb59288d69cf363c2
- md5: f9cc89191baff5ab7b802a35300177d5
- depends:
- - python
- - libcxx >=19
- - __osx >=10.13
- - python_abi 3.11.* *_cp311
- - numpy >=1.23,<3
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 278952
- timestamp: 1771362390400
-- conda: https://prefix.dev/conda-forge/osx-64/ml_dtypes-0.5.4-np2py314h613bbd0_1.conda
- sha256: ab2383da203c9efd29983cb191deb52502f6ae1ffdbf4ffff61f514962b1dcaf
- md5: 7f551f8e20397420c26aea79282fd7be
- depends:
- - python
- - __osx >=10.13
- - libcxx >=19
- - numpy >=1.23,<3
- - python_abi 3.14.* *_cp314
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 276847
- timestamp: 1771362360016
-- conda: https://prefix.dev/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda
- sha256: 272ac1d9a2db3c9dbe2359c79784558a4e9b38624a0cc07c8f50b500a1b95d25
- md5: 52b3fbb35494ec12913a308397f52a9d
- 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
- run_exports:
- weak:
- - mpc >=1.4.0,<2.0a0
- size: 91763
- timestamp: 1774472790640
-- conda: https://prefix.dev/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda
- sha256: 0a238d8500b2206b04f780093c25d83694c8c9628ea50f4376463c608168bf95
- md5: bc5ac4d19d24a6062f60560aab0e8976
- depends:
- - __osx >=11.0
- - gmp >=6.3.0,<7.0a0
- license: LGPL-3.0-only
- license_family: LGPL
- run_exports:
- weak:
- - mpfr >=4.2.2,<5.0a0
- size: 374756
- timestamp: 1773414598704
-- conda: https://prefix.dev/conda-forge/osx-64/mypy-2.1.0-py314h00bde9c_0.conda
- sha256: 66ff8b7a255d77d1184d905a12bff30eb2eee6bbba2002d063d78d4601664414
- md5: 94b2ffbf837668051cead37c5e261a4c
- depends:
- - ast-serialize >=0.3.0,<1.0.0
- - mypy_extensions >=1.0.0
- - pathspec >=1.0.0
- - python
- - python-librt >=0.11.0
- - typing_extensions >=4.6.0
- - psutil >=4.0
- - __osx >=11.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 14767202
- timestamp: 1780315780679
-- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- sha256: f5f7e006ff4271305ab4cc08eedd855c67a571793c3d18aff73f645f088a8cae
- md5: 31b8740cf1b2588d4e61c81191004061
- depends:
- - __osx >=11.0
- license: X11 AND BSD-3-Clause
- run_exports:
- weak:
- - ncurses >=6.6,<7.0a0
- size: 831711
- timestamp: 1777423052277
-- conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- sha256: 1646832e3c2389595569ab9a6234c119a4dedf6f4e55532a8bf07edab7f8037d
- md5: afda563484aa0017278866707807a335
- depends:
- - libcxx >=19
- - __osx >=10.13
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 178071
- timestamp: 1763688235442
-- conda: https://prefix.dev/conda-forge/osx-64/nodejs-26.3.0-hf3170e9_0.conda
- sha256: cd478b10f472562d7944127c2aa26bc087cfd9f617b446449085f4aab9df5786
- md5: 72993f43592b2b29733b18ef30d54fab
- depends:
- - libcxx >=19
- - __osx >=11.0
- - openssl >=3.5.6,<4.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libuv >=1.52.1,<2.0a0
- - icu >=78.3,<79.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libzlib >=1.3.2,<2.0a0
- - c-ares >=1.34.6,<2.0a0
- - libnghttp2 >=1.68.1,<2.0a0
- - zstd >=1.5.7,<1.6.0a0
- - libbrotlicommon >=1.2.0,<1.3.0a0
- - libbrotlienc >=1.2.0,<1.3.0a0
- - libbrotlidec >=1.2.0,<1.3.0a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - nodejs >=26.3.0,<27.0a0
- size: 19368887
- timestamp: 1780383096658
-- conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py311h7fce02c_1.conda
- sha256: 5196c330f8c20ac465627504718dc11f78a52d6beaaabafa77c7583d8ae8cf82
- md5: 801327e8542545ab784f7e804750906d
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - libopenblas !=0.3.6
- - scipy >=1.0
- - cudatoolkit >=11.2
- - cuda-python >=11.6
- - tbb >=2021.6.0
- - cuda-version >=11.2
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5874549
- timestamp: 1778391271840
-- conda: https://prefix.dev/conda-forge/osx-64/numba-0.65.1-py314h34b395f_1.conda
- sha256: 6ddfd37869aaca05a1154a55a88c64e509b1bee2272e609d6caccae42cce070b
- md5: af9134924a0f620b0e80cf339b8abaed
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - cudatoolkit >=11.2
- - scipy >=1.0
- - cuda-version >=11.2
- - tbb >=2021.6.0
- - cuda-python >=11.6
- - libopenblas !=0.3.6
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5788064
- timestamp: 1778390801185
-- conda: https://prefix.dev/conda-forge/osx-64/numpy-1.24.1-py311ha9d2c9f_0.conda
- sha256: 3f91712db3d2d0f3777ff37f03b7dca97cbb195c0e54d3eac2af7dab2af96ff9
- md5: 8951fe510de522f3431ef6c4a0f1ef16
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=14.0.6
- - liblapack >=3.9.0,<4.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.24.1,<2.0a0
- size: 7480854
- timestamp: 1675039798292
-- conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.2-py313h210eedd_1.conda
- sha256: 7fa419933516121c1334ed2c5e2c15851298d42a00f449c249733ea32e76cbc9
- md5: d3b1769ef9208e5945c4d25c473f5f9f
- depends:
- - python
- - libcxx >=19
- - __osx >=10.13
- - libcblas >=3.9.0,<4.0a0
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.13.* *_cp313t
- - liblapack >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 8167526
- timestamp: 1770098367976
-- conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py311h2c4eb96_0.conda
- sha256: 47fa3ad9a49348efb5662d7850a433607ee4fabf259709731437a969c3006fa9
- md5: 0cb49ff5e81a76c101f1a561cf1f2a76
- depends:
- - python
- - __osx >=11.0
- - libcxx >=19
- - liblapack >=3.9.0,<4.0a0
- - python_abi 3.11.* *_cp311
- - libcblas >=3.9.0,<4.0a0
- - libblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 8593034
- timestamp: 1779169256521
-- conda: https://prefix.dev/conda-forge/osx-64/numpy-2.4.6-py314h7b24d9b_0.conda
- sha256: 8127ecc9ffbb291830cd6849a8e4f8d9027b130672d277c9444b1d36949f0a38
- md5: e04ed878a4f06bb20201dabf7a25f9ee
- depends:
- - python
- - libcxx >=19
- - __osx >=11.0
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- - liblapack >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 8155498
- timestamp: 1779169315894
-- conda: https://prefix.dev/conda-forge/osx-64/onednn-3.12-omp_h71bb16d_0.conda
- sha256: 7f94878f1e3d0a75069572dd973288c215ea0d9483d4cc5460e1ebca14bff88f
- md5: cb22a3b4ae3827fe294e8e6ab3a93a5e
- depends:
- - libcxx >=19
- - __osx >=11.0
- - llvm-openmp >=19.1.7
- license: Apache-2.0
- license_family: APACHE
- run_exports:
- weak:
- - onednn >=3.12,<4.0a0
- size: 10610678
- timestamp: 1779566201040
-- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- sha256: 819d4368d6b5b298fa40d4bc836c1250842489002cacf3fb918a13ee2033b7c6
- md5: 46be42ab403712fd349d007d763bf767
- depends:
- - __osx >=11.0
- - ca-certificates
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - openssl >=3.6.3,<4.0a0
- size: 2775300
- timestamp: 1781071391999
-- conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py311hd8befaf_0.conda
- sha256: 2b0c746adc067a25dd8734a4d1be6a78205a319d3f52de61d15a16fb49a31ee7
- md5: 37796596797c5161ff14e942189f0886
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - typing-extensions >=4.6
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 454118
- timestamp: 1778048366112
-- conda: https://prefix.dev/conda-forge/osx-64/optree-0.19.1-py314h0963f2d_0.conda
- sha256: fc44e992e12cc7e98f65e78d54a9a3943e34eec71ced7517376ad4db50fde83d
- md5: 55707dfa3211171f27dcb8cd42a75f0e
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - typing-extensions >=4.12
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 479713
- timestamp: 1778048360177
-- conda: https://prefix.dev/conda-forge/osx-64/psutil-7.2.2-py314hd330473_0.conda
- sha256: 3194ce0d94c810cb1809da851261be34e1cae72ca345445b29e61766b38ee6cc
- md5: d465805e603072c341554159939be5b8
- depends:
- - python
- - __osx >=10.13
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 242816
- timestamp: 1769678225798
-- conda: https://prefix.dev/conda-forge/osx-64/pyrefly-1.0.0-he97e7a4_0.conda
- sha256: dffca5399aecee7b87771114e4696a2a51829a2dc38b0a97d8f8f997c32c9d16
- md5: 2e4c1f8e1ae2dbeae1ff1c4b5bd30447
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 10907035
- timestamp: 1778629381545
-- conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda
- sha256: e02e12cd8d391f18bb3bf91d07e16b993592ec0d76ee37cf639390b766e0e687
- md5: 93b802a91de90b2c17b808608726bf45
- 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.11.* *_cp311
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.11.* *_cp311
- noarch:
- - python
- size: 15664115
- timestamp: 1772730794934
-- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.13-h4fb2cf0_0_cp313t.conda
- sha256: 75695af2aed590b6041d582d4d431f4f39e3aa25ddc2e13f4fd87fd5610a3b74
- md5: 08f4a911eceb0106de0324c533ddce1b
- depends:
- - __osx >=11.0
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.7.5,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.52.0,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.5,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.13.* *_cp313t
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- track_features:
- - py_freethreading
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.13.* *_cp313t
- noarch:
- - python
- size: 19273067
- timestamp: 1775616143920
- python_site_packages_path: lib/python3.13t/site-packages
-- conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- build_number: 100
- sha256: f99fd77c51d52319f02b7732971b35921a987ac49ca9b60f9c2e280b0dcdd409
- md5: 915728f929ae3610f084aecdf62f5272
- depends:
- - __osx >=11.0
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.8.0,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.3,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.6,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.14.* *_cp314
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.14.* *_cp314
- noarch:
- - python
- size: 14450441
- timestamp: 1779239702259
- python_site_packages_path: lib/python3.14/site-packages
-- conda: https://prefix.dev/conda-forge/osx-64/python-librt-0.11.0-py314h0b69929_0.conda
- sha256: 30c0075e2fc9e497a6890c4e89ca1dfb8ecb69d8c275adf2ebaddbd775625157
- md5: 780beb8582ad71036a41cd3407910bc8
- depends:
- - python
- - __osx >=11.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 129137
- timestamp: 1778511932441
-- conda: https://prefix.dev/conda-forge/osx-64/pytokens-0.4.1-py314h0b69929_2.conda
- sha256: fe04b2b8a9d7e80626b91a5d7d2b51d43ed8437f7fee6639ff5358f0b0247a8f
- md5: 5972b56b3ca9240b71f13cc0f3bb0efd
- depends:
- - python
- - __osx >=11.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 175471
- timestamp: 1778689083720
-- conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py311_h1a2d5a6_101.conda
- sha256: 94330327751a0c08b0e7f8c894409e440f3dcba1fb9e9d41115369d130132e9a
- md5: d167c9f89fe0fb1bc5a5fcf1045dbb74
- depends:
- - __osx >=11.0
- - filelock
- - fmt >=12.1.0,<12.2.0a0
- - fsspec
- - jinja2
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=19
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cpu_mkl_hf457987_101
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - mkl >=2023.2.0,<2024.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 24098330
- timestamp: 1781056448900
-- conda: https://prefix.dev/conda-forge/osx-64/pytorch-2.11.0-cpu_mkl_py314_h02f7b3f_101.conda
- sha256: f369c6ff7132250fa6d912f7dc112dda6f78a1ecdd909d82f724de03513bc564
- md5: 03ea179194cca9dd3449d2611623773b
- depends:
- - __osx >=11.0
- - filelock
- - fmt >=12.1.0,<12.2.0a0
- - fsspec
- - jinja2
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=19
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cpu_mkl_hf457987_101
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - mkl >=2023.2.0,<2024.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 25000517
- timestamp: 1781056713085
-- conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py311h53ebfaf_1.conda
- sha256: db6ce0be1a9e0e57d829e6522ba932643fadd9e5238875ff299925246a01b6b2
- md5: 398a9df67c68780701415da829315730
- depends:
- - __osx >=10.13
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 194735
- timestamp: 1770223769285
-- conda: https://prefix.dev/conda-forge/osx-64/pyyaml-6.0.3-py314h10d0514_1.conda
- sha256: aef010899d642b24de6ccda3bc49ef008f8fddf7bad15ebce9bdebeae19a4599
- md5: ebd224b733573c50d2bfbeacb5449417
- depends:
- - __osx >=10.13
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 191947
- timestamp: 1770226344240
-- conda: https://prefix.dev/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda
- sha256: 1aeb9a9554cc719d454ad6158afbb0c249973fa4ee1d782d7e40cbec1de9b061
- md5: b2cc31f114e4487d24e5617e62a24017
- depends:
- - libre2-11 2025.11.05 h6e8c311_1
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- - re2
- size: 27447
- timestamp: 1768190352348
-- conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5
- md5: eefd65452dfe7cce476a519bece46704
- depends:
- - __osx >=10.13
- - ncurses >=6.5,<7.0a0
- license: GPL-3.0-only
- license_family: GPL
- run_exports:
- weak:
- - readline >=8.3,<9.0a0
- size: 317819
- timestamp: 1765813692798
-- conda: https://prefix.dev/conda-forge/osx-64/ruff-0.15.16-h1ddadc8_0.conda
- noarch: python
- sha256: 694b662dd988bda4168b54fe7313b9cc0378215d796e38d7f3e3b22a211e2e27
- md5: da82dbe7191b3de371645a43579bd427
- depends:
- - python
- - __osx >=11.0
- constrains:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 9247784
- timestamp: 1780612065116
-- conda: https://prefix.dev/conda-forge/osx-64/scipy-1.15.2-py311h0c91ca8_0.conda
- sha256: 796252d7772df42edd29a45ae70eb18843a7e476d42c96c273cd6e677ec148c8
- md5: 58c17d411ed0cd1220ed3e824a3efc82
- depends:
- - __osx >=10.13
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=18
- - libgfortran >=5
- - libgfortran5 >=13.2.0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.5
- - numpy >=1.19,<3
- - numpy >=1.23.5
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15759628
- timestamp: 1739792317052
-- conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py311h556693a_1.conda
- sha256: 4e68affca9e1d14cdb1fe6910c459ec4bd01b1217a867f7cfbf40830951f80aa
- md5: 972007d34efaf5755603391a91e7d50f
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15513987
- timestamp: 1779875850168
-- conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py313habc7bd5_0.conda
- sha256: 8abeb45a97e8300e39846e931b7d4a01ad8c85ffa3a3f4a319397875fad3914a
- md5: 1d5fedd4e2126df7ba1e8182ba74e72a
- 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.13,<3.14.0a0
- - python_abi 3.13.* *_cp313t
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15627768
- timestamp: 1771881574707
-- conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_1.conda
- sha256: a252c61411227f8677b812f9f24bb7e3afde744a8a6183211b3c63a0dff9e375
- md5: 61e649e36316f3224362981421ff9ca0
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15624049
- timestamp: 1779875471270
-- conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda
- sha256: 7b6749d48be1cea8e4191141b35fe667f776e0b0972d7cf286b276c9bbb57d9d
- md5: 97fc81ba1dc812fb37000fe39afa3bf8
- depends:
- - __osx >=10.13
- - libcxx >=19
- - llvm-openmp >=19.1.7
- license: BSL-1.0
- run_exports:
- weak:
- - sleef >=3.9.0,<4.0a0
- size: 1484394
- timestamp: 1756274644799
-- conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda
- sha256: 7585c40ffd1b2346f31fd857a9882a4e5558e35d3f63640d925fe50a80bf06d6
- md5: b781a4099393cffae4835ab4c07e664a
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libhwloc >=2.13.0,<2.13.1.0a0
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 155642
- timestamp: 1778663708907
-- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b
- md5: 6e6efb7463f8cef69dbcb4c2205bf60e
- depends:
- - __osx >=10.13
- - libzlib >=1.3.1,<2.0a0
- license: TCL
- license_family: BSD
- run_exports:
- weak:
- - tk >=8.6.13,<8.7.0a0
- size: 3282953
- timestamp: 1769460532442
-- conda: https://prefix.dev/conda-forge/osx-64/typos-1.47.2-h19f9e61_0.conda
- sha256: b6307b3bbe978c6192d1ab6487c9cdd2a56e3371d16a4fadaf5fd4b4f9a0bd74
- md5: 6d67a8ed49de9eab035332711db3f029
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT OR Apache-2.0
- run_exports: {}
- size: 2855972
- timestamp: 1780547432902
-- conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- sha256: 19d0eccb1300e9a75fad33019d25895218d07654ebf9c738fc6c4b3c0f8b8fe4
- md5: 898a8a108c903f3e672bb2e67f4a2757
- depends:
- - libcxx >=19
- - __osx >=11.0
- constrains:
- - __osx >=10.13
- license: Apache-2.0 OR MIT
- run_exports: {}
- size: 18063082
- timestamp: 1780539286090
-- conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda
- sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9
- md5: a645bb90997d3fc2aea0adf6517059bd
- depends:
- - __osx >=10.13
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - yaml >=0.2.5,<0.3.0a0
- size: 79419
- timestamp: 1753484072608
-- conda: https://prefix.dev/conda-forge/osx-64/zizmor-1.25.2-h19f9e61_0.conda
- sha256: a014fe05d31066e8ff71b5ac1034fa609f2d0e109b62efcf8aec7b6455ce2c86
- md5: d823c83d7c52ff3d86d39c8401254354
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 6956979
- timestamp: 1778922249562
-- conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
- sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f
- md5: 727109b184d680772e3122f40136d5ca
- depends:
- - __osx >=10.13
- - libzlib >=1.3.1,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - zstd >=1.5.7,<1.6.0a0
- size: 528148
- timestamp: 1764777156963
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - _openmp_mutex >=4.5
- size: 8325
- timestamp: 1764092507920
-- conda: https://prefix.dev/conda-forge/osx-arm64/actionlint-1.7.12-h7969508_0.conda
- sha256: 94a8c69857d5365990f8231a901ea102736694546497cc674962e97b3e8d8d96
- md5: 87084addab359d538cbf8493726cf3f8
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 1855795
- timestamp: 1774975876774
-- conda: https://prefix.dev/conda-forge/osx-arm64/ast-serialize-0.5.0-py310h3b8a9b8_1.conda
- noarch: python
- sha256: 6c6e47ef2a85e7ade5c94d2388f43bd8197129e6b6305f9e8a49380b7dfbc427
- md5: 480f5277fd3ed13ea6ea8b5d74563815
- depends:
- - python >=3.10
- - __osx >=11.0
- - _python_abi3_support 1.*
- - cpython >=3.10
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 1086020
- timestamp: 1780396657560
-- conda: https://prefix.dev/conda-forge/osx-arm64/astroid-4.0.4-py314h4dc9dd8_0.conda
- sha256: d9a6527801edbe508ab190dec32e418d6e8d9e3136471a50b7c3e2b0201a863b
- md5: 8223f3301e1375477b8cad2cc625b514
- depends:
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: LGPL-2.1-or-later
- license_family: LGPL
- run_exports: {}
- size: 543878
- timestamp: 1770634916288
-- conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda
- sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99
- md5: f9501812fe7c66b6548c7fcaa1c1f252
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- constrains:
- - libbrotlicommon 1.2.0 hc919400_1
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 359854
- timestamp: 1764018178608
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - bzip2 >=1.0.8,<2.0a0
- size: 124834
- timestamp: 1771350416561
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - c-ares >=1.34.6,<2.0a0
- size: 180327
- timestamp: 1765215064054
-- conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py311hc290fe0_0.conda
- sha256: d9475f473084602003da38e373604b48b674b5fbd5939eb6f26b757cbda89f28
- md5: 2e3107762a2b8bb31093fe14bab1fe17
- depends:
- - __osx >=11.0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 397978
- timestamp: 1779838426505
-- conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.1-py314h6e9b3f0_0.conda
- sha256: b2c5285cf2610bf98d0df3c1474beb2e706d2d75b2ae4b1cd7f7f22ef6932c3a
- md5: 75074919bec101f674e64b0c00a8aa7c
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - tomli
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 412237
- timestamp: 1779838737834
-- conda: https://prefix.dev/conda-forge/osx-arm64/dprint-0.50.0-h8dba533_0.conda
- sha256: 6a2de866896d638c8d437f281568d272ea2726edb93556075b6145aafbe6f749
- md5: 483a7eea67dc9053c3f3e332db34e016
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 5466628
- timestamp: 1747623425492
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - flatbuffers >=25.9.23,<25.9.24.0a0
- size: 1299156
- timestamp: 1761143339517
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - fmt >=12.1.0,<12.2.0a0
- size: 180970
- timestamp: 1767681372955
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - gmp >=6.3.0,<7.0a0
- size: 365188
- timestamp: 1718981343258
-- conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py311hafb79fe_1.conda
- sha256: 8790aa5587297e95c16b2bfe48c784ac2e4f65119a413b6d85ac3255f47b8311
- md5: 7de4a076c4a7e6b8fdd5de85c4c027eb
- depends:
- - __osx >=11.0
- - gmp >=6.3.0,<7.0a0
- - mpc >=1.3.1,<2.0a0
- - mpfr >=4.2.1,<5.0a0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 189754
- timestamp: 1773245544660
-- conda: https://prefix.dev/conda-forge/osx-arm64/gmpy2-2.3.0-py314hf9f5e1b_1.conda
- sha256: 1cc805249850208d4e1de8beb17c58aa116fc518ca1b075285b403dbc1c002c9
- md5: 036584b863246f278f4057327c36a94d
- depends:
- - __osx >=11.0
- - gmp >=6.3.0,<7.0a0
- - mpc >=1.3.1,<2.0a0
- - mpfr >=4.2.1,<5.0a0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- license: LGPL-3.0-or-later
- license_family: LGPL
- run_exports: {}
- size: 195457
- timestamp: 1773245350476
-- conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5
- md5: f1182c91c0de31a7abd40cedf6a5ebef
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - icu >=78.3,<79.0a0
- size: 12361647
- timestamp: 1773822915649
-- conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py311h001ef46_0.conda
- sha256: 63b5f7fc7655e1ff8726bd5884fb734d8af787dec7cf97b74e1bdf740b56a788
- md5: 80a5b5430038ddd202caa0e536401e1b
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - __osx >=11.0
- - libcxx >=20
- - libgrpc >=1.78.1,<1.79.0a0
- - python_abi 3.11.* *_cp311
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - libre2-11 >=2025.11.5
- - re2
- - numpy >=1.23,<3
- - libzlib >=1.3.2,<2.0a0
- - openssl >=3.5.5,<4.0a0
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 70113260
- timestamp: 1774537066701
-- conda: https://prefix.dev/conda-forge/osx-arm64/jaxlib-0.9.2-cpu_py314h2543417_0.conda
- sha256: b61b63c923d1ffece64afc47021338ea5c39b49785bfaae6712db1a206cc0572
- md5: 5ff635ba743fd1965e4adf930a69aebd
- depends:
- - python
- - scipy >=1.9
- - ml_dtypes >=0.2.0
- - __osx >=11.0
- - libcxx >=20
- - libgrpc >=1.78.1,<1.79.0a0
- - libzlib >=1.3.2,<2.0a0
- - numpy >=1.23,<3
- - python_abi 3.14.* *_cp314
- - openssl >=3.5.5,<4.0a0
- - flatbuffers >=25.9.23,<25.9.24.0a0
- - libre2-11 >=2025.11.5
- - re2
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- constrains:
- - jax >=0.9.2
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 70221704
- timestamp: 1774537048119
-- conda: https://prefix.dev/conda-forge/osx-arm64/lefthook-2.1.9-hf76c51c_0.conda
- sha256: ab527c8cf93f6c8a5d25ca8f9d8b78036041cafd0119e1537912d4a746ce8618
- md5: a95f74a6ba10e92ca906775a0c697233
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 4946650
- timestamp: 1780061235406
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil =*=cxx17*
- size: 1229639
- timestamp: 1770863511331
-- conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda
- build_number: 8
- sha256: 8f5ec18ead0619a9cf0f38b49796c22f6fc0f44850c0df2baea0f5277db16e75
- md5: dbfe729181a32741ae63ecb41eefbac6
- depends:
- - libopenblas >=0.3.33,<0.3.34.0a0
- - libopenblas >=0.3.33,<1.0a0
- constrains:
- - blas 2.308 openblas
- - liblapack 3.11.0 8*_openblas
- - liblapacke 3.11.0 8*_openblas
- - libcblas 3.11.0 8*_openblas
- - mkl <2027
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.11.0,<4.0a0
- size: 18949
- timestamp: 1779859141315
-- conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
- sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229
- md5: 006e7ddd8a110771134fcc4e1e3a6ffa
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libbrotlicommon >=1.2.0,<1.3.0a0
- size: 79443
- timestamp: 1764017945924
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libbrotlidec >=1.2.0,<1.3.0a0
- size: 29452
- timestamp: 1764017979099
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libbrotlienc >=1.2.0,<1.3.0a0
- size: 290754
- timestamp: 1764018009077
-- conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda
- build_number: 8
- sha256: f93efcd44bc24f97c2478c7474d3baa6801a057974f330e1d06bedc33e4c778f
- md5: 03a2ef3491da9e5b4d18c03e9f4b3109
- depends:
- - libblas 3.11.0 8_h51639a9_openblas
- constrains:
- - blas 2.308 openblas
- - liblapack 3.11.0 8*_openblas
- - liblapacke 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.11.0,<4.0a0
- size: 18911
- timestamp: 1779859147634
-- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- sha256: cceb668dc1b71f054b1036dd83eca2e02c0c3a4b2ba3ad28c74a982d819597a3
- md5: 0325fbe13eb6dd39234eb305ac1b3cb8
- depends:
- - __osx >=11.0
- license: Apache-2.0 WITH LLVM-exception
- license_family: Apache
- run_exports: {}
- size: 568252
- timestamp: 1780441702930
-- conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda
- sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f
- md5: 36d33e440c31857372a72137f78bacf5
- license: BSD-2-Clause
- license_family: BSD
- run_exports:
- weak:
- - libev >=4.33,<4.34.0a0
- size: 107458
- timestamp: 1702146414478
-- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- sha256: 3133fb6bfa871288b92c8b8752696686a841bf4ffe035aa3038033c9e15b738e
- md5: ef22e9ab1dc7c2f334252f565f90b3b8
- depends:
- - __osx >=11.0
- constrains:
- - expat 2.8.1.*
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 69110
- timestamp: 1779278728511
-- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7
- md5: 43c04d9cb46ef176bb2a4c77e324d599
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libffi >=3.5.2,<3.6.0a0
- size: 40979
- timestamp: 1769456747661
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 404080
- timestamp: 1778273064154
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 139675
- timestamp: 1778273280875
-- conda: https://prefix.dev/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
- run_exports: {}
- size: 599691
- timestamp: 1778273075448
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libgrpc >=1.78.1,<1.79.0a0
- size: 4820402
- timestamp: 1774012715207
-- conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda
- build_number: 8
- sha256: 8a076fe82142a00fe85f5a5a5351e286e8064f0100fe13608d19182cd0018c25
- md5: 85adeb3d469d082dbd9c8c39e36dec57
- depends:
- - libblas 3.11.0 8_h51639a9_openblas
- constrains:
- - libcblas 3.11.0 8*_openblas
- - blas 2.308 openblas
- - liblapacke 3.11.0 8*_openblas
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.11.0,<3.12.0a0
- size: 18925
- timestamp: 1779859153970
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - liblzma >=5.8.3,<6.0a0
- size: 92472
- timestamp: 1775825802659
-- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2
- md5: 57c4be259f5e0b99a5983799a228ae55
- depends:
- - __osx >=11.0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 73690
- timestamp: 1769482560514
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libnghttp2 >=1.68.1,<2.0a0
- size: 576526
- timestamp: 1773854624224
-- conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda
- sha256: 9dd455b2d172aeedfa2058d324b5b5822b0bc1b7c1f32cd183d7078540d2f6eb
- md5: 909e41855c29f0d52ae630198cd57135
- depends:
- - __osx >=11.0
- - libgfortran
- - libgfortran5 >=14.3.0
- - llvm-openmp >=19.1.7
- constrains:
- - openblas >=0.3.33,<0.3.34.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libopenblas >=0.3.33,<1.0a0
- size: 4304965
- timestamp: 1776995497368
-- conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-6.33.5-h2d4b707_1.conda
- sha256: 416c2244999d678dc9a4d8c3472336f8f754676125605399cf6e43956fa3d18b
- md5: 300fdae9d7ad150a90755f55b0a8a7a8
- depends:
- - __osx >=11.0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libprotobuf >=6.33.5,<6.33.6.0a0
- size: 2768714
- timestamp: 1780004273744
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- size: 165851
- timestamp: 1768190225157
-- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- sha256: 862463917e8ef5ac3ebdaf8f19914634b457609cc27ba678b7197124cefeb1f7
- md5: 1ebde5c677f00765233a17e278571177
- depends:
- - __osx >=11.0
- - icu >=78.3,<79.0a0
- - libzlib >=1.3.2,<2.0a0
- license: blessing
- run_exports:
- weak:
- - libsqlite >=3.53.2,<4.0a0
- size: 927724
- timestamp: 1780575223548
-- conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.11.0-cpu_generic_h5d695db_1.conda
- sha256: 601210025fd76a34315a64be19060964be12daeb7244a2e64ba828e688ddaea3
- md5: eebb0d00a32b80884d5dc7c21d46c171
- 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.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- constrains:
- - openblas * openmp_*
- - libopenblas * openmp_*
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- - pytorch 2.11.0 cpu_generic_*_1
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 32161219
- timestamp: 1781055492193
-- conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_0.conda
- sha256: e23176af832f637693ebbb9bbe7d29c0f4cba662dabd001081d2aa6fc9f7f661
- md5: fa9fef7d9f33724b7c3899c883c25a3e
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libuv >=1.52.1,<2.0a0
- size: 122732
- timestamp: 1779396113397
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libzlib >=1.3.2,<2.0a0
- size: 47759
- timestamp: 1774072956767
-- conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.7-hc7d1edf_0.conda
- sha256: 6bf27376f11198c01a88a1c8234470f45bce0aa7502b7e7988ef03ef5db3a890
- md5: 7c6a5897a8bc5b6d509a4ee9dec7fcc8
- depends:
- - __osx >=11.0
- constrains:
- - openmp 22.1.7|22.1.7.*
- - intel-openmp <0.0a0
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- run_exports:
- strong:
- - llvm-openmp >=22.1.7
- size: 285162
- timestamp: 1780455637760
-- conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py311h5d75059_1.conda
- sha256: 298c1f0dfe73597151c096cb0236f45983417ad19a0d3ccb499275aa317c0508
- md5: ff3d1a153d2976bc1db54ae865d2ab7e
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 24337010
- timestamp: 1776077615199
-- conda: https://prefix.dev/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda
- sha256: 54dbf3a5acc8eb4d0902345145bdf0a658a3ac118ab3d10424c899fb899cda46
- md5: c555bb3e65064bf7807d0419eb0ae120
- depends:
- - __osx >=11.0
- - libcxx >=19
- - libzlib >=1.3.2,<2.0a0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 24327499
- timestamp: 1776077303342
-- conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py311hc290fe0_1.conda
- sha256: d635f2b1d9e19e8e68c5d33150f7e4f62df08ef2ef0e85977f743e81939afc01
- md5: ff068874356bbc7f9bd2d793f809f44b
- depends:
- - __osx >=11.0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 26511
- timestamp: 1772445369187
-- conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda
- sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f
- md5: d33c0a15882b70255abdd54711b06a45
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 27256
- timestamp: 1772445397216
-- conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py311hb7ce6e1_1.conda
- sha256: d71365cdb660fe80cde6572482de85eaa499faa0ddb08d5e7bd5d8c384c88382
- md5: fa76b2aaefadfc2e4908689a351f158a
- depends:
- - python
- - __osx >=11.0
- - python 3.11.* *_cpython
- - libcxx >=19
- - numpy >=1.23,<3
- - python_abi 3.11.* *_cp311
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 242654
- timestamp: 1771362416807
-- conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.4-np2py314hdd732f0_1.conda
- sha256: 8eca1e3f5ee34039302e3695b202b222d2648d111324bd6e7f7972daabbf39cb
- md5: 9b9a9e1c375f1e26c15db657553ccfc1
- depends:
- - python
- - python 3.14.* *_cp314
- - __osx >=11.0
- - libcxx >=19
- - python_abi 3.14.* *_cp314
- - numpy >=1.23,<3
- license: MPL-2.0 AND Apache-2.0
- run_exports: {}
- size: 244117
- timestamp: 1771362366075
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - mpc >=1.4.0,<2.0a0
- size: 86181
- timestamp: 1774472395307
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - mpfr >=4.2.2,<5.0a0
- size: 348767
- timestamp: 1773414111071
-- conda: https://prefix.dev/conda-forge/osx-arm64/mypy-2.1.0-py314h2fbedac_0.conda
- sha256: d205dc89fa338ca312ed54864ca377e9a52e4273509370c3678503115c95eb05
- md5: 54f38ddefd5fbd675bc9ff69d7a31fd7
- depends:
- - ast-serialize >=0.3.0,<1.0.0
- - mypy_extensions >=1.0.0
- - pathspec >=1.0.0
- - python
- - python-librt >=0.11.0
- - typing_extensions >=4.6.0
- - psutil >=4.0
- - __osx >=11.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 13520137
- timestamp: 1780315680928
-- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d
- md5: 343d10ed5b44030a2f67193905aea159
- depends:
- - __osx >=11.0
- license: X11 AND BSD-3-Clause
- run_exports:
- weak:
- - ncurses >=6.6,<7.0a0
- size: 805509
- timestamp: 1777423252320
-- conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- sha256: 18d33c17b28d4771fc0b91b7b963c9ce31aca0a9af7dc8e9ee7c974bb207192c
- md5: 175809cc57b2c67f27a0f238bd7f069d
- depends:
- - __osx >=11.0
- - libcxx >=19
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 164450
- timestamp: 1763688228613
-- conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-26.3.0-h7039424_0.conda
- sha256: 0a2c7c1d2d0f99686c183cc132b265130b92d371fd95b14f383509a0e1966485
- md5: acf34c628b82bbcff7ec879c93135034
- depends:
- - libcxx >=19
- - __osx >=11.0
- - openssl >=3.5.6,<4.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libbrotlicommon >=1.2.0,<1.3.0a0
- - libbrotlienc >=1.2.0,<1.3.0a0
- - libbrotlidec >=1.2.0,<1.3.0a0
- - zstd >=1.5.7,<1.6.0a0
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil * cxx17*
- - icu >=78.3,<79.0a0
- - libnghttp2 >=1.68.1,<2.0a0
- - libuv >=1.52.1,<2.0a0
- - c-ares >=1.34.6,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - nodejs >=26.3.0,<27.0a0
- size: 18027748
- timestamp: 1780383044420
-- conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py311h7b83a5e_1.conda
- sha256: b082505b6f2fa36a25270ba87d4e4c9561e4b3ef939c966f26bf7aa3b56d6011
- md5: aae529234a27ef6a18ed5f39a1e11ee7
- 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.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- constrains:
- - scipy >=1.0
- - cudatoolkit >=11.2
- - tbb >=2021.6.0
- - libopenblas >=0.3.18,!=0.3.20
- - cuda-version >=11.2
- - cuda-python >=11.6
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5846951
- timestamp: 1778391006908
-- conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda
- sha256: 86ab4c3273761dec812c198fcb658c3b8f86b39bb0a3b409a62baff9f19db927
- md5: 606140802769e37d32f5e83a485e5a4b
- 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.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- constrains:
- - cudatoolkit >=11.2
- - libopenblas >=0.3.18,!=0.3.20
- - tbb >=2021.6.0
- - cuda-version >=11.2
- - cuda-python >=11.6
- - scipy >=1.0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5766480
- timestamp: 1778390893034
-- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-1.24.1-py311h60f8152_0.conda
- sha256: dd03389688d6cfc5697bbff373ef4180108f023be84bbe2aac9898d74defa909
- md5: d9008ba75019bb0cfaedc91f4ae71593
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=14.0.6
- - liblapack >=3.9.0,<4.0a0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.24.1,<2.0a0
- size: 6722898
- timestamp: 1675039517668
-- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.2-py313hbb1b99b_1.conda
- sha256: f42633cbebfd7e98159dc1165c14350fa3daf0eb01f0c07bf116163f48eb6459
- md5: 51f9950de708519da8d742e386b3a20a
- depends:
- - python
- - python 3.13.* *_cp313t
- - libcxx >=19
- - __osx >=11.0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.13.* *_cp313t
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 6999236
- timestamp: 1770098383690
-- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py311hbd1492f_0.conda
- sha256: 08e5062ab9bce23adef1c62282a99d035780e43eb8a843b0f11d8a1e967fe123
- md5: 7738446d4be7ac8b56e6d6e3bdb7e52b
- depends:
- - python
- - libcxx >=19
- - __osx >=11.0
- - python_abi 3.11.* *_cp311
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 7456206
- timestamp: 1779169211856
-- conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda
- sha256: 538064b78042cd2751664f00c6255ecce81b38e9fa6dd9c1863327e6c759ed4a
- md5: e64e47cb372d92e3425816a2918f4605
- depends:
- - python
- - __osx >=11.0
- - libcxx >=19
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- - liblapack >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 6995531
- timestamp: 1779169217034
-- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb
- md5: 8187a86242741725bfa74785fe812979
- depends:
- - __osx >=11.0
- - ca-certificates
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - openssl >=3.6.3,<4.0a0
- size: 3102584
- timestamp: 1781069820667
-- conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py311h572238d_0.conda
- sha256: 3f0ce5b2bf6ade23ac8725e75bcfd401b91f2fb480ab0ff6a09cdfa4a8c376f7
- md5: ecbec8f85d20eaa495938fa32ad49442
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- - typing-extensions >=4.6
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 431558
- timestamp: 1778048194926
-- conda: https://prefix.dev/conda-forge/osx-arm64/optree-0.19.1-py314h6cfcd04_0.conda
- sha256: ffbe7394fd53d7c50cb81cab45e62c2678f03847853dfec26229ec2d0c7bfd58
- md5: 7f58db69263708a3bd66bb7e547bf0a7
- depends:
- - __osx >=11.0
- - libcxx >=19
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - typing-extensions >=4.12
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 456292
- timestamp: 1778048175820
-- conda: https://prefix.dev/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda
- sha256: e0f31c053eb11803d63860c213b2b1b57db36734f5f84a3833606f7c91fedff9
- md5: fc4c7ab223873eee32080d51600ce7e7
- depends:
- - python
- - __osx >=11.0
- - python 3.14.* *_cp314
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 245502
- timestamp: 1769678303655
-- conda: https://prefix.dev/conda-forge/osx-arm64/pyrefly-1.0.0-h4dd0d4f_0.conda
- sha256: 34dd964342267b5d93674eefe37055b8915943de60d43b4e36a08b9642319f46
- md5: b0b2e5d34dba70dfad3955a59e611b46
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 10330096
- timestamp: 1778629356792
-- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda
- sha256: 9a846065863925b2562126a5c6fecd7a972e84aaa4de9e686ad3715ca506acfa
- md5: 49c7d96c58b969585cf09fb01d74e08e
- 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.11.* *_cp311
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.11.* *_cp311
- noarch:
- - python
- size: 14753109
- timestamp: 1772730203101
-- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.13-h76e3b2d_0_cp313t.conda
- sha256: 352f44de533f1d5553ad5981e0b52a8ec1c16ab687f44215f73210b8179ebe33
- md5: 27efe49e0f517d0767604ed5cdfbb163
- depends:
- - __osx >=11.0
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.7.5,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.52.0,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.5,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.13.* *_cp313t
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- track_features:
- - py_freethreading
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.13.* *_cp313t
- noarch:
- - python
- size: 14803095
- timestamp: 1775615401305
- python_site_packages_path: lib/python3.13t/site-packages
-- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- build_number: 100
- sha256: 06dec0e2f50e2f7e6a8808fcb4aff23729a3f23bcb1fca4fcbc3a341d9e38a83
- md5: f7331c9deaf21c79e5675e72b21d570b
- depends:
- - __osx >=11.0
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.8.0,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.3,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - ncurses >=6.6,<7.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.14.* *_cp314
- - readline >=8.3,<9.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.14.* *_cp314
- noarch:
- - python
- size: 13560854
- timestamp: 1779238292621
- python_site_packages_path: lib/python3.14/site-packages
-- conda: https://prefix.dev/conda-forge/osx-arm64/python-librt-0.11.0-py314ha14b1ff_0.conda
- sha256: 483c34d3224b1d8209206d5eba7b0f36f33a891908eec46d12a7a621d0a39001
- md5: 68be11fb4ea06efd0e13db21921afe56
- depends:
- - python
- - __osx >=11.0
- - python 3.14.* *_cp314
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 129714
- timestamp: 1778511905677
-- conda: https://prefix.dev/conda-forge/osx-arm64/pytokens-0.4.1-py314ha14b1ff_2.conda
- sha256: 37d76254955eaa47df534ae8f3890c45f28aa4a8479597ff6fbacbd5a23810e6
- md5: 45bfaa1961db6ace6fc35561ba893fae
- depends:
- - python
- - __osx >=11.0
- - python 3.14.* *_cp314
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 175381
- timestamp: 1778689065100
-- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py311_hbaf2b46_1.conda
- sha256: cbe52e92154c333447ca3eadf06fd87490b77c288a78a1f75f0f4bffa0a67ae7
- md5: 2a080384ee132d26c6fa5a0509dd161d
- 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.11.0 cpu_generic_h5d695db_1
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - networkx
- - nomkl
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-gpu <0.0a0
- - pytorch-cpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 23618616
- timestamp: 1781056513561
-- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.11.0-cpu_generic_py314_h30a3122_1.conda
- sha256: 20bc8b9d29c2e94f68797efc7d51a71dbf44f2b3c8a22598762b7b1c8663426e
- md5: ce8f0222dae46feea09d10c9773aa9b6
- 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.11.0 cpu_generic_h5d695db_1
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=19.1.7
- - networkx
- - nomkl
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- constrains:
- - pytorch-gpu <0.0a0
- - pytorch-cpu 2.11.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 24467518
- timestamp: 1781055770895
-- conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py311hc290fe0_1.conda
- sha256: 984e73d7957460689e10533059de8adb38a308853d298900a37acc58edd84cec
- md5: e4b908da7cd496b3fa6798c0f60a2a19
- depends:
- - __osx >=11.0
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 192948
- timestamp: 1770223655988
-- conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda
- sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252
- md5: dcf51e564317816cb8d546891019b3ab
- depends:
- - __osx >=11.0
- - python >=3.14,<3.15.0a0
- - python >=3.14,<3.15.0a0 *_cp314
- - python_abi 3.14.* *_cp314
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 189475
- timestamp: 1770223788648
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - libre2-11 >=2025.11.5
- - re2
- size: 27445
- timestamp: 1768190259003
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - readline >=8.3,<9.0a0
- size: 313930
- timestamp: 1765813902568
-- conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.15.16-h80928e0_0.conda
- noarch: python
- sha256: 6ce34bec1817caf6aa22c7ce28c4aeadd5fe02ea00d74425c498f4ec35276a1c
- md5: 316cae3a5f921c633f8a6e1eb48604d8
- depends:
- - python
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 8426033
- timestamp: 1780612122132
-- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.2-py311h0675101_0.conda
- sha256: bc3e873e85c55deaaad446c410d9001d12a133c1b48fa2cb0050b4f46f926aa3
- md5: df904770f3fdb6c0265a09cdc22acf54
- depends:
- - __osx >=11.0
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libcxx >=18
- - libgfortran >=5
- - libgfortran5 >=13.2.0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.5
- - numpy >=1.19,<3
- - numpy >=1.23.5
- - python >=3.11,<3.12.0a0
- - python >=3.11,<3.12.0a0 *_cpython
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 14569129
- timestamp: 1739792318601
-- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py311h9a58382_1.conda
- sha256: b45f87414da242a9e40eb934e89513a856e6236d681611c2c9a21d074b03ef5a
- md5: 15f96f91b13cbefddbf998368d06adef
- 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.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 13954661
- timestamp: 1779874558902
-- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py313hf3ca9c9_0.conda
- sha256: 683b1d029ce027a9ca059898073d3c450fb049cab2104841cacfc522db33109e
- md5: 0708282b2709afd240f7d5b8db8c6135
- 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.13,<3.14.0a0
- - python >=3.13,<3.14.0a0 *_cp313t
- - python_abi 3.13.* *_cp313t
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 14231641
- timestamp: 1771880960734
-- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py314h18e1515_1.conda
- sha256: d9742c04d44f78d2628899ad017f23e404e08f28118fcfbbf6722259cbd56eab
- md5: 9958307c22c5b53165e46719ebe8972d
- 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.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 13975038
- timestamp: 1779874613589
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - sleef >=3.9.0,<4.0a0
- size: 587027
- timestamp: 1756274982526
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - tk >=8.6.13,<8.7.0a0
- size: 3127137
- timestamp: 1769460817696
-- conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.47.2-h6fdd925_0.conda
- sha256: fafc2b5cbfc85d949187ea750da551562d5979567fa5adc9e7b63d96b7fa1d41
- md5: 2aa4aae21ff9f3748de0f4f2ac2c4794
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT OR Apache-2.0
- run_exports: {}
- size: 2710003
- timestamp: 1780547314189
-- conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- sha256: cd800ce01106427c3626695d3f03d31d4bd26bf2981b3e30ef3c7a08716a2730
- md5: 2c6b3d149d7a3b861329ed5425508aa4
- depends:
- - libcxx >=19
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: Apache-2.0 OR MIT
- run_exports: {}
- size: 16593525
- timestamp: 1780539218480
-- conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda
- sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac
- md5: 78a0fe9e9c50d2c381e8ee47e3ea437d
- depends:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - yaml >=0.2.5,<0.3.0a0
- size: 83386
- timestamp: 1753484079473
-- conda: https://prefix.dev/conda-forge/osx-arm64/zizmor-1.25.2-h6fdd925_0.conda
- sha256: accff2d5f1f272db521d1c3f1965720fdd096dbecad09b13cd391d289e706034
- md5: a256ec17027f29d7ff6df5fee51d093c
- depends:
- - __osx >=11.0
- constrains:
- - __osx >=11.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 6437874
- timestamp: 1778922235301
-- conda: https://prefix.dev/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
- run_exports:
- weak:
- - zstd >=1.5.7,<1.6.0a0
- size: 433413
- timestamp: 1764777166076
-- conda: https://prefix.dev/conda-forge/win-64/actionlint-1.7.12-h11b0a5a_0.conda
- sha256: c06ad63dd652546687ec28c131975c183a240cd7b281d14403ef3bb5c6858f76
- md5: 78b9e566476a9df08fa5840ba9e2aeae
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 2152519
- timestamp: 1774975834444
-- conda: https://prefix.dev/conda-forge/win-64/ast-serialize-0.5.0-py310ha413424_1.conda
- noarch: python
- sha256: 6045fef43d0e5c9ce898dc89da2d4d5f81f5da5c10ca25fcc3592f663dbbec5d
- md5: 3a08e9b5d3bbdb909799bb061cab5e67
- depends:
- - python >=3.10
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - _python_abi3_support 1.*
- - cpython >=3.10
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 1080282
- timestamp: 1780396676915
-- conda: https://prefix.dev/conda-forge/win-64/astroid-4.0.4-py314h86ab7b2_0.conda
- sha256: 18d45f2251b15637c73f3d9a5818601797a9ee89b0bb0203bf810dac27d1294a
- md5: d104588051bc8b8c592cfd1ccdbf0a6b
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: LGPL-2.1-or-later
- license_family: LGPL
- run_exports: {}
- size: 541771
- timestamp: 1770634544810
-- conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda
- sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b
- md5: 1302b74b93c44791403cbeee6a0f62a3
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libbrotlicommon 1.2.0 hfd05255_1
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 335782
- timestamp: 1764018443683
-- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902
- md5: 4cb8e6b48f67de0b018719cdf1136306
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: bzip2-1.0.6
- license_family: BSD
- run_exports:
- weak:
- - bzip2 >=1.0.8,<2.0a0
- size: 56115
- timestamp: 1771350256444
-- conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py311h3f79411_0.conda
- sha256: 491d53a03c413dc3699862d96feecbe22b0fda5d2f9e91066ed1eae6cb220793
- md5: 0aa2991504a7e9144b5dae2f684fd4d6
- depends:
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - tomli
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 424714
- timestamp: 1779838002255
-- conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.1-py314h2359020_0.conda
- sha256: 9bd2e2e705d44961482bc58339fe3d456cbbdbc16520c607be9609601c39e5ba
- md5: 442d8dfea629c6a1c46347db9a5ec974
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - tomli
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 440396
- timestamp: 1779838003568
-- conda: https://prefix.dev/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda
- sha256: a30cd9adf3a70d069d4d87c5728ec16778b77071629612ca5d8513cd92d89c09
- md5: 0a243d4f000a0d2f51dd94ee9132b234
- depends:
- - cuda-cudart_win-64 12.9.79 he0c23c2_0
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 170799
- timestamp: 1749218946117
-- conda: https://prefix.dev/conda-forge/win-64/cuda-cupti-12.9.79-hac47afa_1.conda
- sha256: 000838d027db031422233571e60a25c23ef4a9442b6b67ad03fdb5da8843b08b
- md5: 993441d383965156c2b75dc77b23590f
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 4032155
- timestamp: 1761098925049
-- conda: https://prefix.dev/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda
- sha256: d90ef446ac859db26286a5d39d39333c4e4cee31ba5042b5c7922bd25de531f6
- md5: d68b5d96a53c80dc3dbbd8f7c3b8106d
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 58467504
- timestamp: 1760723834711
-- conda: https://prefix.dev/conda-forge/win-64/cupy-14.1.1-py311h9ddb863_0.conda
- sha256: 4992d8eba792167489a35f43ac0831780c19e180e6c8908d10e4849904446d5f
- md5: d984c912b8dcec01e65fbbf188167f5c
- depends:
- - cuda-cudart-dev_win-64
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - cupy-core 14.1.1 py311h49c6b33_0
- - libcublas
- - libcufft
- - libcurand
- - libcusolver
- - libcusparse
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 422040
- timestamp: 1780320903101
-- conda: https://prefix.dev/conda-forge/win-64/cupy-14.1.1-py314h7882ca2_0.conda
- sha256: c8f0bdedb0e8c1551b4553cda6263d85ccaf76d378675ff27ad99b5b68bb7619
- md5: 21bc31a244a6b0b00b3765814af0fdc2
- depends:
- - cuda-cudart-dev_win-64
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - cupy-core 14.1.1 py314h95bfa35_0
- - libcublas
- - libcufft
- - libcurand
- - libcusolver
- - libcusparse
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 421207
- timestamp: 1780320741511
-- conda: https://prefix.dev/conda-forge/win-64/cupy-core-14.1.1-py311h49c6b33_0.conda
- sha256: 80547cb6ea248834f1767d3dd3da7c5ac8a62beb398a2911fe638ab2849989c7
- md5: 2d86138c74436a36802f0846a67ba3a0
- depends:
- - cuda-pathfinder >=1.3.4,<2.0a0
- - numpy >=1.23,<3
- - numpy >=2.0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libcufft >=11,<12.0a0
- - libcurand >=10,<11.0a0
- - cutensor >=2.6.0.4,<3.0a0
- - libcusolver >=11,<12.0a0
- - __cuda >=12.0
- - cuda-nvrtc >=12,<13.0a0
- - cuda-version >=12,<13.0a0
- - libcublas >=12,<13.0a0
- - optuna ~=3.0
- - scipy >=1.14,<1.17
- - libcusparse >=12,<13.0a0
- - cupy >=14.1.1,<14.2.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 59242281
- timestamp: 1780320808074
-- conda: https://prefix.dev/conda-forge/win-64/cupy-core-14.1.1-py314h95bfa35_0.conda
- sha256: d115d79d01f5a6173173390b7f617882d8c98efeeba9109ac87b4431ed7d55f8
- md5: 942cd63134af9b32657555c4b21fb11b
- depends:
- - cuda-pathfinder >=1.3.4,<2.0a0
- - numpy >=1.23,<3
- - numpy >=2.0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - cuda-nvrtc >=12,<13.0a0
- - libcufft >=11,<12.0a0
- - scipy >=1.14,<1.17
- - __cuda >=12.0
- - cuda-version >=12,<13.0a0
- - cupy >=14.1.1,<14.2.0a0
- - cutensor >=2.6.0.4,<3.0a0
- - libcusolver >=11,<12.0a0
- - libcurand >=10,<11.0a0
- - libcusparse >=12,<13.0a0
- - optuna ~=3.0
- - libcublas >=12,<13.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 59070595
- timestamp: 1780320665634
-- conda: https://prefix.dev/conda-forge/win-64/dprint-0.50.0-h63977a8_0.conda
- sha256: 472651da1d9fdf8f971d6e7315e66eaf751a4d89931b35ad67688169d47c16f7
- md5: b2dfadee4319a59f897548368d2f82dd
- depends:
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 6332369
- timestamp: 1747623393600
-- conda: https://prefix.dev/conda-forge/win-64/fmt-12.1.0-h7f4e812_0.conda
- sha256: cce96406ec353692ab46cd9d992eddb6923979c1a342cbdba33521a7c234176f
- md5: 6e226b58e18411571aaa57a16ad10831
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - fmt >=12.1.0,<12.2.0a0
- size: 186390
- timestamp: 1767681264793
-- conda: https://prefix.dev/conda-forge/win-64/lefthook-2.1.9-h11686cb_0.conda
- sha256: b46014c4d379f16e178282b882c37e8f7acd0c1cd9207f386207ad6ddf023946
- md5: 45eee6f9d039ca2283f4c0a164853905
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 5448668
- timestamp: 1780061059296
-- conda: https://prefix.dev/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda
- sha256: 7e7f3754f8afaabd946dc11d7c00fd1dc93f0388a2d226a7abf1bf07deab0e2b
- md5: 60da39dd5fd93b2a4a0f986f3acc2520
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libabseil-static =20260107.1=cxx17*
- - abseil-cpp =20260107.1
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - libabseil >=20260107.1,<20260108.0a0
- - libabseil =*=cxx17*
- size: 1884784
- timestamp: 1770863303486
-- conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda
- build_number: 8
- sha256: 43a87b59e6d4c68d80b2e4de487b1b54d66fe1f9a06636909b5a5ab9eae27269
- md5: 4a0ce24b1a946ff77ae9eaa7ef015a33
- depends:
- - mkl >=2026.0.0,<2027.0a0
- constrains:
- - libcblas 3.11.0 8*_mkl
- - liblapacke 3.11.0 8*_mkl
- - blas 2.308 mkl
- - liblapack 3.11.0 8*_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libblas >=3.11.0,<4.0a0
- size: 68103
- timestamp: 1779859688049
-- conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda
- build_number: 8
- sha256: 2a5b6555b481df4603e44cba49a6ef727584fd2f3c5235dd4bcb3028fffbdfb5
- md5: 09f1d8e4d2675d34ad2acb115211d10c
- depends:
- - libblas 3.11.0 8_h8455456_mkl
- constrains:
- - liblapacke 3.11.0 8*_mkl
- - blas 2.308 mkl
- - liblapack 3.11.0 8*_mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libcblas >=3.11.0,<4.0a0
- size: 68443
- timestamp: 1779859701498
-- conda: https://prefix.dev/conda-forge/win-64/libcublas-12.9.2.10-hac47afa_0.conda
- sha256: bb369dcee999f0725bc91210d6448063ae8ce5a811e3ad412f4c2802dfac3d71
- md5: 45077499707a23faaf61db90ef0eb7f9
- depends:
- - cuda-nvrtc
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 460683273
- timestamp: 1778771711054
-- conda: https://prefix.dev/conda-forge/win-64/libcudnn-9.10.2.21-hca898b4_0.conda
- sha256: 78781b67483691be180ba89c25a552c4133b3919e5349fcb4339def20bd9d899
- md5: 62541ff0c21c8f05ed9dbfd7a86955d1
- depends:
- - cuda-nvrtc
- - cuda-version >=12,<13.0a0
- - libcublas
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libcudnn-jit <0a
- license: LicenseRef-cuDNN-Software-License-Agreement
- run_exports: {}
- size: 509727349
- timestamp: 1762823477454
-- conda: https://prefix.dev/conda-forge/win-64/libcudss-0.7.1.4-hca898b4_1.conda
- sha256: 6728fc916ba7f49bdf258b050fbd998df92ff8c886e0a07c13161d56c51e5cac
- md5: 1f675cf9b513497f276e4673d58ffb6b
- depends:
- - cuda-version >=12,<13.0a0
- - libcublas
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - vcomp14 >=14.44.35208
- constrains:
- - libcudss-commlayer-nccl 0.7.1.4 1
- - libcudss-commlayer-mpi 0.7.1.4 1
- - libcudss0 <0.0.0a0
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 61127635
- timestamp: 1770671804384
-- conda: https://prefix.dev/conda-forge/win-64/libcufft-11.4.1.4-hac47afa_1.conda
- sha256: 9d755ae6128769ee197238fd993c4daa97e2c2c394323b03bac4b94e177d4972
- md5: 1547ebf91f130492fd7bfe6748e6d23b
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 162171526
- timestamp: 1761099148426
-- conda: https://prefix.dev/conda-forge/win-64/libcurand-10.3.10.19-hac47afa_1.conda
- sha256: e5fb6ca446ef515a5b6561988e5fadc71a2b357616dbb02df8d7df6ed2c24e46
- md5: f8b43abcc1031aca485831b1ff766366
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 49021542
- timestamp: 1761099077924
-- conda: https://prefix.dev/conda-forge/win-64/libcusolver-11.7.5.82-hac47afa_2.conda
- sha256: 7bbd188934bb39f9cca8def66adb42be57902541fa021731c9f27ae9f46a4c18
- md5: 59a5f0be437b7a6a534c5d463d2e9530
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - libcublas >=12.9.1.4,<12.10.0a0
- - libcusparse >=12.5.10.65,<12.6.0a0
- - libnvjitlink >=12.9.86,<13.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 198154494
- timestamp: 1761099032394
-- conda: https://prefix.dev/conda-forge/win-64/libcusparse-12.5.10.65-hac47afa_2.conda
- sha256: fc911af27ab28af77d4b7203c6c9ebb15f4ddf27af8e8331d9a9983f4dd96483
- md5: 4e84a8282a9c1802ec4f516090164228
- depends:
- - cuda-version >=12.9,<12.10.0a0
- - libnvjitlink >=12.9.86,<13.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 206424726
- timestamp: 1761069999907
-- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- sha256: a65e518c20d1482182bc0f1f6dd5d992f25ca44c3b32307be39ae8310db8f060
- md5: 23eb9474a16d4b9f6f27429989e82002
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - expat 2.8.1.*
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 71280
- timestamp: 1779278786150
-- conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190
- md5: 720b39f5ec0610457b725eb3f396219a
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libffi >=3.5.2,<3.6.0a0
- size: 45831
- timestamp: 1769456418774
-- conda: https://prefix.dev/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda
- sha256: 2ee12e37223dfcd0acd050c80a91150c482b6e2899198521e1800dce66662467
- md5: 6a01c986e30292c715038d2788aa1385
- depends:
- - libwinpthread >=12.0.0.r4.gg4f2fc60ca
- - libxml2
- - libxml2-16 >=2.14.6
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libhwloc >=2.13.0,<2.13.1.0a0
- size: 2396128
- timestamp: 1770954127918
-- conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda
- sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7
- md5: 64571d1dd6cdcfa25d0664a5950fdaa2
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LGPL-2.1-only
- run_exports:
- weak:
- - libiconv >=1.18,<2.0a0
- size: 696926
- timestamp: 1754909290005
-- conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda
- build_number: 8
- sha256: 44999ed04bc0a56de44ee0ac8bd5b3702efd411a8b29491c0e3d3deb8619c94e
- md5: d584799b920ecae9b75a2b70743a3de7
- depends:
- - libblas 3.11.0 8_h8455456_mkl
- constrains:
- - libcblas 3.11.0 8*_mkl
- - liblapacke 3.11.0 8*_mkl
- - blas 2.308 mkl
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - liblapack >=3.11.0,<3.12.0a0
- size: 81027
- timestamp: 1779859714698
-- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- sha256: d636d1a25234063642f9c531a7bb58d84c1c496411280a36ea000bd122f078f1
- md5: 8f83619ab1588b98dd99c90b0bfc5c6d
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - xz 5.8.3.*
- license: 0BSD
- run_exports:
- weak:
- - liblzma >=5.8.3,<6.0a0
- size: 106486
- timestamp: 1775825663227
-- conda: https://prefix.dev/conda-forge/win-64/libmagma-2.10.0-hb6a17ea_0.conda
- sha256: ce728a7450f1108bf57dcdfc57c93e62a2d83fbd4570aaaaee6c9d138db34f29
- md5: de6d2b2db0b5dc79f008d2d73a4a74c2
- depends:
- - cuda-cudart
- - cuda-version >=12,<13.0a0
- - libblas >=3.9.0,<4.0a0
- - libcublas
- - libcusparse
- - liblapack >=3.9.0,<4.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - vcomp14 >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 471069325
- timestamp: 1773078352804
-- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514
- md5: e4a9fc2bba3b022dad998c78856afe47
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 89411
- timestamp: 1769482314283
-- conda: https://prefix.dev/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda
- sha256: adf35938c9ecd77d27c87ef870f7710ee422933ad95d1aac136ff39e7af0551f
- md5: feaee6b1ab0e7ed9152dc88e1b0eeddd
- depends:
- - cuda-version >=12,<12.10.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-NVIDIA-End-User-License-Agreement
- run_exports: {}
- size: 27343190
- timestamp: 1760724535115
-- conda: https://prefix.dev/conda-forge/win-64/libprotobuf-6.33.5-h6cf2d3c_1.conda
- sha256: dce2820ebc4059b4919158814aa6ea2ccd31be699d9e3d74824de8d31ec66864
- md5: 712686431de276d81eb02d87483f6f10
- depends:
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libzlib >=1.3.2,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libprotobuf >=6.33.5,<6.33.6.0a0
- size: 7162612
- timestamp: 1780005438640
-- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- sha256: 4cd81319dcc58fb758da20a6d5595950c021adc2c18d7cffeadcfb590529629f
- md5: df294e7f9f24a6063f0e226f4d028fda
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: blessing
- run_exports:
- weak:
- - libsqlite >=3.53.2,<4.0a0
- size: 1313306
- timestamp: 1780574491977
-- conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cpu_mkl_haf7133b_100.conda
- sha256: d4540039d6623bb72ea47a4d93c7a35f6f139cb1654073df43da0f26ab087292
- md5: f913df9ae86a73a02c04f4f115a02e34
- depends:
- - fmt >=12.1.0,<12.2.0a0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.11.0,<4.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.6
- - mkl >=2026.0.0,<2027.0a0
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- - pytorch 2.11.0 cpu_mkl_*_100
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 33970771
- timestamp: 1780420362323
-- conda: https://prefix.dev/conda-forge/win-64/libtorch-2.11.0-cuda128_mkl_h2cf6d90_300.conda
- sha256: bfe4524bc4e7e1dfd6eeb93e3cfbac479da48435aca41d5d1292ed1c53a63305
- md5: 5742f519a18c059a5b6043a427d0e922
- depends:
- - cuda-cudart >=12.8.90,<13.0a0
- - cuda-cupti >=12.8.90,<13.0a0
- - cuda-nvrtc >=12.8.93,<13.0a0
- - cuda-version >=12.8,<13
- - fmt >=12.1.0,<12.2.0a0
- - libabseil * cxx17*
- - libabseil >=20260107.1,<20260108.0a0
- - libblas * *mkl
- - libcblas >=3.11.0,<4.0a0
- - libcublas >=12.8.5.5,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.3.3.83,<12.0a0
- - libcurand >=10.3.9.90,<11.0a0
- - libcusolver >=11.7.3.90,<12.0a0
- - libcusparse >=12.5.8.93,<13.0a0
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - pybind11-abi 11
- - sleef >=3.9.0,<4.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch 2.11.0 cuda128_mkl_*_300
- - pytorch-gpu 2.11.0
- - pytorch-cpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - libtorch >=2.11.0,<2.12.0a0
- size: 512106216
- timestamp: 1780547294627
-- conda: https://prefix.dev/conda-forge/win-64/libuv-1.52.1-h6a83c73_0.conda
- sha256: ca55710ece8736785ffa0fad4d45402dd40992a81a045d69eda5d40bc1a288f9
- md5: 741d96e586ac833409e5d27cdae08d15
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libuv >=1.52.1,<2.0a0
- size: 331213
- timestamp: 1779396042250
-- conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda
- sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0
- md5: 8a86073cf3b343b87d03f41790d8b4e5
- depends:
- - ucrt
- constrains:
- - pthreads-win32 <0.0a0
- - msys2-conda-epoch <0.0a0
- license: MIT AND BSD-3-Clause-Clear
- run_exports: {}
- size: 36621
- timestamp: 1759768399557
-- conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda
- sha256: 8038084c60eda2006d0122d05e3364fe8db0a18935ca6ed0168b5ba5aa33f904
- md5: f7d6fcda29570e20851b78d92ea2154e
- depends:
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.3,<6.0a0
- - libzlib >=1.3.2,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - libxml2 2.15.3
- - icu <0.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 518869
- timestamp: 1776376971242
-- conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda
- sha256: da68af9d9d28d65a6916db1bef68f8a25c64c4fdcf759f32a2d2f2f143220adf
- md5: e3b5acbb857a12f5d59e8d174bc536c0
- depends:
- - libiconv >=1.18,<2.0a0
- - liblzma >=5.8.3,<6.0a0
- - libxml2-16 2.15.3 h692994f_0
- - libzlib >=1.3.2,<2.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - icu <0.0a0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - libxml2
- - libxml2-16 >=2.15.3
- size: 43916
- timestamp: 1776376994334
-- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061
- md5: dbabbd6234dea34040e631f87676292f
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - zlib 1.3.2 *_2
- license: Zlib
- license_family: Other
- run_exports:
- weak:
- - libzlib >=1.3.2,<2.0a0
- size: 58347
- timestamp: 1774072851498
-- conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.7-h4fa8253_0.conda
- sha256: 70140a1fa5d7cb801c6be3273b0704b5f0e418e2fff6b12b8ce9db13067a1ed5
- md5: 0ca3373049a5be11689bc2f9b2f3a9d2
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - intel-openmp <0.0a0
- - openmp 22.1.7|22.1.7.*
- license: Apache-2.0 WITH LLVM-exception
- license_family: APACHE
- run_exports:
- strong:
- - llvm-openmp >=22.1.7
- size: 347536
- timestamp: 1780456277495
-- conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py311h4f568be_1.conda
- sha256: ed7e5cc827965fac8fa0d7a8ef51d7cc5e66f81829a4097fa373d633e153cc40
- md5: cd5170b645250915396456c3499ae3d8
- depends:
- - libzlib >=1.3.2,<2.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 22920257
- timestamp: 1776076964823
-- conda: https://prefix.dev/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda
- sha256: 9caf2c3ec4b747554421bbe0adb5e5dbfec45463638b7e3407d1ba02167bf472
- md5: ad66bb59a59cfa219311bf5072c1a087
- depends:
- - libzlib >=1.3.2,<2.0a0
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - zstd >=1.5.7,<1.6.0a0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 22909282
- timestamp: 1776076971549
-- conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py311h3f79411_1.conda
- sha256: 3d37fb1900e31131f84549560e7a4bfea5f39aa3ecd73345fef1f33975cf0baa
- md5: f55de41c947bdd2ff9bbeffedf8089f7
- depends:
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 29362
- timestamp: 1772445178723
-- conda: https://prefix.dev/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda
- sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c
- md5: 8de7b40f8b30a8fcaa423c2537fe4199
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - jinja2 >=3.0.0
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 30022
- timestamp: 1772445159549
-- conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda
- sha256: f997bfc9bc4d4e14261cdcd1ad195d64a72ee44dca3145d24c1349f8d1311aa5
- md5: 36ea6e1292e9d5e89374201da79646ef
- depends:
- - llvm-openmp >=22.1.5
- - onemkl-license 2026.0.0 h57928b3_908
- - tbb >=2023.0.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- run_exports: {}
- size: 114354729
- timestamp: 1779293121860
-- conda: https://prefix.dev/conda-forge/win-64/mypy-2.1.0-py314h13f4da2_0.conda
- sha256: 8099ce0e8f971f6a393df52c2d5abca56209d47c1d3da020ca4ee0625539b933
- md5: 26de46b296a732183242a77ac4e6a30f
- depends:
- - ast-serialize >=0.3.0,<1.0.0
- - mypy_extensions >=1.0.0
- - pathspec >=1.0.0
- - python
- - python-librt >=0.11.0
- - typing_extensions >=4.6.0
- - psutil >=4.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 10734309
- timestamp: 1780315652597
-- conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- sha256: e41a945c34a5f0bd2109b73a65486cd93023fa0a9bcba3ef98f9a3da40ba1180
- md5: 7ecb9f2f112c66f959d2bb7dbdb89b67
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 309417
- timestamp: 1763688227932
-- conda: https://prefix.dev/conda-forge/win-64/nodejs-26.3.0-h80d1838_0.conda
- sha256: 08dc21cddb646fc13e1492c7b56c3d8f233fc1428a0a496b74095f650c1de9e8
- md5: 16f9fccac9172370ce797ae192f351a1
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - nodejs >=26.3.0,<27.0a0
- size: 33821057
- timestamp: 1780383044060
-- conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py311h34437f8_1.conda
- sha256: b47ef172ebef23230ac5bb42ebd9b8cd798582a7bae496c7634fc5daceb6b913
- md5: e1cb9bbb5d53c03c2fc45b527ecfa310
- depends:
- - llvmlite >=0.47.0,<0.48.0a0
- - numpy >=1.22.3,<2.5
- - numpy >=1.23,<3
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - cuda-version >=11.2
- - tbb >=2021.6.0
- - libopenblas !=0.3.6
- - scipy >=1.0
- - cuda-python >=11.6
- - cudatoolkit >=11.2
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5857073
- timestamp: 1778390601717
-- conda: https://prefix.dev/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda
- sha256: 3998df5608bb2309ac7857bfb6b2f2d804f2f10d5e62173db0aada1660346705
- md5: b7a863d5eaa15a4fb5970165f413f411
- depends:
- - llvmlite >=0.47.0,<0.48.0a0
- - numpy >=1.22.3,<2.5
- - numpy >=1.23,<3
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - cudatoolkit >=11.2
- - libopenblas !=0.3.6
- - cuda-python >=11.6
- - scipy >=1.0
- - cuda-version >=11.2
- - tbb >=2021.6.0
- license: BSD-2-Clause
- license_family: BSD
- run_exports: {}
- size: 5787391
- timestamp: 1778390612597
-- conda: https://prefix.dev/conda-forge/win-64/numpy-1.24.1-py311h0b4df5a_0.conda
- sha256: 7dff2a85c8b0b87c4e7c42bab4392c66135bfb022ec08f591a1e2ee041dfb611
- md5: f793743c51413201b93cffd4adebd540
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vs2015_runtime >=14.29.30139
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.24.1,<2.0a0
- size: 7085784
- timestamp: 1675040346419
-- conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.2-py313hfb2b801_1.conda
- sha256: 0cf52a0ed8ed15e35a97be94e0b9db30009fc9ecb321c6590f98b52cde7c3b30
- md5: 7b7122abedcb5eed34e933a154b11791
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.13.* *_cp313t
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 7409900
- timestamp: 1770098406002
-- conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda
- sha256: cd26f615140d0ed557f8927947ca62c181d55ddbe418eebd24bd06cd32fb3938
- md5: ef5c1dedd943abfb0b80112ba46d4ab8
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - liblapack >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - python_abi 3.11.* *_cp311
- - libblas >=3.9.0,<4.0a0
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 7807344
- timestamp: 1779169235300
-- conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda
- sha256: de0eee21d902fb45a58454e3739e04ede7d02bf7575ca0ae9f959f20fa15c76b
- md5: df95e6c7325bbae2571e5cef5f9c8096
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - libblas >=3.9.0,<4.0a0
- - python_abi 3.14.* *_cp314
- constrains:
- - numpy-base <0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - numpy >=1.23,<3
- size: 7318163
- timestamp: 1779169232086
-- conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda
- sha256: 42ad15cbb3bf31830efa04d4b86dd2d5c0dd590c86f98adcd3c8c1f75acf5dd5
- md5: 9c9303e08b50e09f5c23e1dac99d0936
- license: LicenseRef-IntelSimplifiedSoftwareOct2022
- license_family: Proprietary
- run_exports: {}
- size: 41580
- timestamp: 1779292867015
-- conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- sha256: cb6e7ba0d010ee0d3249ce9886de3d7613d26d9965d4c95666fa66b9c4c31001
- md5: e99f95734a326c0fd4d02bbd995150d4
- depends:
- - ca-certificates
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
- run_exports:
- weak:
- - openssl >=3.6.3,<4.0a0
- size: 9414790
- timestamp: 1781071745579
-- conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py311h3fd045d_0.conda
- sha256: c6ac73e7138b1407b3f388e838d69d1d38628c721da6b57fb194edb98812c1ba
- md5: 17caaf0594c7319fca76c853feb8e3f5
- depends:
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - typing-extensions >=4.6
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 386400
- timestamp: 1778047891690
-- conda: https://prefix.dev/conda-forge/win-64/optree-0.19.1-py314h909e829_0.conda
- sha256: 6ea8a002aff1963c6b92b8eb69c45822eb8d748882efc85dc29eb22d24496b8a
- md5: b3629d64bfd4f254fa4820953d4bd0f1
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - typing-extensions >=4.12
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: Apache
- run_exports: {}
- size: 403398
- timestamp: 1778047844319
-- conda: https://prefix.dev/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda
- sha256: 17c8274ce5a32c9793f73a5a0094bd6188f3a13026a93147655143d4df034214
- md5: fd539ac231820f64066839251aa9fa48
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 249950
- timestamp: 1769678167309
-- conda: https://prefix.dev/conda-forge/win-64/pyrefly-1.0.0-hfe91638_0.conda
- sha256: 5d3cfd0fea530480f197badbc00403d7c1592814540180c23acdef5f900e3284
- md5: 8952e9b92b28b7c6bdc953d8711957bd
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 11351129
- timestamp: 1778629351360
-- conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda
- sha256: a1f1031088ce69bc99c82b95980c1f54e16cbd5c21f042e9c1ea25745a8fc813
- md5: d09dbf470b41bca48cbe6a78ba1e009b
- depends:
- - 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
- - openssl >=3.5.5,<4.0a0
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - python_abi 3.11.* *_cp311
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.11.* *_cp311
- noarch:
- - python
- size: 18416208
- timestamp: 1772728847666
-- conda: https://prefix.dev/conda-forge/win-64/python-3.13.13-ha261ea0_0_cp313t.conda
- sha256: b8e66cd22df4dfc4101fbfdfb25a9047fac50630f8546fe52f60864f5c0f2c77
- md5: 6fd53fbd827d5c286124fc659329ec1f
- depends:
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.7.5,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.2,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.52.0,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.13.* *_cp313t
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.13.* *_cp313t
- noarch:
- - python
- size: 16660268
- timestamp: 1775613649330
- python_site_packages_path: Lib/site-packages
-- conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- build_number: 100
- sha256: c561d171e5d1f1bb1a83ca6fa6aa49577a2956a245c5040dfaf8ca20c10a096e
- md5: 3f76bc298eebc1ec1497852f4d7f09d9
- depends:
- - bzip2 >=1.0.8,<2.0a0
- - libexpat >=2.8.0,<3.0a0
- - libffi >=3.5.2,<3.6.0a0
- - liblzma >=5.8.3,<6.0a0
- - libmpdec >=4.0.0,<5.0a0
- - libsqlite >=3.53.1,<4.0a0
- - libzlib >=1.3.2,<2.0a0
- - openssl >=3.5.6,<4.0a0
- - python_abi 3.14.* *_cp314
- - tk >=8.6.13,<8.7.0a0
- - tzdata
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - zstd >=1.5.7,<1.6.0a0
- license: Python-2.0
- run_exports:
- weak:
- - python_abi 3.14.* *_cp314
- noarch:
- - python
- size: 18375338
- timestamp: 1779237800732
- python_site_packages_path: Lib/site-packages
-- conda: https://prefix.dev/conda-forge/win-64/python-librt-0.11.0-py314hc5dbbe4_0.conda
- sha256: 3269977dd171fdff6eef27db83dac87847d91501539c317acea354c61cc1cb6d
- md5: 7cdfc5fda782933981f50c7a9a746039
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 104479
- timestamp: 1778511743226
-- conda: https://prefix.dev/conda-forge/win-64/pytokens-0.4.1-py314hc5dbbe4_2.conda
- sha256: 2c97a59ce98b9d29a30bc49f3001b9206ce789edaee7d2773cde8a8a7f78abc4
- md5: 02632a618ced2283cf9a7c4a70a43026
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - python_abi 3.14.* *_cp314
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 120434
- timestamp: 1778688861070
-- conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cpu_mkl_py311_h29716f0_100.conda
- sha256: a95a8c1f4cfa8cf0bb035ce2670f94f97fc7585f48c4136af4650c387ec2467b
- md5: 0ef718c2be4b55f8e6e1414ef06a8174
- depends:
- - 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
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cpu_mkl_haf7133b_100
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.6
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 22664458
- timestamp: 1780429921340
-- conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cpu_mkl_py314_h7f060ac_100.conda
- sha256: cf1220bef3aba97337969d568e08fdd5db1a014a9aea1f344c4b85e0afc24fd2
- md5: 7582453b5a74de487fc744ffc618792a
- depends:
- - 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
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cpu_mkl_haf7133b_100
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.6
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch-cpu 2.11.0
- - pytorch-gpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 23495541
- timestamp: 1780426595835
-- conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cuda128_mkl_py311_h2eca7bd_300.conda
- sha256: 6de9f3f61d3a66b211ee38e8ba825dcd0a55a12f80e0cebffa618bebdb92b3cf
- md5: a12396d4f85f3eb2e0db03b1e3d041d6
- depends:
- - __cuda
- - cuda-cudart >=12.8.90,<13.0a0
- - cuda-cupti >=12.8.90,<13.0a0
- - cuda-nvrtc >=12.8.93,<13.0a0
- - cuda-version >=12.8,<13
- - 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
- - libcublas >=12.8.5.5,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.3.3.83,<12.0a0
- - libcurand >=10.3.9.90,<11.0a0
- - libcusolver >=11.7.3.90,<12.0a0
- - libcusparse >=12.5.8.93,<13.0a0
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cuda128_mkl_h2cf6d90_300
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch-gpu 2.11.0
- - pytorch-cpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 22731263
- timestamp: 1780552823802
-- conda: https://prefix.dev/conda-forge/win-64/pytorch-2.11.0-cuda128_mkl_py314_h642f7e6_300.conda
- sha256: cc69888a4006157075c40b1e9789f9590c517c70ed1e0f8a0b327a12fd3c650e
- md5: 89b046f5afe89c9ba47a1a71679119a8
- depends:
- - __cuda
- - cuda-cudart >=12.8.90,<13.0a0
- - cuda-cupti >=12.8.90,<13.0a0
- - cuda-nvrtc >=12.8.93,<13.0a0
- - cuda-version >=12.8,<13
- - 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
- - libcublas >=12.8.5.5,<13.0a0
- - libcudnn >=9.10.2.21,<10.0a0
- - libcudss >=0.7.1.4,<0.7.2.0a0
- - libcufft >=11.3.3.83,<12.0a0
- - libcurand >=10.3.9.90,<11.0a0
- - libcusolver >=11.7.3.90,<12.0a0
- - libcusparse >=12.5.8.93,<13.0a0
- - libmagma >=2.10.0,<2.10.1.0a0
- - libprotobuf >=6.33.5,<6.33.6.0a0
- - libtorch 2.11.0 cuda128_mkl_h2cf6d90_300
- - libuv >=1.52.1,<2.0a0
- - libzlib >=1.3.2,<2.0a0
- - llvm-openmp >=22.1.7
- - mkl >=2026.0.0,<2027.0a0
- - networkx
- - numpy >=1.23,<3
- - optree >=0.13.0
- - pybind11 <3.0.2
- - pybind11-abi 11
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - setuptools <82
- - sleef >=3.9.0,<4.0a0
- - sympy >=1.13.3
- - typing_extensions >=4.10.0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- constrains:
- - pytorch-gpu 2.11.0
- - pytorch-cpu <0.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - pytorch >=2.11.0,<2.12.0a0
- - libtorch >=2.11.0,<2.12.0a0
- size: 23573093
- timestamp: 1780556676928
-- conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py311h3f79411_1.conda
- sha256: 301c3ba100d25cd5ae37895988ee3ab986210d4d972aa58efed948fbe857773d
- md5: a0153c033dc55203e11d1cac8f6a9cf2
- depends:
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 187108
- timestamp: 1770223467913
-- conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda
- sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997
- md5: 0cd9b88826d0f8db142071eb830bce56
- depends:
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - yaml >=0.2.5,<0.3.0a0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 181257
- timestamp: 1770223460931
-- conda: https://prefix.dev/conda-forge/win-64/ruff-0.15.16-h45713df_0.conda
- noarch: python
- sha256: 94ebd0428d21fe5cb781e8d0bb42ebe06c195c1687e151fb679c7aaf725f30e3
- md5: 9e19d10e98691ebf78ff7b4582a6c322
- depends:
- - python
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 9704002
- timestamp: 1780611898952
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.2-py311h99d06ae_0.conda
- sha256: 62ae1a1e02c919513213351474d1c72480fb70388a345fa81f1c95fa822d98bf
- md5: c7ec15b5ea6a27bb71af2ea5f7c97cbb
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.5
- - numpy >=1.19,<3
- - numpy >=1.23.5
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.2,<15
- - vc14_runtime >=14.29.30139
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15487645
- timestamp: 1739793313482
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.16.3-py311h9c22a71_2.conda
- sha256: 49129601dc89d49742d342ace70f4ec0127a5eb24a50d66f95f91db01b3a23d5
- md5: 4b663de0f0c8ac0fbb4a4d9ee8536b0f
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.6
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15129579
- timestamp: 1766109708812
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.16.3-py314h221f224_2.conda
- sha256: 99d6198dc05171610073083c9d218d2a9adfa756659b391183d21cca55f888f1
- md5: b600c47282ee91e492b89f65708a5c9a
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.6
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15082636
- timestamp: 1766109482825
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py311h9c22a71_1.conda
- sha256: 668cfbfb7960df5fff0e2db2677eb00d9e02ee1ce63cc9b1c985d782dacab2fe
- md5: 0635502eadb751abecd2c68af249f50f
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.11,<3.12.0a0
- - python_abi 3.11.* *_cp311
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15241561
- timestamp: 1779876161272
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py313hff732fb_0.conda
- sha256: 7b351554b9256468ebcd0233c5ec6c74a3384a4d1298399a48c048037a56ff6c
- md5: cf669ec96a5d028c8fa2bd1620ad50cb
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.13,<3.14.0a0
- - python_abi 3.13.* *_cp313t
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15201678
- timestamp: 1771881882965
-- conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py314h221f224_1.conda
- sha256: f807e97b237b8528118557ef05073a9f4586c845f2431b25466aa88d268e7274
- md5: 4e015e3de1f22a035a29ceba386f91aa
- depends:
- - libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - liblapack >=3.9.0,<4.0a0
- - numpy <2.7
- - numpy >=1.23,<3
- - numpy >=1.25.2
- - python >=3.14,<3.15.0a0
- - python_abi 3.14.* *_cp314
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 15229740
- timestamp: 1779876154782
-- conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda
- sha256: 1ad2f42ff6c94256ab79ab1c5725d322a4e11737bd4dd91454feeff978f4cf38
- md5: b9b2c54ede806361393491042f0835aa
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: BSL-1.0
- run_exports:
- weak:
- - sleef >=3.9.0,<4.0a0
- size: 2294375
- timestamp: 1756275262440
-- conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda
- sha256: 8a4053839b8e997a5965e2dff7d6cf3c77be62d82c0e48c8a04a5ed2d2e73035
- md5: 8ee01a693aecff5432069eaaf1183c45
- depends:
- - libhwloc >=2.13.0,<2.13.1.0a0
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: Apache-2.0
- license_family: APACHE
- run_exports: {}
- size: 156515
- timestamp: 1778673901757
-- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3
- md5: 0481bfd9814bf525bd4b3ee4b51494c4
- depends:
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- license: TCL
- license_family: BSD
- run_exports:
- weak:
- - tk >=8.6.13,<8.7.0a0
- size: 3526350
- timestamp: 1769460339384
-- conda: https://prefix.dev/conda-forge/win-64/typos-1.47.2-h18a1a76_0.conda
- sha256: 57733df814fe8ba1d44308fe6f4308f10bd52e3bb15fb8864deb0f48c22596ce
- md5: 38d2545c9b79d4c084acbffc61e48860
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT OR Apache-2.0
- run_exports: {}
- size: 2913377
- timestamp: 1780547328960
-- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5
- md5: 71b24316859acd00bdb8b38f5e2ce328
- constrains:
- - vc14_runtime >=14.29.30037
- - vs2015_runtime >=14.29.30037
- license: LicenseRef-MicrosoftWindowsSDK10
- run_exports: {}
- size: 694692
- timestamp: 1756385147981
-- conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- sha256: 7f6895613b63c95cf4c6ab21a6328062ecd718af4291a79953f6c75b46860a0e
- md5: 02d76919b926678c036e788bfdfba94e
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: Apache-2.0 OR MIT
- run_exports: {}
- size: 19723722
- timestamp: 1780539201250
-- conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- sha256: 61b68e5a4fc71a17f8d64b12e013a2f971ad980bd08e9c389d5e68efe1a67de0
- md5: 774568633f3b26d7a4a6dd4f9ea6d3e1
- depends:
- - vc14_runtime >=14.51.36231
- track_features:
- - vc14
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 20187
- timestamp: 1780005880049
-- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- sha256: 957c7c65583c7107a5e76f39756c6361fcb7b0dc101ac7c0aea86e7ca09fe49c
- md5: 2cdcd8ea1010920911bb2eacb4c61227
- depends:
- - ucrt >=10.0.20348.0
- - vcomp14 14.51.36231 h1b9f54f_38
- constrains:
- - vs2015_runtime 14.51.36231.* *_38
- license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
- license_family: Proprietary
- run_exports: {}
- size: 740997
- timestamp: 1780005875753
-- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- sha256: c645fdc1f0f47718431d973386e946754a10200e7ba2c32032560913a970cacd
- md5: 63ee70d69d7540e821940dac5d4d9ba2
- depends:
- - ucrt >=10.0.20348.0
- constrains:
- - vs2015_runtime 14.51.36231.* *_38
- license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
- license_family: Proprietary
- run_exports:
- strong:
- - vcomp14 >=14.51.36231
- size: 123561
- timestamp: 1780005858779
-- conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_38.conda
- sha256: c4f38268563dc6b8322b0191481e5d20002fc6e37b076c15e0b955a553c8b4a0
- md5: 6033851d921b6c33f1c3018205fcba6a
- depends:
- - vc14_runtime >=14.51.36231
- license: BSD-3-Clause
- license_family: BSD
- run_exports: {}
- size: 20170
- timestamp: 1780005880423
-- conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda
- sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309
- md5: 433699cba6602098ae8957a323da2664
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports:
- weak:
- - yaml >=0.2.5,<0.3.0a0
- size: 63944
- timestamp: 1753484092156
-- conda: https://prefix.dev/conda-forge/win-64/zizmor-1.25.2-h18a1a76_0.conda
- sha256: 61a793d1666b9687756874b18018496680135740ed70e968dcf3d8afe92090b4
- md5: a372a2f8ae0198e10d6f8b9ea7bd1427
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- license: MIT
- license_family: MIT
- run_exports: {}
- size: 7232434
- timestamp: 1778922195362
-- conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
- sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2
- md5: 053b84beec00b71ea8ff7a4f84b55207
- depends:
- - vc >=14.3,<15
- - vc14_runtime >=14.44.35208
- - ucrt >=10.0.20348.0
- - libzlib >=1.3.1,<2.0a0
- license: BSD-3-Clause
- license_family: BSD
- run_exports:
- weak:
- - zstd >=1.5.7,<1.6.0a0
- size: 388453
- timestamp: 1764777142545
-- conda_source: array-api-extra[192fdc2f] @ .
- variants:
- target_platform: noarch
- depends:
- - array-api-compat
- - python >=3.11
- - python *
- license: MIT
- host_packages:
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda
- - conda: https://prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.7-h19cb2f5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h8f8c405_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/python-3.14.5-h7c6738f_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
- - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.19-hbe083cb_0.conda
- - conda: https://prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
-- conda_source: array-api-extra[24d19263] @ .
- variants:
- target_platform: noarch
- depends:
- - array-api-compat
- - python >=3.11
- - python *
- license: MIT
- host_packages:
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.7-h55c6f16_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.14.5-h4c637c5_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.19-hc169f86_0.conda
- - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
-- conda_source: array-api-extra[2e1bead4] @ .
- variants:
- target_platform: noarch
- depends:
- - array-api-compat
- - python >=3.11
- - python *
- license: MIT
- host_packages:
- - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
- - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
- - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.19-h26efc2c_0.conda
- - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
-- conda_source: array-api-extra[a6b7f981] @ .
- variants:
- target_platform: noarch
- depends:
- - array-api-compat
- - python >=3.11
- - python *
- license: MIT
- host_packages:
- - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.5.20-h4c7d964_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda
- - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
- - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda
- - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda
- - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda
- - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda
- - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/python-3.14.5-h4b44e0e_100_cp314.conda
- - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda
- - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.19-h2229357_0.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_38.conda
- - conda: https://prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
diff --git a/pixi.toml b/pixi.toml
deleted file mode 100644
index 6872dec9..00000000
--- a/pixi.toml
+++ /dev/null
@@ -1,218 +0,0 @@
-[workspace]
-channels = ["https://prefix.dev/conda-forge"]
-platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"]
-preview = ["pixi-build"]
-requires-pixi = ">=0.68.0"
-
-### array-api-extra package definition ###
-
-[package.build.backend]
-name = "pixi-build-python"
-version = "*"
-
-[package.host-dependencies]
-meson-python = "*"
-
-[package.run-dependencies]
-array-api-compat = "*"
-
-### workspace environments ###
-
-[environments]
-default = { features = ["py314"], solve-group = "py314" }
-lint = { features = ["py314", "lint"], solve-group = "py314" }
-docs = { features = ["py314", "docs"], solve-group = "py314" }
-tests = { features = ["py314", "tests"], solve-group = "py314" }
-tests-py314 = { features = ["py314", "tests"], solve-group = "py314" } # alias of tests
-tests-run-deps = { features = ["py314", "tests-run-deps"], solve-group = "py314" }
-
-# Some backends may pin numpy; use separate solve-group
-dev = { features = ["py314", "lint", "tests", "docs", "dev", "backends"], solve-group = "backends" }
-tests-backends = { features = ["py314", "tests", "backends"], solve-group = "backends" }
-tests-backends-py311 = { features = ["py311", "tests", "backends"] }
-
-# CUDA not available on free github actions and on some developers' PCs
-dev-cuda = { features = ["py314", "lint", "tests", "docs", "dev", "backends", "cuda-backends"], solve-group = "cuda" }
-tests-cuda = { features = ["py314", "tests", "backends", "cuda-backends"], solve-group = "cuda" }
-tests-cuda-py311 = { features = ["py311", "tests", "backends", "cuda-backends"] }
-
-# Ungrouped environments
-tests-numpy1 = ["py311", "tests", "numpy1"]
-tests-py311 = ["py311", "tests"]
-tests-nogil = ["nogil", "tests"]
-
-### default feature definition ###
-
-[dev]
-# this pulls in array-api-extra's host and run dependencies
-array-api-extra.path = "."
-
-[dependencies]
-array-api-extra.path = "."
-
-### non-default feature definitions ###
-
-[feature.lint.dependencies]
-typing-extensions = ">=4.15.0"
-pylint = ">=4.0.5"
-mypy = ">=2.1.0"
-basedpyright = ">=1.39.7"
-numpydoc = ">=1.10.0,<2"
-# import dependencies for mypy:
-array-api-strict = ">=2.5,<2.6"
-numpy = ">=2.1.3"
-hypothesis = ">=6.153.2"
-dask-core = ">=2026.3.0" # No distributed, tornado, etc.
-dprint = ">=0.50.0,<0.51"
-lefthook = ">=2.1.9,<3"
-ruff = ">=0.15.16,<0.16"
-typos = ">=1.47.2,<2"
-actionlint = ">=1.7.12,<2"
-blacken-docs = ">=1.20.0,<2"
-pytest = ">=9.0.3,<10"
-validate-pyproject = ">=0.25,<0.26"
-pyrefly = ">=1.0.0,<1.1"
-zizmor = ">=1.25.2,<1.26"
-# NOTE: don't add cupy, jax, pytorch, or sparse here,
-# as they slow down mypy and are not portable across target OSs
-
-[feature.lint.tasks]
-lefthook = { cmd = "lefthook", description = "Run lefthook", default-environment = "lint" }
-hooks = { cmd = "lefthook install", description = "Install pre-commit hooks", default-environment = "lint" }
-pre-commit = { cmd = "lefthook run pre-commit", description = "Run pre-commit checks", default-environment = "lint" }
-pylint = { cmd = "pylint array_api_extra", cwd = "src", description = "Lint with pylint", default-environment = "lint" }
-mypy = { cmd = "mypy", description = "Type check with mypy", default-environment = "lint" }
-pyrefly = { cmd = "pyrefly check", description = "Type check with pyrefly", default-environment = "lint" }
-pyright = { cmd = "basedpyright", description = "Type check with basedpyright", default-environment = "lint" }
-ruff-check = { cmd = "ruff check --fix", description = "Lint with ruff", default-environment = "lint" }
-ruff-format = { cmd = "ruff format", description = "Format with ruff", default-environment = "lint" }
-dprint = { cmd = "dprint fmt", description = "Format with dprint", default-environment = "lint" }
-typos = { cmd = "typos --write-changes --force-exclude", description = "Fix typos", default-environment = "lint" }
-actionlint = { cmd = "actionlint", description = "Lint actions with actionlint", default-environment = "lint" }
-zizmor = { cmd = "zizmor .github -p", description = "GHA static analysis with zizmor", default-environment = "lint" }
-blacken-docs = { cmd = "blacken-docs", description = "Format Python markdown blocks with Black", default-environment = "lint" }
-validate-pyproject = { cmd = "validate-pyproject pyproject.toml", description = "Validate pyproject.toml", default-environment = "lint" }
-numpydoc = { cmd = "numpydoc lint", description = "Validate docstrings with numpydoc", default-environment = "lint" }
-lint = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all linters", default-environment = "lint" }
-
-[feature.tests.dependencies]
-pytest = ">=9.0.3"
-pytest-cov = ">=7.1.0"
-hypothesis = ">=6.153.2"
-array-api-strict = ">=2.5,<2.6"
-numpy = ">=1.22.0"
-scipy = ">=1.15.2,<2"
-
-[feature.tests.tasks]
-tests = { cmd = "pytest -v", description = "Run tests", default-environment = "tests" }
-tests-cov = { cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20", description = "Run tests with coverage", default-environment = "tests" }
-
-clean-vendor-compat = { cmd = "rm -rf vendor_tests/array_api_compat", description = "Delete the existing vendored version of array-api-compat", default-environment = "tests" }
-clean-vendor-extra = { cmd = "rm -rf vendor_tests/array_api_extra", description = "Delete the existing vendored version of array-api-extra", default-environment = "tests" }
-copy-vendor-compat = { cmd = "cp -r $(python -c 'import site; print(site.getsitepackages()[0])')/array_api_compat vendor_tests/ && rm -rf vendor_tests/array_api_compat/vendor_tests && rm -rf vendor_tests/array_api_compat/tests", depends-on = ["clean-vendor-compat"], description = "Vendor a clean copy of array-api-compat", default-environment = "tests" }
-copy-vendor-extra = { cmd = "cp -r src/array_api_extra vendor_tests/", depends-on = ["clean-vendor-extra"], description = "Vendor a clean copy of array-api-extra", default-environment = "tests" }
-tests-vendor = { cmd = "pytest -v vendor_tests", depends-on = ["copy-vendor-compat", "copy-vendor-extra"], description = "Check that array-api-extra and array-api-compat can be vendored together", default-environment = "tests" }
-
-tests-ci = { depends-on = ["tests-cov", "tests-vendor"], description = "Run tests with coverage and vendor tests" }
-coverage = { cmd = "coverage html", depends-on = ["tests-cov"], description = "Generate test coverage html report", default-environment = "tests" }
-open-coverage = { cmd = "open htmlcov/index.html", depends-on = ["coverage"], description = "Open test coverage report", default-environment = "tests" }
-
-# tests with only run dependencies
-[feature.tests-run-deps.dependencies]
-pytest = ">=9.0.3"
-pytest-cov = ">=7.1.0"
-
-[feature.tests-run-deps.tasks.tests-run-deps]
-cmd = "pytest -v run_deps_tests"
-description = "Run run-dependency tests"
-default-environment = "tests-run-deps"
-
-[feature.tests-run-deps.tasks.tests-run-deps-cov]
-cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20 run_deps_tests"
-description = "Run run-dependency tests with coverage"
-default-environment = "tests-run-deps"
-
-[feature.docs.dependencies]
-sphinx = ">=7.4.7"
-furo = ">=2025.12.19"
-myst-parser = ">=5.1.0"
-sphinx-copybutton = ">=0.5.2"
-sphinx-autodoc-typehints = ">=1.25.3"
-# Needed to import parsed modules with autodoc
-dask-core = ">=2026.3.0" # No distributed, tornado, etc.
-pytest = ">=9.0.3"
-typing-extensions = ">=4.15.0"
-numpy = ">=2.1.3"
-
-[feature.docs.tasks]
-docs = { cmd = "sphinx-build -E -W . build/", cwd = "docs", description = "Build docs", default-environment = "docs" }
-open-docs = { cmd = "open build/index.html", cwd = "docs", depends-on = ["docs"], description = "Open the generated docs", default-environment = "docs" }
-
-[feature.dev.dependencies]
-ipython = ">=9.14.1"
-
-[feature.dev.tasks]
-ipython = { cmd = "ipython", description = "Launch ipython", default-environment = "dev" }
-
-[feature.py311.dependencies]
-python = "~=3.11.0"
-
-[feature.py314.dependencies]
-python = "~=3.14.0"
-
-[feature.numpy1.dependencies]
-# Oldest NumPy version supported by scikit-learn.
-# Note that this is older than what SPEC0 recommends.
-numpy = "=1.24.1"
-
-# Backends that can run on CPU-only hosts
-# Note: JAX and PyTorch will install CPU variants.
-[feature.backends.dependencies]
-pytorch = ">=2.10.0"
-dask-core = ">=2026.3.0" # No distributed, tornado, etc.
-sparse = ">=0.18.0"
-
-[feature.backends.target.linux-64.dependencies]
-jax = ">=0.9.2"
-
-[feature.backends.target.osx-64.dependencies]
-jax = ">=0.9.2"
-
-[feature.backends.target.osx-arm64.dependencies]
-jax = ">=0.9.2"
-
-[feature.backends.target.win-64.dependencies]
-# jax = "*" # unavailable
-
-# Backends that require a GPU host and a CUDA driver.
-# Note that JAX and PyTorch automatically prefer CUDA variants
-# thanks to the `system-requirements` below, *if available*.
-# We request them explicitly below to ensure that we don't
-# quietly revert to CPU-only in the future, e.g. when CUDA 13
-# is released and CUDA 12 builds are dropped upstream.
-[feature.cuda-backends]
-system-requirements = { cuda = "12" }
-
-[feature.cuda-backends.target.linux.dependencies]
-cupy = ">=14.1.1"
-jaxlib = { version = ">=0.9.2", build = "cuda12*" }
-pytorch = { version = ">=2.10.0", build = "cuda12*" }
-
-[feature.cuda-backends.target.osx.dependencies]
-# cupy = "*" # unavailable
-# jaxlib = { version = "*", build = "cuda12*" } # unavailable
-# pytorch = { version = "*", build = "cuda12*" } # unavailable
-
-[feature.cuda-backends.target.win.dependencies]
-cupy = ">=14.1.1"
-# jaxlib = { version = "*", build = "cuda12*" } # unavailable
-pytorch = { version = ">=2.10.0", build = "cuda12*" }
-
-[feature.nogil.dependencies]
-python-freethreading = "~=3.13.0"
-pytest-run-parallel = ">=0.9.1"
-numpy = ">=2.3.5"
-# pytorch = "*" # Not available on Python 3.13t yet
-dask-core = ">=2026.3.0" # No distributed, tornado, etc.
-# sparse = "*" # numba not available on Python 3.13t yet
-# jax = "*" # ml_dtypes not available on Python 3.13t yet
diff --git a/pyproject.toml b/pyproject.toml
deleted file mode 100644
index 7555123d..00000000
--- a/pyproject.toml
+++ /dev/null
@@ -1,227 +0,0 @@
-[build-system]
-requires = ["meson-python"]
-build-backend = "mesonpy"
-
-[project]
-name = "array-api-extra"
-version = "0.11.1.dev0"
-authors = [
- { name = "Lucas Colley", email = "lucas.colley8@gmail.com" },
- # { name = "Open Source Contributors" }, # https://github.com/pypi/warehouse/issues/14813
-]
-description = "Extra array functions built on top of the array API standard."
-readme = "README.md"
-license = "MIT"
-license-files = ["LICENSE"]
-requires-python = ">=3.11"
-classifiers = [
- "Intended Audience :: Developers",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: 3.13",
- "Programming Language :: Python :: 3.14",
- "Programming Language :: Python :: Free Threading :: 3 - Stable",
- "Typing :: Typed",
-]
-dependencies = ["array-api-compat>=1.15.0,<2"]
-
-[project.urls]
-Homepage = "https://github.com/data-apis/array-api-extra"
-"Bug Tracker" = "https://github.com/data-apis/array-api-extra/issues"
-Changelog = "https://github.com/data-apis/array-api-extra/releases"
-
-# pytest
-
-[tool.pytest.ini_options]
-minversion = "6.0"
-addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
-xfail_strict = true
-filterwarnings = ["error"]
-log_cli_level = "INFO"
-testpaths = ["tests"]
-markers = [
- "skip_xp_backend(library, /, *, reason=None): Skip test for a specific backend",
- "xfail_xp_backend(library, /, *, reason=None, strict=None): Xfail test for a specific backend",
-]
-
-# Coverage
-
-[tool.coverage]
-run.source = ["array_api_extra"]
-
-# mypy
-
-[tool.mypy]
-files = ["src", "tests", "vendor_tests", "run_deps_tests"]
-python_version = "3.11"
-warn_unused_configs = true
-strict = true
-enable_error_code = ["ignore-without-code", "truthy-bool"]
-disable_error_code = ["no-any-return"]
-
-[[tool.mypy.overrides]]
-# slow or unavailable on Windows; do not add to the lint env
-module = ["cupy.*", "jax.*", "sparse.*", "torch.*"]
-ignore_missing_imports = true
-
-[[tool.mypy.overrides]]
-module = ["tests/*"]
-disable_error_code = ["no-untyped-def"] # test(...) without -> None
-
-[[tool.mypy.overrides]]
-module = ["vendor_tests/*"]
-disable_error_code = ["no-untyped-def"] # test(...) without -> None
-
-[[tool.mypy.overrides]]
-module = ["vendor_tests/array_api_compat/*"]
-ignore_errors = true
-
-[[tool.mypy.overrides]]
-module = ["run_deps_tests/*"]
-disable_error_code = ["no-untyped-def"] # test(...) without -> None
-
-# pyrefly
-
-[tool.pyrefly.errors]
-# Redundant with mypy checks
-missing-import = false
-# extra checks from scipy/scipy-stubs
-implicit-abstract-class = "error"
-implicitly-defined-attribute = "error"
-missing-override-decorator = "error"
-missing-source = "ignore"
-not-required-key-access = "error"
-open-unpacking = "error"
-unannotated-attribute = "error"
-unannotated-parameter = "error"
-unannotated-return = "error"
-untyped-import = "error"
-unused-ignore = "error"
-variance-mismatch = "error"
-
-[[tool.pyrefly.sub-config]]
-matches = "tests/*.py"
-errors = { unannotated-return = false }
-
-[[tool.pyrefly.sub-config]]
-matches = "vendor_tests/*.py"
-errors = { unannotated-return = false }
-
-[[tool.pyrefly.sub-config]]
-matches = "run_deps_tests/*.py"
-errors = { unannotated-return = false }
-
-# pyright
-
-[tool.basedpyright]
-include = ["src", "tests", "vendor_tests", "run_deps_tests"]
-exclude = ["vendor_tests/array_api_compat"]
-pythonVersion = "3.11"
-pythonPlatform = "All"
-typeCheckingMode = "all"
-
-# https://github.com/data-apis/array-api-typing
-reportAny = false
-reportExplicitAny = false
-# no array-api-strict type stubs; pytest fixtures
-reportUnknownMemberType = false
-# no array-api-compat type stubs; pytest fixtures
-reportUnknownVariableType = false
-# Redundant with mypy checks
-reportMissingImports = false
-reportMissingTypeStubs = false
-# false positives for input validation
-reportUnreachable = false
-# ruff handles this
-reportUnusedParameter = false
-# cyclic imports inside function bodies
-reportImportCycles = false
-# PyRight can't trace types in lambdas
-reportUnknownLambdaType = false
-# conflicts with https://docs.astral.sh/ruff/rules/explicit-string-concatenation/
-reportImplicitStringConcatenation = false
-
-executionEnvironments = [
- { root = "tests", reportPrivateUsage = false, reportUnknownArgumentType = false },
- { root = "vendor_tests", reportPrivateUsage = false, reportUnknownArgumentType = false },
- { root = "run_deps_tests", reportPrivateUsage = false, reportUnknownArgumentType = false },
- { root = "src" },
-]
-
-# Ruff
-
-[tool.ruff]
-target-version = "py311"
-
-[tool.ruff.lint]
-extend-select = [
- "B", # flake8-bugbear
- "F", # Pyflakes
- "I", # isort
- "E", # Pycodestyle
- "W", # Pycodestyle
- "N", # pep8-naming
- "ARG", # flake8-unused-arguments
- "C4", # flake8-comprehensions
- "EM", # flake8-errmsg
- "ICN", # flake8-import-conventions
- "ISC", # flake8-implicit-str-concat
- "G", # flake8-logging-format
- "PGH", # pygrep-hooks
- "PIE", # flake8-pie
- "PL", # pylint
- "PT", # flake8-pytest-style
- "PTH", # flake8-use-pathlib
- "RET", # flake8-return
- "RUF", # Ruff-specific
- "SIM", # flake8-simplify
- "T20", # flake8-print
- "UP", # pyupgrade
- "YTT", # flake8-2020
- "EXE", # flake8-executable
- "NPY", # NumPy specific rules
- "PD", # pandas-vet
- "UP", # Pyupgrade
-]
-ignore = [
- "PLR09", # Too many <...>
- "PLR2004", # Magic value used in comparison
- "ISC001", # Conflicts with formatter
- "N801", # Class name should use CapWords convention
- "N802", # Function name should be lowercase
- "N806", # Variable in function should be lowercase
- "PLC0415", # `import` should be at the top-level of a file
-]
-
-# Pylint
-
-[tool.pylint]
-py-version = "3.11"
-reports.output-format = "colorized"
-messages_control.disable = [
- "design", # ignore heavily opinionated design checks
- "fixme", # allow FIXME comments
- "line-too-long", # ruff handles this
- "unused-argument", # ruff handles this
- "missing-function-docstring", # numpydoc handles this
- "import-error", # mypy handles this
- "import-outside-toplevel", # optional dependencies
-]
-
-# numpydoc
-
-[tool.numpydoc_validation]
-checks = [
- "all", # report on all checks, except the below
- "EX01", # most docstrings do not need an example
- "SA01", # data-apis/array-api-extra#87
- "ES01", # most docstrings do not need an extended summary
-]
-exclude_files = [
- '^tests/.*',
- '^vendor_tests/.*',
-]
diff --git a/renovate.json b/renovate.json
deleted file mode 100644
index 24cfd0ac..00000000
--- a/renovate.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
- "extends": ["config:recommended", "helpers:pinGitHubActionDigests", ":automergeMinor"],
- "dependencyDashboardTitle": "META: Dependency Dashboard",
- "commitMessagePrefix": "deps:",
- "labels": ["dependencies"],
- "rangeStrategy": "bump",
- "constraints": {
- "pixi": ">=0.70.2"
- },
- "minimumReleaseAge": "14 days",
- "packageRules": [{
- "description": "Do not bump deps pinned with '~=' or '='.",
- "matchManagers": ["pixi"],
- "matchCurrentValue": "/^~?=/",
- "enabled": false
- }, {
- "description": "Do not bump requires-python.",
- "matchManagers": ["pep621"],
- "matchPackageNames": ["python"],
- "enabled": false
- }, {
- "description": "Schedule automerged GHA updates for the 15th of each month.",
- "matchManagers": ["github-actions"],
- "groupName": "gha",
- "schedule": ["* * 15 * *"],
- "automerge": true
- }, {
- "description": "Block PRs for updates blocked on dropping Python 3.11.",
- "matchManagers": ["pixi"],
- "matchUpdateTypes": ["major", "minor"],
- "matchPackageNames": ["numpy", "sphinx", "sphinx-autodoc-typehints"],
- "enabled": false
- }, {
- "description": "Block updating SciPy (bump manually alongside sklearn)",
- "matchManagers": ["pixi"],
- "matchUpdateTypes": ["major", "minor"],
- "matchPackageNames": ["scipy"],
- "enabled": false
- }, {
- "description": "Group Dask packages.",
- "matchPackageNames": ["dask", "dask-core"],
- "groupName": "dask"
- }, {
- "description": "Group JAX packages.",
- "matchPackageNames": ["jax", "jaxlib"],
- "groupName": "jax"
- }, {
- "description": "Schedule hypothesis monthly as releases are frequent.",
- "matchManagers": ["pixi"],
- "matchPackageNames": ["hypothesis"],
- "schedule": ["* * 10 * *"]
- }]
-}
diff --git a/run_deps_tests/test_run_deps.py b/run_deps_tests/test_run_deps.py
deleted file mode 100644
index 49a374ee..00000000
--- a/run_deps_tests/test_run_deps.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""Tests to run with only runtime dependencies."""
-
-import importlib
-
-import pytest
-
-import array_api_extra.testing as xpt
-
-
-def test_no_numpy() -> None:
- """Check `xpx.testing` assertion error message when NumPy is unavailable."""
- if importlib.util.find_spec("numpy") is not None: # pyright: ignore[reportAttributeAccessIssue]
- pytest.skip("Test for when `numpy` is not importable.")
- with pytest.raises(ImportError, match=r"assertion.*require.*numpy"):
- xpt.assert_equal(1, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
diff --git a/search.html b/search.html
new file mode 100644
index 00000000..38a0755d
--- /dev/null
+++ b/search.html
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+
+
+
+Search - array-api-extra 0.11.1.dev0 documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+ Expand
+
+
+
+
+
+ Light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dark mode
+
+
+
+
+
+
+ Auto light/dark, in light mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Auto light/dark, in dark mode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to top
+
+
+
+
+
+
+
Error
+
+ Please activate JavaScript to enable the search functionality.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © Consortium for Python Data API Standards
+
+ Made with
Sphinx and
@pradyunsg 's
+
+
Furo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/searchindex.js b/searchindex.js
new file mode 100644
index 00000000..497b4995
--- /dev/null
+++ b/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"alltitles":{"Assorted functions":[[0,null]],"Contributing":[[3,null]],"Contributors":[[4,null]],"Development workflow":[[3,"development-workflow"]],"How to add delegation to a function":[[3,"how-to-add-delegation-to-a-function"]],"How to contribute a new function":[[3,"how-to-contribute-a-new-function"]],"Installation":[[34,"installation"]],"Scope":[[34,"scope"]],"Testing utilities (xpx.testing)":[[2,null]],"Tools for lazy backends":[[1,null]],"Usage":[[34,"usage"]],"Vendoring":[[34,"vendoring"]],"Versioning":[[34,"versioning"]],"angle":[[5,null]],"apply_where":[[6,null]],"argpartition":[[7,null]],"array-api-extra":[[34,null]],"at":[[8,null]],"atleast_nd":[[9,null]],"broadcast_shapes":[[10,null]],"cov":[[11,null]],"create_diagonal":[[12,null]],"default_dtype":[[13,null]],"expand_dims":[[14,null]],"isclose":[[15,null]],"isin":[[16,null]],"kron":[[17,null]],"lazy_apply":[[18,null]],"nan_to_num":[[19,null]],"nunique":[[20,null]],"one_hot":[[21,null]],"pad":[[22,null]],"partition":[[23,null]],"searchsorted":[[24,null]],"setdiff1d":[[25,null]],"sinc":[[26,null]],"testing.assert_close":[[27,null]],"testing.assert_close_nulp":[[28,null]],"testing.assert_equal":[[29,null]],"testing.assert_less":[[30,null]],"testing.lazy_xp_function":[[31,null]],"testing.patch_lazy_xp_functions":[[32,null]],"union1d":[[33,null]]},"docnames":["api-assorted","api-lazy","api-testing","contributing","contributors","generated/array_api_extra.angle","generated/array_api_extra.apply_where","generated/array_api_extra.argpartition","generated/array_api_extra.at","generated/array_api_extra.atleast_nd","generated/array_api_extra.broadcast_shapes","generated/array_api_extra.cov","generated/array_api_extra.create_diagonal","generated/array_api_extra.default_dtype","generated/array_api_extra.expand_dims","generated/array_api_extra.isclose","generated/array_api_extra.isin","generated/array_api_extra.kron","generated/array_api_extra.lazy_apply","generated/array_api_extra.nan_to_num","generated/array_api_extra.nunique","generated/array_api_extra.one_hot","generated/array_api_extra.pad","generated/array_api_extra.partition","generated/array_api_extra.searchsorted","generated/array_api_extra.setdiff1d","generated/array_api_extra.sinc","generated/array_api_extra.testing.assert_close","generated/array_api_extra.testing.assert_close_nulp","generated/array_api_extra.testing.assert_equal","generated/array_api_extra.testing.assert_less","generated/array_api_extra.testing.lazy_xp_function","generated/array_api_extra.testing.patch_lazy_xp_functions","generated/array_api_extra.union1d","index"],"envversion":{"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1},"filenames":["api-assorted.md","api-lazy.md","api-testing.md","contributing.md","contributors.md","generated/array_api_extra.angle.rst","generated/array_api_extra.apply_where.rst","generated/array_api_extra.argpartition.rst","generated/array_api_extra.at.rst","generated/array_api_extra.atleast_nd.rst","generated/array_api_extra.broadcast_shapes.rst","generated/array_api_extra.cov.rst","generated/array_api_extra.create_diagonal.rst","generated/array_api_extra.default_dtype.rst","generated/array_api_extra.expand_dims.rst","generated/array_api_extra.isclose.rst","generated/array_api_extra.isin.rst","generated/array_api_extra.kron.rst","generated/array_api_extra.lazy_apply.rst","generated/array_api_extra.nan_to_num.rst","generated/array_api_extra.nunique.rst","generated/array_api_extra.one_hot.rst","generated/array_api_extra.pad.rst","generated/array_api_extra.partition.rst","generated/array_api_extra.searchsorted.rst","generated/array_api_extra.setdiff1d.rst","generated/array_api_extra.sinc.rst","generated/array_api_extra.testing.assert_close.rst","generated/array_api_extra.testing.assert_close_nulp.rst","generated/array_api_extra.testing.assert_equal.rst","generated/array_api_extra.testing.assert_less.rst","generated/array_api_extra.testing.lazy_xp_function.rst","generated/array_api_extra.testing.patch_lazy_xp_functions.rst","generated/array_api_extra.union1d.rst","index.md"],"indexentries":{"angle() (in module array_api_extra)":[[5,"array_api_extra.angle",false]],"apply_where() (in module array_api_extra)":[[6,"array_api_extra.apply_where",false]],"argpartition() (in module array_api_extra)":[[7,"array_api_extra.argpartition",false]],"assert_close() (in module array_api_extra.testing)":[[27,"array_api_extra.testing.assert_close",false]],"assert_close_nulp() (in module array_api_extra.testing)":[[28,"array_api_extra.testing.assert_close_nulp",false]],"assert_equal() (in module array_api_extra.testing)":[[29,"array_api_extra.testing.assert_equal",false]],"assert_less() (in module array_api_extra.testing)":[[30,"array_api_extra.testing.assert_less",false]],"at (class in array_api_extra)":[[8,"array_api_extra.at",false]],"atleast_nd() (in module array_api_extra)":[[9,"array_api_extra.atleast_nd",false]],"broadcast_shapes() (in module array_api_extra)":[[10,"array_api_extra.broadcast_shapes",false]],"cov() (in module array_api_extra)":[[11,"array_api_extra.cov",false]],"create_diagonal() (in module array_api_extra)":[[12,"array_api_extra.create_diagonal",false]],"default_dtype() (in module array_api_extra)":[[13,"array_api_extra.default_dtype",false]],"expand_dims() (in module array_api_extra)":[[14,"array_api_extra.expand_dims",false]],"isclose() (in module array_api_extra)":[[15,"array_api_extra.isclose",false]],"isin() (in module array_api_extra)":[[16,"array_api_extra.isin",false]],"kron() (in module array_api_extra)":[[17,"array_api_extra.kron",false]],"lazy_apply() (in module array_api_extra)":[[18,"array_api_extra.lazy_apply",false]],"lazy_xp_function() (in module array_api_extra.testing)":[[31,"array_api_extra.testing.lazy_xp_function",false]],"nan_to_num() (in module array_api_extra)":[[19,"array_api_extra.nan_to_num",false]],"nunique() (in module array_api_extra)":[[20,"array_api_extra.nunique",false]],"one_hot() (in module array_api_extra)":[[21,"array_api_extra.one_hot",false]],"pad() (in module array_api_extra)":[[22,"array_api_extra.pad",false]],"partition() (in module array_api_extra)":[[23,"array_api_extra.partition",false]],"patch_lazy_xp_functions() (in module array_api_extra.testing)":[[32,"array_api_extra.testing.patch_lazy_xp_functions",false]],"searchsorted() (in module array_api_extra)":[[24,"array_api_extra.searchsorted",false]],"setdiff1d() (in module array_api_extra)":[[25,"array_api_extra.setdiff1d",false]],"sinc() (in module array_api_extra)":[[26,"array_api_extra.sinc",false]],"union1d() (in module array_api_extra)":[[33,"array_api_extra.union1d",false]]},"objects":{"array_api_extra":[[5,0,1,"","angle"],[6,0,1,"","apply_where"],[7,0,1,"","argpartition"],[8,1,1,"","at"],[9,0,1,"","atleast_nd"],[10,0,1,"","broadcast_shapes"],[11,0,1,"","cov"],[12,0,1,"","create_diagonal"],[13,0,1,"","default_dtype"],[14,0,1,"","expand_dims"],[15,0,1,"","isclose"],[16,0,1,"","isin"],[17,0,1,"","kron"],[18,0,1,"","lazy_apply"],[19,0,1,"","nan_to_num"],[20,0,1,"","nunique"],[21,0,1,"","one_hot"],[22,0,1,"","pad"],[23,0,1,"","partition"],[24,0,1,"","searchsorted"],[25,0,1,"","setdiff1d"],[26,0,1,"","sinc"],[33,0,1,"","union1d"]],"array_api_extra.testing":[[27,0,1,"","assert_close"],[28,0,1,"","assert_close_nulp"],[29,0,1,"","assert_equal"],[30,0,1,"","assert_less"],[31,0,1,"","lazy_xp_function"],[32,0,1,"","patch_lazy_xp_functions"]]},"objnames":{"0":["py","function","Python function"],"1":["py","class","Python class"]},"objtypes":{"0":"py:function","1":"py:class"},"terms":{"00000000e":[19,26],"000j":19,"03943254e":26,"04551152e":26,"0j":5,"16236208e":26,"16434881e":26,"1d":[25,33],"1e":[15,27],"1j":5,"26137788e":26,"28000000e":19,"2e":15,"308j":19,"33872321e":26,"35489284e":26,"40918587e":26,"50444803e":26,"55914881e":26,"56826729e":26,"68206631e":26,"7976931348623157e":19,"79769313e":19,"84680802e":26,"89206682e":26,"89817183e":26,"90384387e":26,"92362781e":26,"A":[15,22,26,27,28,29,30,31],"After":3,"An":[6,9,11,12,16,21,24,28],"And":34,"At":[15,17],"Be":[15,34],"Each":21,"For":[3,8,15,16,18,19,26,27],"From":26,"Further":11,"I":17,"If":[3,6,7,8,9,11,14,15,16,17,18,19,21,22,23,25,27,28,29,30,31,32,34],"In":[8,17,23,31,34],"It":[6,7,18,20,34],"Not":19,"On":[6,8],"Should":24,"Some":34,"That":11,"The":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,33,34],"These":[2,34],"They":[18,33],"This":[4,6,8,10,13,16,18,24,26,27,28,29,30,31,32,33,34],"To":[3,34],"We":[4,34],"When":[8,18,31],"Where":[6,34],"With":11,"You":[3,6,8,31,34],"__all__":3,"__array_namespace_info__":13,"__init__":3,"__setitem__":8,"_array_api_compat_vendor":34,"_array_namespace_orig":34,"_backend":3,"_deleg":3,"_func":3,"_lib":3,"_meta":18,"aaron":4,"ab":[12,15,27,28],"abl":18,"abov":[3,8,12,15,19,31,32],"absolut":[15,27],"abstractcontextmanag":32,"accept":[10,18,27,28,29,30,31,34],"accident":8,"accord":30,"acquir":32,"across":[18,34],"actual":[10,27,28,29,30],"add":[8,15,31,34],"addit":[1,10,16,18,27,28,29,30],"adjac":28,"adri\u00e1n":4,"affect":16,"after_0":22,"after_n":22,"afterward":18,"agnost":[3,10,34],"agreement":[27,28,29,30],"aim":34,"albert":4,"algorithm":[16,34],"alias":26,"allow":[6,18,31,34],"allow_dask_comput":31,"along":[7,18,23,24],"alreadi":[3,33,34],"also":[2,3,14,18,26,34],"altern":[3,8,31],"alway":10,"amplitud":28,"ani":[3,4,18,26,27,28,29,30,31,34],"annot":[3,34],"anti":[8,26],"anymor":8,"api":[3,8,10,18],"appear":14,"append":21,"appli":[6,18,19,22],"applic":26,"appropri":[15,34],"approxim":27,"arang":17,"arbitrari":31,"arg":[6,18],"arg0":6,"arg1":6,"argsort":7,"argument":[3,5,6,18,24,26,27,31,34],"around":[18,31],"array":[3,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"array_api":[10,14,16,19,24],"array_api_compat":34,"array_api_extra":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"array_api_strict":[5,6,9,11,12,14,17,19,21,24,25,26,32],"array_namespac":[3,8,34],"arraylik":18,"arthur":4,"as_numpi":18,"asarray":[5,6,8,9,11,12,14,17,18,19,21,24,25,31],"ascend":24,"assert":28,"assert_allclos":27,"assert_array_almost_equal_nulp":28,"assert_array_equ":29,"assert_array_less":30,"assert_clos":[28,29,30],"assert_equ":27,"assertionerror":[27,28,29,30],"assum":[16,17,18,25,34],"assume_uniqu":[16,25],"athan":4,"atleast_nd":34,"atol":[15,27],"attempt":[18,31],"attribut":18,"auto":[16,18],"avail":[3,8,34],"avoid":8,"awar":31,"axe":[9,14,18,21,24],"axi":[5,7,11,14,21,22,23,24],"b":[6,8,15,16,17,27,31,33],"back":[8,18],"backend":[2,3,6,8,18,31,32,34],"backward":34,"bad":21,"bandlimit":26,"base":34,"batch":[11,24],"batch_dim":12,"becaus":31,"befor":[3,18,22,24],"before_0":22,"before_n":22,"behavior":[18,24],"behaviour":[1,8,19,31],"belong":[18,34],"benefici":8,"bernard":4,"best":8,"better":34,"binary_search":16,"block":17,"blockwis":18,"bool":[5,8,15,16,17,18,25,27,28,29,30,31],"boolean":[6,8,15],"bound":18,"bowhay":4,"broadcast":[6,10,15,18],"broadcast_array":10,"build":3,"built":[15,34],"bump":34,"burovski":4,"c":[17,31],"c_":11,"calcul":[16,18,25,26,28],"call":[3,7,8,18,23,31,32,34],"callabl":[6,18,31],"can":[3,8,16,17,18,20,25,31,32,34],"canari":31,"cardin":26,"cardinali":26,"carlo":4,"carre\u00f1o":4,"case":[15,16,17,34],"caus":[8,21],"cd":3,"chaitanya":4,"chang":[3,8,18],"check":[3,21,27,28,29,30],"check_dtyp":[27,28,29,30],"check_scalar":[27,28,29,30],"check_shap":[27,28,29,30],"choos":3,"chunk":[6,18],"circumv":31,"class":[3,8,21,31],"clear":[11,34],"clerc":4,"click":3,"clone":[3,34],"close":[15,27],"code":[3,31,34],"colley":4,"column":11,"com":[3,26],"combin":11,"come":34,"comfort":3,"commit":3,"common":[17,26],"companion":31,"compar":[15,28,30],"compare_al":16,"comparison":[15,25],"compat":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34],"compil":31,"complex":[5,6,7,13,15,17,18,19,22,23,25],"compliant":[8,18],"compon":19,"composit":17,"comput":[10,17,18,31,32,34],"cond":6,"conda":34,"condit":[6,28],"conflict":[27,29,30],"consid":[11,15,18,27],"constant":22,"constant_valu":22,"construct":[12,26],"consum":[3,31,34],"contain":[8,10,11,15,18,24,31],"context":32,"continu":26,"contribut":4,"contributor":3,"control":24,"conveni":13,"convers":31,"convert":[3,18,31],"copi":[8,22,23,34],"correct":8,"correl":11,"correspond":[22,27,33],"count":20,"counter":31,"counterclockwis":5,"covari":11,"cover":8,"coverag":[3,31],"cp":34,"cpu":18,"crash":[8,31],"creat":[3,23,34],"cuda":3,"cupi":[16,18],"current":[13,22,32,34],"cython":18,"d":[17,27,28,29,30],"dashboard":18,"dask":[1,6,8,10,16,18,20,31,32],"data":[3,6,7,15,19,24,28],"declar":31,"decor":32,"decreas":11,"def":[6,31,32,34],"default":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,31,33],"defin":[6,15,18,19,27,32],"definit":26,"deg":5,"degre":5,"del":8,"delay":18,"deleg":[10,34],"densif":18,"depend":[3,6,8,18,27,34],"deprec":[10,14,31,32],"dereferenc":8,"desir":[27,28,29,30],"detachhead":4,"determin":[6,16,34],"detriment":31,"dev":[3,34],"devic":[13,18],"diagon":12,"dict":6,"differ":[8,15,25,27,31],"differenti":26,"dimens":[9,11,17,21,24],"dimension":[8,11,24,26],"direct":[11,31],"disabl":[18,32],"disallow":18,"discret":26,"discuss":3,"display":[3,27,29,30],"distanc":28,"distribut":18,"dive":3,"diverg":8,"doc":[3,34],"docstr":[3,33,34],"doe":[6,8,34],"doesn":18,"domain":34,"don":[3,8],"done":3,"dot":3,"doubl":[27,28,29,30],"downstream":34,"dprint":3,"dr":34,"draft":34,"dtype":[5,8,9,11,12,13,14,17,18,19,21,24,25,26,27,28,29,30],"duplic":10,"e":[1,3,7,8,18,23,27,28,29,30,34],"eager":[18,31,32],"earli":31,"easi":3,"echo":34,"effect":[18,31],"effver":34,"either":[6,8,18,23,33,34],"element":[6,7,11,15,16,17,18,19,20,21,22,23,24,28],"elementwis":[6,26,30],"els":[6,34],"emoji":4,"en":26,"enabl":3,"encod":21,"end":[8,32],"enforc":8,"ensur":[3,8,32],"enter":3,"environ":[3,27,28,29,30],"ep":27,"epsilon":27,"equal":[9,15,22,23,24,26,27,28,29,30],"equal_nan":[15,27],"equat":15,"equival":[6,7,8,10,14,15,17,22,23],"eric":26,"err_msg":[27,29,30],"error":[14,27,29,30],"especi":15,"estim":11,"etc":8,"evalu":[6,15],"even":[6,21],"everywher":26,"evgeni":4,"exact":27,"examin":11,"exampl":[3,5,6,8,9,10,11,12,14,15,17,19,21,24,25,26,27,31,32,34],"except":[11,18,21,24,32],"exclus":[6,8],"execut":[18,31,32],"exist":[4,10,14,34],"expand":[9,14,21,31],"expect":[27,28,29,34],"experienc":3,"explicit":[6,8,17,31],"express":[6,8],"extend":17,"extens":34,"extra":3,"extrem":31,"eye":17,"f":[6,8],"f1":6,"f2":6,"face":18,"factor":26,"failur":[27,29,30],"fals":[5,6,8,15,16,18,25,27,28,29,30,31],"fan":4,"far":3,"featur":34,"feedback":3,"feel":3,"file":[3,34],"fill":[6,19],"fill_valu":[6,19],"filter":26,"final":16,"find":[24,25,33,34],"finfo":27,"finit":[15,19],"first":[17,24],"fit":18,"fixtur":[31,32],"fixturerequest":32,"flatten":[7,23,33],"float":[10,13,15,19,21,26,27,31],"float32":27,"float64":[5,11,17,21,26,27],"follow":[4,14,15,28,34],"forg":34,"found":[3,34],"fran\u00e7oi":4,"free":3,"full":3,"fulli":[18,31],"func":[18,31],"function":[1,6,7,8,10,11,15,17,18,23,24,26,27,28,29,30,31,32,33,34],"fundament":34,"g":[1,7,8,18,23,27,28,29,30,34],"garc\u00eda":4,"gauthier":4,"general":34,"generat":[3,34],"get":13,"girdhar":4,"github":3,"give":27,"given":[7,8,13,14,21,34],"glass":34,"global":[31,32],"go":31,"gommer":4,"gpu":18,"graph":[18,31],"greater":23,"grisel":4,"guarante":34,"guard":18,"guidanc":3,"guido":4,"haberland":4,"halfway":27,"hammudoglu":4,"hand":15,"happen":31,"hardcod":[27,28,29],"hardwar":3,"head":4,"help":2,"helper":[31,34],"higher":31,"hook":[3,34],"host":[3,18],"hot":21,"hous":34,"howev":[3,6],"html":26,"https":[3,26],"i0":17,"i1":17,"iN":17,"ideal":[8,26],"identif":34,"idx":8,"ignor":[16,31],"ii":11,"ij":11,"imaginari":19,"ime":11,"immedi":[8,18],"imperial":4,"implement":[3,7,8,10,23,34],"implicit":18,"import":[3,5,6,8,9,10,11,12,14,17,19,21,24,25,26,27,28,29,30,31,34],"importerror":[27,28,29,30],"imposs":3,"includ":[3,26,27,29,30],"incompat":34,"increas":[11,34],"index":[7,8,13,14,21,23,24],"indic":[7,8,11,21,24,34],"indirect":7,"individu":[3,6],"inexact":[19,27,28,29,30],"inf":[15,19],"infer":[5,6,7,8,9,11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34],"infin":19,"infinit":26,"inform":33,"initi":3,"innermost":11,"input":[3,5,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,26,27,31,33,34],"insert":[14,24],"insid":[8,18,34],"instal":3,"instead":[8,16,18,34],"int":[7,9,10,12,14,18,19,21,22,23,28,31],"int32":8,"int64":[9,11,12,14,17,24,25],"integ":8,"integr":[13,21],"intend":[2,34],"intent":31,"interact":3,"interfac":[3,27,28,29,30],"internal":[3,31,33,34],"interpol":26,"interpret":5,"invert":16,"invok":31,"ipython":3,"irwin":4,"isclos":27,"isinst":34,"isnan":19,"issu":[3,34],"j":[4,17],"j0":17,"j1":17,"jake":4,"jakirkham":4,"jax":[1,8,16,18,20,31,32,33],"jax_jit":31,"jit":[8,18,31,32,33],"jittabl":18,"jn":17,"jnp":8,"joren":4,"jt":17,"k":[12,17,23],"k0":17,"k1":17,"kernel":26,"key":4,"keyword":[6,18,19],"kind":[4,13,16,34],"kn":17,"know":[8,18,31,34],"known":[8,18,34],"kotlinisland":4,"kroneck":17,"kt":17,"kth":[7,23],"kwarg":[6,18,34],"lacot":4,"lanczo":26,"larg":[19,34],"larger":28,"largest":19,"last":[7,23,24,28],"later":[8,31],"latest":34,"layer":3,"lazi":[2,3,18,20,31,32],"lazili":18,"lazy_xp_funct":[3,32],"lazy_xp_modul":[31,32],"lead":12,"learn":34,"least":[9,15,17,31],"leav":3,"left":[23,24],"length":21,"less":30,"let":[31,34],"level":[11,34],"li":4,"librari":[3,8,32,34],"life":31,"like":[3,7,18,23,34],"limit":26,"line":[3,18],"linspac":26,"lint":3,"list":[3,22,31,32],"liter":[13,22,24],"ll":8,"local":3,"locat":[23,27],"log":[7,23],"look":34,"loop":24,"lower":27,"luca":4,"lundi":4,"m":[8,11,34],"machin":34,"made":[3,17],"magnitud":15,"maintain":24,"make":[3,18,26,31,34],"mamba":34,"manag":32,"mani":22,"map":16,"map_block":18,"map_overlap":18,"mark":[32,34],"martin":4,"mask":8,"match":[3,6,27,28,29,30],"materi":[18,31],"math":[10,15],"mathemat":26,"mathworld":26,"matric":11,"matrix":11,"matt":4,"maximum":[28,31],"may":[3,8,14,18,19,21,34],"md":3,"mean":[15,31,34],"meaning":18,"mechan":18,"memori":[16,18],"messag":[27,29,30],"met":28,"meta":18,"method":[8,16,28,31,32],"metric":18,"meurer":4,"might":[3,15],"mileag":34,"minim":34,"minimum":9,"mode":22,"model":34,"modifi":8,"modul":[31,32],"moduletyp":[3,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33],"monkey":[31,32],"monkeypatch":32,"move":3,"much":15,"multi":26,"multipl":[8,14,18,31,32],"must":[6,8,15,17,18,24,26,27,28,29,30,31,34],"mutual":6,"myarray":34,"myfunc":31,"mylib":34,"mymodul":31,"n":[7,11,17,23],"nake":31,"name":[18,26,31],"namespac":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"nan":[6,10,15,19,27],"narmax":34,"nativ":[8,10,18,34],"ndarray":[8,27,28,29,30],"ndim":[9,17,22,34],"ne":26,"nearest":28,"necessari":17,"need":[6,15,18,31,34],"negat":[11,12,14,19],"neil":4,"never":[8,18,31],"new":[9,14,21,34],"newaxi":14,"next":[3,24,34],"non":[10,15,18,19,31],"none":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"normal":[26,34],"note":[5,6,7,8,10,11,14,15,17,18,23,26,27,28,31,32,33],"now":3,"np":[8,31],"nulp":28,"num_class":21,"numba":18,"number":[9,15,17,19,20,21,28,31],"numer":15,"numpi":[2,8,10,11,16,17,18,27,28,29,30,31,32,33],"numpydoc":[3,34],"o":[7,23],"object":[5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33],"observ":11,"obtain":26,"occurr":8,"offset":12,"older":34,"olivi":4,"omar":4,"omit":[8,18,34],"onc":18,"one":[3,6,15,17,18,21,24,28,32],"onli":[3,6,8,18,22,25,26,27,28,29,30,31,34],"open":[3,34],"oper":[8,18],"opposit":11,"option":[8,16],"order":[7,15,23,24,30,31],"org":26,"organiz":17,"origin":8,"otherwis":[6,15,16,18,20,25,32,34],"output":[6,8,10,15,18,23,31],"outsid":31,"overload":[6,18],"overrid":34,"p":18,"packag":3,"pad_width":22,"page":34,"pair":22,"pamphil":4,"parallel":32,"param":32,"paramet":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"paramspec":18,"paramspeckwarg":18,"part":3,"partial":23,"particular":[8,18,34],"partit":7,"pass":[18,19,22,31,34],"patch":[31,32],"patch_lazy_xp_funct":31,"patrick":4,"pattern":[3,8,31],"pearu":4,"perfect":11,"perform":[6,7,8,27,28,29,30,31,34],"persist":[18,31,32],"peterson":4,"pi":[5,26],"pin":34,"pip":34,"pitarch":4,"pixi":[3,34],"place":[8,14,15,21,28,34],"plane":5,"pleas":34,"point":[3,15,19,26],"posit":[5,12,14,15,18,21,23,34],"possibl":[8,26,34],"pr":3,"practic":8,"pradyot":4,"pre":3,"preced":24,"precis":27,"prefer":3,"prepar":34,"prepend":[9,17],"present":[16,34],"prevent":18,"preview":3,"privat":3,"problemat":20,"process":[3,26],"produc":[27,28,29],"product":17,"project":[4,34],"prometheus":18,"promin":18,"promot":6,"prompt":3,"proport":26,"propos":3,"provid":[6,11,14,31,34],"pudota":4,"pure":[18,34],"pure_callback":18,"purpos":15,"put":34,"py":[3,31,34],"pypi":34,"pyright":3,"pytest":32,"python":[3,15,18,27,28,29,30,34],"pytorch":18,"r0":17,"r1":17,"radian":5,"rais":[8,18,21,27,28,29,30,31,32],"ralf":4,"ramo":4,"rang":5,"ranjan":4,"rare":15,"rather":31,"read":[8,18],"real":[5,13,19,24,26,31],"realiti":34,"reason":[18,27],"reassign":8,"receiv":18,"rechunk":18,"recommend":[18,34],"recurs":9,"reduc":18,"refer":[3,14,15,26,34],"regardless":10,"relat":[15,27,28],"relax":24,"releas":34,"remain":24,"remov":[3,10,14],"replac":[8,19,31],"report":3,"repositori":[3,34],"repres":11,"represent":[19,28],"request":32,"requir":[6,24,34],"res":9,"resampl":26,"reset":31,"reshap":17,"resourc":26,"result":[3,8,9,14,16,18,21,24,25],"return":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"reus":8,"revers":8,"right":[23,24],"risk":8,"rn":17,"robust":28,"roddi":4,"rough":27,"rout":8,"row":11,"roy":4,"rtol":[15,27],"rule":6,"run":[3,6,18,32],"runtimeerror":18,"s":[6,8,10,14,15,18,31,32,34],"s0":17,"s1":17,"safeti":18,"salman":4,"sampl":11,"sanit":31,"scalar":[6,15,17,18,27,28,29,30],"scale":[17,34],"schuck":4,"scientif":34,"scikit":34,"scipi":34,"search":[24,32],"second":17,"see":[2,3,15,33,34],"select":15,"separ":[3,19],"sequenc":[18,22],"set":[8,15,21,25,31,34],"shape":[7,8,10,11,12,14,15,16,17,18,21,23,24,26,27,28,29,30],"shell":3,"short":[26,31],"shorthand":13,"show":[11,19],"shown":[32,34],"side":[18,22,23,24,34],"sign":15,"signal":26,"signatur":3,"similar":[15,24,27,28,29,30,31,34],"simpli":[7,23],"simplifi":3,"sin":26,"sinc":[10,14],"sinc_funct":26,"sincfunct":26,"sine":26,"singl":[6,11,18,22],"sinus":26,"size":[10,21],"skip":3,"slice":24,"small":15,"smaller":[15,18,23,30],"smallest":17,"smart":31,"sn":17,"snippet":8,"some_static_arg":31,"someth":3,"soon":8,"sort":[16,23,24,25,33],"space":28,"spars":[8,18],"special":1,"specif":[2,4,18,34],"specifi":[7,14,31],"speed":[16,25],"sqrt":27,"src":[3,34],"st":17,"stabil":34,"stack":11,"stage":3,"standard":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33,34],"state":[8,21],"static":31,"static_argnam":31,"static_argnum":31,"stdlib":15,"step":3,"steppi":4,"still":31,"str":[6,16,27,29,30,31],"strict":[30,34],"structur":[17,34],"style":[3,34],"sub":3,"subset":[3,11],"suit":[3,32],"sum":34,"support":[8,10,11,14,22,34],"suppos":3,"sure":[3,15,31],"symmetr":15,"syntax":8,"sysidentpi":34,"system":[31,34],"t":[3,8,11,17,18,31],"tabl":16,"tag":[31,32],"take":26,"task":3,"term":34,"test":[1,3,15,16,34],"test_func":3,"test_myfunc":31,"test_mymodul":31,"th":23,"thank":[3,4],"themselv":[3,34],"think":3,"thoma":4,"thread":32,"thread_unsaf":32,"three":3,"threshold":15,"thus":16,"tim":4,"time":[26,31],"tl":34,"togeth":[11,15],"toler":[15,27,28],"tool":[2,34],"top":[3,34],"topk":[7,23],"torch":[7,16,23],"tracker":3,"transfer":18,"transfer_guard":18,"transit":2,"translat":31,"transpar":18,"treat":[11,15,18,24,31],"trigger":31,"trivial":18,"true":[5,6,8,9,15,16,17,18,25,27,28,29,30,31],"tupl":[6,10,14,17,18,22,31],"twice":8,"two":[6,8,11,15,17,23,25,27,28,29,30,31,33],"type":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"typic":[15,27,28,29,31,32,34],"undef":8,"undefin":[8,18,21,23],"uninstanti":31,"union":33,"uniqu":[14,16,20,25,33],"unit":28,"unknown":[10,18],"unlik":[15,31],"unlimit":31,"unnorm":26,"unsaf":32,"unspecifi":21,"unwrap":32,"updat":8,"us":34,"use":[2,3,6,7,8,10,12,15,16,18,19,22,23,26,27,31,34],"user":[18,19,31,34],"user_consum":31,"user_func":31,"user_prepares_input":31,"usual":21,"util":1,"uv":34,"v1":[10,14],"v2025":[10,14],"valid":[3,27],"valu":[6,8,15,16,19,21,22,23,24,25,26,31,33],"valueerror":[8,18],"vanderpla":4,"vanilla":31,"vari":[8,11,19,34],"variabl":[11,28],"varianc":11,"variant":31,"various":[26,34],"vector":[21,24],"verbatim":18,"verbos":[27,29,30],"veri":15,"version":[10,14,31],"versus":8,"via":[3,34],"visibl":18,"visual":17,"vs":[27,28,29,30],"w":26,"wait":3,"want":[3,8,18,31],"warn":32,"way":[8,23],"web":26,"weisstein":26,"welcom":[3,4],"well":[8,10,32,34],"whether":[8,15,16,27,28,29,30,31],"whole":[18,31],"whose":[11,20,21,28],"wiki":26,"wikipedia":26,"will":[6,7,8,10,14,15,16,18,19,23,31,34],"wise":15,"wish":34,"within":[15,31],"without":[18,31,34],"wolfram":26,"won":[8,18,31],"word":31,"work":[3,8,18,31,34],"worker":18,"worri":3,"wrap":[18,31,32],"wrapper":[18,31],"write":[3,8],"writeabl":8,"written":[18,34],"wrong":3,"x":[5,7,8,9,11,12,14,19,20,21,22,23,24,26,28,30,31,34],"x1":[24,25],"x2":[24,25],"x_0":11,"x_1":11,"x_2":11,"x_i":11,"x_j":11,"x_n":11,"xp":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"xpx":[5,6,8,9,10,11,12,14,17,19,21,24,25,26,27,34],"xs":34,"y":[8,11,14,19,30,31,34],"yet":15,"yield":32,"z":[5,8,31,34],"zaid":4,"zero":[15,19,21,22]},"titles":["Assorted functions","Tools for lazy backends","Testing utilities (xpx.testing)","Contributing","Contributors","angle","apply_where","argpartition","at","atleast_nd","broadcast_shapes","cov","create_diagonal","default_dtype","expand_dims","isclose","isin","kron","lazy_apply","nan_to_num","nunique","one_hot","pad","partition","searchsorted","setdiff1d","sinc","testing.assert_close","testing.assert_close_nulp","testing.assert_equal","testing.assert_less","testing.lazy_xp_function","testing.patch_lazy_xp_functions","union1d","array-api-extra"],"titleterms":{"How":3,"add":3,"angl":5,"api":34,"apply_wher":6,"argpartit":7,"array":34,"assert_clos":27,"assert_close_nulp":28,"assert_equ":29,"assert_less":30,"assort":0,"atleast_nd":9,"backend":1,"broadcast_shap":10,"contribut":3,"contributor":4,"cov":11,"create_diagon":12,"default_dtyp":13,"deleg":3,"develop":3,"expand_dim":14,"extra":34,"function":[0,3],"instal":34,"isclos":15,"isin":16,"kron":17,"lazi":1,"lazy_appli":18,"lazy_xp_funct":31,"nan_to_num":19,"new":3,"nuniqu":20,"one_hot":21,"pad":22,"partit":23,"patch_lazy_xp_funct":32,"scope":34,"searchsort":24,"setdiff1d":25,"sinc":26,"test":[2,27,28,29,30,31,32],"tool":1,"union1d":33,"usag":34,"util":2,"vendor":34,"version":34,"workflow":3,"xpx":2}})
\ No newline at end of file
diff --git a/src/array_api_extra/__init__.py b/src/array_api_extra/__init__.py
deleted file mode 100644
index 23b88043..00000000
--- a/src/array_api_extra/__init__.py
+++ /dev/null
@@ -1,61 +0,0 @@
-"""Extra array functions built on top of the array API standard."""
-
-from . import testing
-from ._delegation import (
- argpartition,
- atleast_nd,
- broadcast_shapes,
- cov,
- create_diagonal,
- expand_dims,
- isclose,
- isin,
- kron,
- nan_to_num,
- one_hot,
- pad,
- partition,
- searchsorted,
- setdiff1d,
- sinc,
- union1d,
-)
-from ._lib._at import at
-from ._lib._funcs import (
- angle,
- apply_where,
- default_dtype,
- nunique,
-)
-from ._lib._lazy import lazy_apply
-
-__version__ = "0.11.1.dev0"
-
-# pylint: disable=duplicate-code
-__all__ = [
- "__version__",
- "angle",
- "apply_where",
- "argpartition",
- "at",
- "atleast_nd",
- "broadcast_shapes",
- "cov",
- "create_diagonal",
- "default_dtype",
- "expand_dims",
- "isclose",
- "isin",
- "kron",
- "lazy_apply",
- "nan_to_num",
- "nunique",
- "one_hot",
- "pad",
- "partition",
- "searchsorted",
- "setdiff1d",
- "sinc",
- "testing",
- "union1d",
-]
diff --git a/src/array_api_extra/_delegation.py b/src/array_api_extra/_delegation.py
deleted file mode 100644
index 6a91bdb2..00000000
--- a/src/array_api_extra/_delegation.py
+++ /dev/null
@@ -1,1320 +0,0 @@
-"""Delegation to existing implementations for Public API Functions."""
-
-from collections.abc import Sequence
-from types import ModuleType
-from typing import Literal
-
-from ._lib import _funcs
-from ._lib._utils._compat import (
- array_namespace,
- is_cupy_namespace,
- is_dask_namespace,
- is_jax_namespace,
- is_numpy_namespace,
- is_pydata_sparse_namespace,
- is_torch_namespace,
-)
-from ._lib._utils._compat import device as get_device
-from ._lib._utils._helpers import asarrays, deprecated, eager_shape
-from ._lib._utils._typing import Array, DType
-
-__all__ = [
- "atleast_nd",
- "broadcast_shapes",
- "cov",
- "create_diagonal",
- "expand_dims",
- "isclose",
- "kron",
- "nan_to_num",
- "one_hot",
- "pad",
- "searchsorted",
- "sinc",
-]
-
-
-def atleast_nd(x: Array, /, *, ndim: int, xp: ModuleType | None = None) -> Array:
- """
- Recursively expand the dimension of an array to at least `ndim`.
-
- Parameters
- ----------
- x : array
- Input array.
- ndim : int
- The minimum number of dimensions for the result.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- An array with ``res.ndim`` >= `ndim`.
- If ``x.ndim`` >= `ndim`, `x` is returned.
- If ``x.ndim`` < `ndim`, `x` is expanded by prepending new axes
- until ``res.ndim`` equals `ndim`.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> x = xp.asarray([1])
- >>> xpx.atleast_nd(x, ndim=3, xp=xp)
- Array([[[1]]], dtype=array_api_strict.int64)
-
- >>> x = xp.asarray([[[1, 2],
- ... [3, 4]]])
- >>> xpx.atleast_nd(x, ndim=1, xp=xp) is x
- True
- """
- if xp is None:
- xp = array_namespace(x)
-
- if 1 <= ndim <= 2 and (
- is_numpy_namespace(xp)
- or is_jax_namespace(xp)
- or is_dask_namespace(xp)
- or is_cupy_namespace(xp)
- or is_torch_namespace(xp)
- ):
- return getattr(xp, f"atleast_{ndim}d")(x)
-
- return _funcs.atleast_nd(x, ndim=ndim, xp=xp)
-
-
-@deprecated(
- "`xpx.broadcast_shapes` is deprecated and will be removed in v1.0.0. "
- "`xp.broadcast_shapes` exists in the standard as of v2025.12."
-)
-def broadcast_shapes(
- *shapes: tuple[float | None, ...], xp: ModuleType | None = None
-) -> tuple[int | None, ...]:
- """
- Compute the shape of the broadcasted arrays.
-
- .. deprecated:: 0.11.0
- :func:`broadcast_shapes` is deprecated and will be removed in v1.0.0.
- :func:`array_api.broadcast_shapes` exists in the standard as of v2025.12.
-
- Duplicates :func:`numpy.broadcast_shapes`, with additional support for
- None and NaN sizes.
-
- Parameters
- ----------
- *shapes : tuple[int | None, ...]
- Shapes of the arrays to broadcast.
- xp : array_namespace, optional
- The standard-compatible namespace to use for native delegation.
- Default: use the array-agnostic implementation.
-
- Returns
- -------
- tuple[int | None, ...]
- The shape of the broadcasted arrays.
-
- See Also
- --------
- numpy.broadcast_shapes : Equivalent NumPy function.
- array_api.broadcast_arrays : Function to broadcast actual arrays.
-
- Notes
- -----
- This function accepts the Array API's ``None`` for unknown sizes,
- as well as Dask's non-standard ``math.nan``.
- Regardless of input, the output always contains ``None`` for unknown sizes.
-
- Examples
- --------
- >>> import array_api_extra as xpx
- >>> xpx.broadcast_shapes((2, 3), (2, 1))
- (2, 3)
- >>> xpx.broadcast_shapes((4, 2, 3), (2, 1), (1, 3))
- (4, 2, 3)
- """
- if (
- xp is not None
- and all(isinstance(size, int) for shape in shapes for size in shape)
- and (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_jax_namespace(xp)
- or is_torch_namespace(xp)
- )
- ):
- return xp.broadcast_shapes(*shapes)
-
- return _funcs.broadcast_shapes(*shapes)
-
-
-def cov(m: Array, /, *, xp: ModuleType | None = None) -> Array:
- """
- Estimate a covariance matrix (or a stack of covariance matrices).
-
- Covariance indicates the level to which two variables vary together.
- If we examine *N*-dimensional samples, :math:`X = [x_1, x_2, ... x_N]^T`,
- each with *M* observations, then element :math:`C_{ij}` of the
- :math:`N \times N` covariance matrix is the covariance of
- :math:`x_i` and :math:`x_j`. The element :math:`C_{ii}` is the variance
- of :math:`x_i`.
-
- With the exception of supporting batch input, this provides a subset of
- the functionality of ``numpy.cov``.
-
- Parameters
- ----------
- m : array
- An array of shape ``(..., N, M)`` whose innermost two dimensions
- contain *M* observations of *N* variables. That is,
- each row of `m` represents a variable, and each column a single
- observation of all those variables.
- xp : array_namespace, optional
- The standard-compatible namespace for `m`. Default: infer.
-
- Returns
- -------
- array
- An array having shape (..., N, N) whose innermost two dimensions represent
- the covariance matrix of the variables.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
-
- Consider two variables, :math:`x_0` and :math:`x_1`, which
- correlate perfectly, but in opposite directions:
-
- >>> x = xp.asarray([[0, 2], [1, 1], [2, 0]]).T
- >>> x
- Array([[0, 1, 2],
- [2, 1, 0]], dtype=array_api_strict.int64)
-
- Note how :math:`x_0` increases while :math:`x_1` decreases. The covariance
- matrix shows this clearly:
-
- >>> xpx.cov(x, xp=xp)
- Array([[ 1., -1.],
- [-1., 1.]], dtype=array_api_strict.float64)
-
- Note that element :math:`C_{0,1}`, which shows the correlation between
- :math:`x_0` and :math:`x_1`, is negative.
-
- Further, note how `x` and `y` are combined:
-
- >>> x = xp.asarray([-2.1, -1, 4.3])
- >>> y = xp.asarray([3, 1.1, 0.12])
- >>> X = xp.stack((x, y), axis=0)
- >>> xpx.cov(X, xp=xp)
- Array([[11.71 , -4.286 ],
- [-4.286 , 2.14413333]], dtype=array_api_strict.float64)
-
- >>> xpx.cov(x, xp=xp)
- Array(11.71, dtype=array_api_strict.float64)
-
- >>> xpx.cov(y, xp=xp)
- Array(2.14413333, dtype=array_api_strict.float64)
-
- Input with more than two dimensions is treated as a stack of
- two-dimensional input.
-
- >>> stack = xp.stack((X, 2*X))
- >>> xpx.cov(stack)
- Array([[[ 11.71 , -4.286 ],
- [ -4.286 , 2.14413333]],
-
- [[ 46.84 , -17.144 ],
- [-17.144 , 8.57653333]]], dtype=array_api_strict.float64)
- """
-
- if xp is None:
- xp = array_namespace(m)
-
- if (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_torch_namespace(xp)
- or is_dask_namespace(xp)
- or is_jax_namespace(xp)
- ) and m.ndim <= 2:
- return xp.cov(m)
-
- return _funcs.cov(m, xp=xp)
-
-
-def create_diagonal(
- x: Array, /, *, offset: int = 0, xp: ModuleType | None = None
-) -> Array:
- """
- Construct a diagonal array.
-
- Parameters
- ----------
- x : array
- An array having shape ``(*batch_dims, k)``.
- offset : int, optional
- Offset from the leading diagonal (default is ``0``).
- Use positive ints for diagonals above the leading diagonal,
- and negative ints for diagonals below the leading diagonal.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- An array having shape ``(*batch_dims, k+abs(offset), k+abs(offset))`` with `x`
- on the diagonal (offset by `offset`).
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> x = xp.asarray([2, 4, 8])
-
- >>> xpx.create_diagonal(x, xp=xp)
- Array([[2, 0, 0],
- [0, 4, 0],
- [0, 0, 8]], dtype=array_api_strict.int64)
-
- >>> xpx.create_diagonal(x, offset=-2, xp=xp)
- Array([[0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- [2, 0, 0, 0, 0],
- [0, 4, 0, 0, 0],
- [0, 0, 8, 0, 0]], dtype=array_api_strict.int64)
- """
- if xp is None:
- xp = array_namespace(x)
-
- if x.ndim == 0:
- err_msg = "`x` must be at least 1-dimensional."
- raise ValueError(err_msg)
-
- if is_torch_namespace(xp):
- return xp.diag_embed(x, offset=offset, dim1=-2, dim2=-1)
-
- if (
- is_dask_namespace(xp)
- or is_cupy_namespace(xp)
- or is_numpy_namespace(xp)
- or is_jax_namespace(xp)
- ) and (x.ndim < 2):
- return xp.diag(x, k=offset)
-
- return _funcs.create_diagonal(x, offset=offset, xp=xp)
-
-
-@deprecated(
- "`xpx.expand_dims` is deprecated and will be removed in v1.0.0. "
- "`xp.expand_dims` with support for a tuple of ints in `axis` "
- "exists in the standard as of v2025.12."
-)
-def expand_dims(
- a: Array, /, *, axis: int | tuple[int, ...] = (0,), xp: ModuleType | None = None
-) -> Array:
- """
- Expand the shape of an array.
-
- .. deprecated:: 0.11.0
- :func:`expand_dims` is deprecated and will be removed in v1.0.0.
- :func:`array_api.expand_dims` with support for a tuple of ints in `axis`
- exists in the standard as of v2025.12.
-
- Insert (a) new axis/axes that will appear at the position(s) specified by
- `axis` in the expanded array shape.
-
- Parameters
- ----------
- a : array
- Array to have its shape expanded.
- axis : int or tuple of ints, optional
- Position(s) in the expanded axes where the new axis (or axes) is/are placed.
- If multiple positions are provided, they should be unique (note that a position
- given by a positive index could also be referred to by a negative index -
- that will also result in an error).
- Default: ``(0,)``.
- xp : array_namespace, optional
- The standard-compatible namespace for `a`. Default: infer.
-
- Returns
- -------
- array
- `a` with an expanded shape.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> x = xp.asarray([1, 2])
- >>> x.shape
- (2,)
-
- The following is equivalent to ``x[xp.newaxis, :]`` or ``x[xp.newaxis]``:
-
- >>> y = xpx.expand_dims(x, axis=0, xp=xp)
- >>> y
- Array([[1, 2]], dtype=array_api_strict.int64)
- >>> y.shape
- (1, 2)
-
- The following is equivalent to ``x[:, xp.newaxis]``:
-
- >>> y = xpx.expand_dims(x, axis=1, xp=xp)
- >>> y
- Array([[1],
- [2]], dtype=array_api_strict.int64)
- >>> y.shape
- (2, 1)
-
- ``axis`` may also be a tuple:
-
- >>> y = xpx.expand_dims(x, axis=(0, 1), xp=xp)
- >>> y
- Array([[[1, 2]]], dtype=array_api_strict.int64)
-
- >>> y = xpx.expand_dims(x, axis=(2, 0), xp=xp)
- >>> y
- Array([[[1],
- [2]]], dtype=array_api_strict.int64)
- """
- if xp is None:
- xp = array_namespace(a)
-
- if not isinstance(axis, tuple):
- axis = (axis,)
- ndim = a.ndim + len(axis)
- if axis != () and (min(axis) < -ndim or max(axis) >= ndim):
- err_msg = (
- f"a provided axis position is out of bounds for array of dimension {a.ndim}"
- )
- raise IndexError(err_msg)
- axis = tuple(dim % ndim for dim in axis)
- if len(set(axis)) != len(axis):
- err_msg = "Duplicate dimensions specified in `axis`."
- raise ValueError(err_msg)
-
- if is_numpy_namespace(xp) or is_dask_namespace(xp) or is_jax_namespace(xp):
- return xp.expand_dims(a, axis=axis)
-
- return _funcs.expand_dims(a, axis=axis, xp=xp)
-
-
-def isclose(
- a: Array | complex,
- b: Array | complex,
- *,
- rtol: float = 1e-05,
- atol: float = 1e-08,
- equal_nan: bool = False,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Return a boolean array where two arrays are element-wise equal within a tolerance.
-
- The tolerance values are positive, typically very small numbers. The relative
- difference ``(rtol * abs(b))`` and the absolute difference `atol` are added together
- to compare against the absolute difference between `a` and `b`.
-
- NaNs are treated as equal if they are in the same place and if ``equal_nan=True``.
- Infs are treated as equal if they are in the same place and of the same sign in both
- arrays.
-
- Parameters
- ----------
- a, b : Array | int | float | complex | bool
- Input objects to compare. At least one must be an array.
- rtol : array_like, optional
- The relative tolerance parameter (see Notes).
- atol : array_like, optional
- The absolute tolerance parameter (see Notes).
- equal_nan : bool, optional
- Whether to compare NaN's as equal. If True, NaN's in `a` will be considered
- equal to NaN's in `b` in the output array.
- xp : array_namespace, optional
- The standard-compatible namespace for `a` and `b`. Default: infer.
-
- Returns
- -------
- Array
- A boolean array of shape broadcasted from `a` and `b`, containing ``True`` where
- `a` is close to `b`, and ``False`` otherwise.
-
- Warnings
- --------
- The default `atol` is not appropriate for comparing numbers with magnitudes much
- smaller than one (see notes).
-
- See Also
- --------
- math.isclose : Similar function in stdlib for Python scalars.
-
- Notes
- -----
- For finite values, `isclose` uses the following equation to test whether two
- floating point values are equivalent::
-
- absolute(a - b) <= (atol + rtol * absolute(b))
-
- Unlike the built-in `math.isclose`,
- the above equation is not symmetric in `a` and `b`,
- so that ``isclose(a, b)`` might be different from ``isclose(b, a)`` in some rare
- cases.
-
- The default value of `atol` is not appropriate when the reference value `b` has
- magnitude smaller than one. For example, it is unlikely that ``a = 1e-9`` and
- ``b = 2e-9`` should be considered "close", yet ``isclose(1e-9, 2e-9)`` is ``True``
- with default settings. Be sure to select `atol` for the use case at hand, especially
- for defining the threshold below which a non-zero value in `a` will be considered
- "close" to a very small or zero value in `b`.
-
- The comparison of `a` and `b` uses standard broadcasting, which means that `a` and
- `b` need not have the same shape in order for ``isclose(a, b)`` to evaluate to
- ``True``.
-
- `isclose` is not defined for non-numeric data types.
- ``bool`` is considered a numeric data-type for this purpose.
- """
- xp = array_namespace(a, b) if xp is None else xp
-
- if (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_dask_namespace(xp)
- or is_jax_namespace(xp)
- ):
- return xp.isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan)
-
- if is_torch_namespace(xp):
- a, b = asarrays(a, b, xp=xp) # Array API 2024.12 support
- return xp.isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan)
-
- return _funcs.isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan, xp=xp)
-
-
-def kron(
- a: Array | complex,
- b: Array | complex,
- /,
- *,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Kronecker product of two arrays.
-
- Computes the Kronecker product, a composite array made of blocks of the
- second array scaled by the first.
-
- Equivalent to ``numpy.kron`` for NumPy arrays.
-
- Parameters
- ----------
- a, b : Array | int | float | complex
- Input arrays or scalars. At least one must be an array.
- xp : array_namespace, optional
- The standard-compatible namespace for `a` and `b`. Default: infer.
-
- Returns
- -------
- array
- The Kronecker product of `a` and `b`.
-
- Notes
- -----
- The function assumes that the number of dimensions of `a` and `b`
- are the same, if necessary prepending the smallest with ones.
- If ``a.shape = (r0,r1,..,rN)`` and ``b.shape = (s0,s1,...,sN)``,
- the Kronecker product has shape ``(r0*s0, r1*s1, ..., rN*SN)``.
- The elements are products of elements from `a` and `b`, organized
- explicitly by::
-
- kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]
-
- where::
-
- kt = it * st + jt, t = 0,...,N
-
- In the common 2-D case (N=1), the block structure can be visualized::
-
- [[ a[0,0]*b, a[0,1]*b, ... , a[0,-1]*b ],
- [ ... ... ],
- [ a[-1,0]*b, a[-1,1]*b, ... , a[-1,-1]*b ]]
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> xpx.kron(xp.asarray([1, 10, 100]), xp.asarray([5, 6, 7]), xp=xp)
- Array([ 5, 6, 7, 50, 60, 70, 500,
- 600, 700], dtype=array_api_strict.int64)
-
- >>> xpx.kron(xp.asarray([5, 6, 7]), xp.asarray([1, 10, 100]), xp=xp)
- Array([ 5, 50, 500, 6, 60, 600, 7,
- 70, 700], dtype=array_api_strict.int64)
-
- >>> xpx.kron(xp.eye(2), xp.ones((2, 2)), xp=xp)
- Array([[1., 1., 0., 0.],
- [1., 1., 0., 0.],
- [0., 0., 1., 1.],
- [0., 0., 1., 1.]], dtype=array_api_strict.float64)
-
- >>> a = xp.reshape(xp.arange(100), (2, 5, 2, 5))
- >>> b = xp.reshape(xp.arange(24), (2, 3, 4))
- >>> c = xpx.kron(a, b, xp=xp)
- >>> c.shape
- (2, 10, 6, 20)
- >>> I = (1, 3, 0, 2)
- >>> J = (0, 2, 1)
- >>> J1 = (0,) + J # extend to ndim=4
- >>> S1 = (1,) + b.shape
- >>> K = tuple(xp.asarray(I) * xp.asarray(S1) + xp.asarray(J1))
- >>> c[K] == a[I]*b[J]
- Array(True, dtype=array_api_strict.bool)
- """
- if xp is None:
- xp = array_namespace(a, b)
-
- a, b = asarrays(a, b, xp=xp)
-
- if (
- is_cupy_namespace(xp)
- or is_jax_namespace(xp)
- or is_numpy_namespace(xp)
- or is_torch_namespace(xp)
- ):
- return xp.kron(a, b)
-
- return _funcs.kron(a, b, xp=xp)
-
-
-def nan_to_num(
- x: Array | float | complex,
- /,
- *,
- fill_value: int | float = 0.0,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Replace NaN with zero and infinity with large finite numbers (default behaviour).
-
- If `x` is inexact, NaN is replaced by zero or by the user defined value in the
- `fill_value` keyword, infinity is replaced by the largest finite floating
- point value representable by ``x.dtype``, and -infinity is replaced by the
- most negative finite floating point value representable by ``x.dtype``.
-
- For complex dtypes, the above is applied to each of the real and
- imaginary components of `x` separately.
-
- Parameters
- ----------
- x : array | float | complex
- Input data.
- fill_value : int | float, optional
- Value to be used to fill NaN values. If no value is passed
- then NaN values will be replaced with 0.0.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- `x`, with the non-finite values replaced.
-
- See Also
- --------
- array_api.isnan : Shows which elements are Not a Number (NaN).
-
- Examples
- --------
- >>> import array_api_extra as xpx
- >>> import array_api_strict as xp
- >>> xpx.nan_to_num(xp.inf)
- 1.7976931348623157e+308
- >>> xpx.nan_to_num(-xp.inf)
- -1.7976931348623157e+308
- >>> xpx.nan_to_num(xp.nan)
- 0.0
- >>> x = xp.asarray([xp.inf, -xp.inf, xp.nan, -128, 128])
- >>> xpx.nan_to_num(x)
- array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, # may vary
- -1.28000000e+002, 1.28000000e+002])
- >>> y = xp.asarray([complex(xp.inf, xp.nan), xp.nan, complex(xp.nan, xp.inf)])
- array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, # may vary
- -1.28000000e+002, 1.28000000e+002])
- >>> xpx.nan_to_num(y)
- array([ 1.79769313e+308 +0.00000000e+000j, # may vary
- 0.00000000e+000 +0.00000000e+000j,
- 0.00000000e+000 +1.79769313e+308j])
- """
- if isinstance(fill_value, complex):
- msg = "Complex fill values are not supported."
- raise TypeError(msg)
-
- xp = array_namespace(x) if xp is None else xp
-
- # for scalars we want to output an array
- y = xp.asarray(x)
-
- if (
- is_cupy_namespace(xp)
- or is_jax_namespace(xp)
- or is_numpy_namespace(xp)
- or is_torch_namespace(xp)
- ):
- return xp.nan_to_num(y, nan=fill_value)
-
- return _funcs.nan_to_num(y, fill_value=fill_value, xp=xp)
-
-
-def one_hot(
- x: Array,
- /,
- num_classes: int,
- *,
- dtype: DType | None = None,
- axis: int = -1,
- xp: ModuleType | None = None,
-) -> Array:
- """
- One-hot encode the given indices.
-
- Each index in the input `x` is encoded as a vector of zeros of length `num_classes`
- with the element at the given index set to one.
-
- Parameters
- ----------
- x : array
- An array with integral dtype whose values are between `0` and `num_classes - 1`.
- num_classes : int
- Number of classes in the one-hot dimension.
- dtype : DType, optional
- The dtype of the return value. Defaults to the default float dtype (usually
- float64).
- axis : int, optional
- Position in the expanded axes where the new axis is placed. Default: -1.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- An array having the same shape as `x` except for a new axis at the position
- given by `axis` having size `num_classes`. If `axis` is unspecified, it
- defaults to -1, which appends a new axis.
-
- If ``x < 0`` or ``x >= num_classes``, then the result is undefined, may raise
- an exception, or may even cause a bad state. `x` is not checked.
-
- Examples
- --------
- >>> import array_api_extra as xpx
- >>> import array_api_strict as xp
- >>> xpx.one_hot(xp.asarray([1, 2, 0]), 3)
- Array([[0., 1., 0.],
- [0., 0., 1.],
- [1., 0., 0.]], dtype=array_api_strict.float64)
- """
- # Validate inputs.
- if xp is None:
- xp = array_namespace(x)
- if not xp.isdtype(x.dtype, "integral"):
- msg = "x must have an integral dtype."
- raise TypeError(msg)
- if dtype is None:
- dtype = _funcs.default_dtype(xp, device=get_device(x))
- # Delegate where possible.
- if is_jax_namespace(xp):
- from jax.nn import one_hot as jax_one_hot
-
- return jax_one_hot(x, num_classes, dtype=dtype, axis=axis)
- if is_torch_namespace(xp):
- from torch.nn.functional import one_hot as torch_one_hot
-
- x = xp.astype(x, xp.int64) # PyTorch only supports int64 here.
- try:
- out = torch_one_hot(x, num_classes)
- except RuntimeError as e:
- raise IndexError from e
- else:
- out = _funcs.one_hot(x, num_classes, xp=xp)
- out = xp.astype(out, dtype, copy=False)
- if axis != -1:
- out = xp.moveaxis(out, -1, axis)
- return out
-
-
-def pad(
- x: Array,
- pad_width: int | tuple[int, int] | Sequence[tuple[int, int]],
- mode: Literal["constant"] = "constant",
- *,
- constant_values: complex = 0,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Pad the input array.
-
- Parameters
- ----------
- x : array
- Input array.
- pad_width : int or tuple of ints or sequence of pairs of ints
- Pad the input array with this many elements from each side.
- If a sequence of tuples, ``[(before_0, after_0), ... (before_N, after_N)]``,
- each pair applies to the corresponding axis of ``x``.
- A single tuple, ``(before, after)``, is equivalent to a list of ``x.ndim``
- copies of this tuple.
- mode : str, optional
- Only "constant" mode is currently supported, which pads with
- the value passed to `constant_values`.
- constant_values : python scalar, optional
- Use this value to pad the input. Default is zero.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- The input array,
- padded with ``pad_width`` elements equal to ``constant_values``.
- """
- xp = array_namespace(x) if xp is None else xp
-
- if mode != "constant":
- msg = "Only `'constant'` mode is currently supported"
- raise NotImplementedError(msg)
-
- if (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_jax_namespace(xp)
- or is_pydata_sparse_namespace(xp)
- ):
- return xp.pad(x, pad_width, mode, constant_values=constant_values)
-
- # https://github.com/pytorch/pytorch/blob/cf76c05b4dc629ac989d1fb8e789d4fac04a095a/torch/_numpy/_funcs_impl.py#L2045-L2056
- if is_torch_namespace(xp):
- pad_width = xp.asarray(pad_width)
- pad_width = xp.broadcast_to(pad_width, (x.ndim, 2))
- pad_width = xp.flip(pad_width, axis=(0,)).flatten()
- return xp.nn.functional.pad(x, tuple(pad_width), value=constant_values) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
- return _funcs.pad(x, pad_width, constant_values=constant_values, xp=xp)
-
-
-def searchsorted(
- x1: Array,
- x2: Array,
- /,
- *,
- side: Literal["left", "right"] = "left",
- xp: ModuleType | None = None,
-) -> Array:
- """
- Find indices where elements should be inserted to maintain order.
-
- Find the indices into a sorted array ``x1`` such that if the elements in ``x2``
- were inserted before the indices, the resulting array would remain sorted.
-
- The behavior of this function is similar to that of :func:`array_api.searchsorted`,
- but it relaxes the requirement that `x1` must be one-dimensional.
- This function is vectorized, treating slices along the last axis
- as elements and preceding axes as batch (or "loop") dimensions.
-
- Parameters
- ----------
- x1 : Array
- Input array. Should have a real-valued data type. Must be sorted in ascending
- order along the last axis.
- x2 : Array
- Array containing search values. Should have a real-valued data type. Must have
- the same shape as ``x1`` except along the last axis.
- side : {'left', 'right'}, optional
- Argument controlling which index is returned if an element of ``x2`` is equal to
- one or more elements of ``x1``: ``'left'`` returns the index of the first of
- these elements; ``'right'`` returns the next index after the last of these
- elements. Default: ``'left'``.
- xp : array_namespace, optional
- The standard-compatible namespace for the array arguments. Default: infer.
-
- Returns
- -------
- Array: integer array
- An array of indices with the same shape as ``x2``.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> x = xp.asarray([11, 12, 13, 13, 14, 15])
- >>> xpx.searchsorted(x, xp.asarray([10, 11.5, 14.5, 16]), xp=xp)
- Array([0, 1, 5, 6], dtype=array_api_strict.int64)
- >>> xpx.searchsorted(x, xp.asarray(13), xp=xp)
- Array(2, dtype=array_api_strict.int64)
- >>> xpx.searchsorted(x, xp.asarray(13), side='right', xp=xp)
- Array(4, dtype=array_api_strict.int64)
-
- `searchsorted` is vectorized along the last axis.
-
- >>> x1 = xp.asarray([[1., 2., 3., 4.], [5., 6., 7., 8.]])
- >>> x2 = xp.asarray([[1.1, 3.3], [6.6, 8.8]])
- >>> xpx.searchsorted(x1, x2, xp=xp)
- Array([[1, 3],
- [2, 4]], dtype=array_api_strict.int64)
- """
- if xp is None:
- xp = array_namespace(x1, x2)
-
- if side not in {"left", "right"}:
- message = "`side` must be either 'left' or 'right'."
- raise ValueError(message)
-
- xp_default_int = _funcs.default_dtype(xp, kind="integral")
- x2_0d = x2.ndim == 0
- x1_1d = x1.ndim <= 1
-
- if x1_1d or is_torch_namespace(xp):
- x2 = xp.reshape(x2, ()) if (x2_0d and x1_1d) else x2
- out = xp.searchsorted(x1, x2, side=side)
- return xp.astype(out, xp_default_int, copy=False)
-
- return _funcs.searchsorted(x1, x2, side=side, xp=xp)
-
-
-def setdiff1d(
- x1: Array | complex,
- x2: Array | complex,
- /,
- *,
- assume_unique: bool = False,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Find the set difference of two arrays.
-
- Return the unique values in `x1` that are not in `x2`.
-
- Parameters
- ----------
- x1 : array | int | float | complex | bool
- Input array.
- x2 : array
- Input comparison array.
- assume_unique : bool
- If ``True``, the input arrays are both assumed to be unique, which
- can speed up the calculation. Default is ``False``.
- xp : array_namespace, optional
- The standard-compatible namespace for `x1` and `x2`. Default: infer.
-
- Returns
- -------
- array
- 1D array of values in `x1` that are not in `x2`. The result
- is sorted when `assume_unique` is ``False``, but otherwise only sorted
- if the input is sorted.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
-
- >>> x1 = xp.asarray([1, 2, 3, 2, 4, 1])
- >>> x2 = xp.asarray([3, 4, 5, 6])
- >>> xpx.setdiff1d(x1, x2, xp=xp)
- Array([1, 2], dtype=array_api_strict.int64)
- """
-
- if xp is None:
- xp = array_namespace(x1, x2)
-
- if is_numpy_namespace(xp) or is_cupy_namespace(xp) or is_jax_namespace(xp):
- x1, x2 = asarrays(x1, x2, xp=xp)
- return xp.setdiff1d(x1, x2, assume_unique=assume_unique)
-
- return _funcs.setdiff1d(x1, x2, assume_unique=assume_unique, xp=xp)
-
-
-def sinc(x: Array, /, *, xp: ModuleType | None = None) -> Array:
- r"""
- Return the normalized sinc function.
-
- The sinc function is equal to :math:`\sin(\pi x)/(\pi x)` for any argument
- :math:`x\ne 0`. ``sinc(0)`` takes the limit value 1, making ``sinc`` not
- only everywhere continuous but also infinitely differentiable.
-
- .. note::
-
- Note the normalization factor of ``pi`` used in the definition.
- This is the most commonly used definition in signal processing.
- Use ``sinc(x / xp.pi)`` to obtain the unnormalized sinc function
- :math:`\sin(x)/x` that is more common in mathematics.
-
- Parameters
- ----------
- x : array
- Array (possibly multi-dimensional) of values for which to calculate
- ``sinc(x)``. Must have a real floating point dtype.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array
- ``sinc(x)`` calculated elementwise, which has the same shape as the input.
-
- Notes
- -----
- The name sinc is short for "sine cardinal" or "sinus cardinalis".
-
- The sinc function is used in various signal processing applications,
- including in anti-aliasing, in the construction of a Lanczos resampling
- filter, and in interpolation.
-
- For bandlimited interpolation of discrete-time signals, the ideal
- interpolation kernel is proportional to the sinc function.
-
- References
- ----------
- #. Weisstein, Eric W. "Sinc Function." From MathWorld--A Wolfram Web
- Resource. https://mathworld.wolfram.com/SincFunction.html
- #. Wikipedia, "Sinc function",
- https://en.wikipedia.org/wiki/Sinc_function
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> x = xp.linspace(-4, 4, 41)
- >>> xpx.sinc(x, xp=xp)
- Array([-3.89817183e-17, -4.92362781e-02,
- -8.40918587e-02, -8.90384387e-02,
- -5.84680802e-02, 3.89817183e-17,
- 6.68206631e-02, 1.16434881e-01,
- 1.26137788e-01, 8.50444803e-02,
- -3.89817183e-17, -1.03943254e-01,
- -1.89206682e-01, -2.16236208e-01,
- -1.55914881e-01, 3.89817183e-17,
- 2.33872321e-01, 5.04551152e-01,
- 7.56826729e-01, 9.35489284e-01,
- 1.00000000e+00, 9.35489284e-01,
- 7.56826729e-01, 5.04551152e-01,
- 2.33872321e-01, 3.89817183e-17,
- -1.55914881e-01, -2.16236208e-01,
- -1.89206682e-01, -1.03943254e-01,
- -3.89817183e-17, 8.50444803e-02,
- 1.26137788e-01, 1.16434881e-01,
- 6.68206631e-02, 3.89817183e-17,
- -5.84680802e-02, -8.90384387e-02,
- -8.40918587e-02, -4.92362781e-02,
- -3.89817183e-17], dtype=array_api_strict.float64)
- """
-
- if xp is None:
- xp = array_namespace(x)
-
- if not xp.isdtype(x.dtype, "real floating"):
- err_msg = "`x` must have a real floating data type."
- raise ValueError(err_msg)
-
- if (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_jax_namespace(xp)
- or is_torch_namespace(xp)
- or is_dask_namespace(xp)
- ):
- return xp.sinc(x)
-
- return _funcs.sinc(x, xp=xp)
-
-
-def partition(
- a: Array,
- kth: int,
- /,
- axis: int | None = -1,
- *,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Return a partitioned copy of an array.
-
- Creates a copy of the array and partially sorts it in such a way that the value
- of the element in k-th position is in the position it would be in a sorted array.
- In the output array, all elements smaller than the k-th element are located to
- the left of this element and all equal or greater are located to its right.
- The ordering of the elements in the two partitions on the either side of
- the k-th element in the output array is undefined.
-
- Parameters
- ----------
- a : Array
- Input array.
- kth : int
- Element index to partition by.
- axis : int, optional
- Axis along which to partition. The default is ``-1`` (the last axis).
- If ``None``, the flattened array is used.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- partitioned_array
- Array of the same type and shape as `a`.
-
- Notes
- -----
- If `xp` implements ``partition`` or an equivalent function
- (e.g. ``topk`` for torch), complexity will likely be O(n).
- If not, this function simply calls ``xp.sort`` and complexity is O(n log n).
- """
- # Validate inputs.
- if xp is None:
- xp = array_namespace(a)
- if a.ndim < 1:
- msg = "`a` must be at least 1-dimensional"
- raise TypeError(msg)
- if axis is None:
- return partition(xp.reshape(a, (-1,)), kth, axis=0, xp=xp)
- (size,) = eager_shape(a, axis)
- if not (0 <= kth < size):
- msg = f"kth(={kth}) out of bounds [0 {size})"
- raise ValueError(msg)
-
- # Delegate where possible.
- if is_numpy_namespace(xp) or is_cupy_namespace(xp) or is_jax_namespace(xp):
- return xp.partition(a, kth, axis=axis)
-
- # Use top-k when possible:
- if is_torch_namespace(xp):
- if not (axis == -1 or axis == a.ndim - 1):
- a = xp.transpose(a, axis, -1)
-
- out = xp.empty_like(a)
- ranks = xp.arange(a.shape[-1]).expand_as(a)
-
- split_value, indices = xp.kthvalue(a, kth + 1, keepdim=True)
- del indices # indices won't be used => del ASAP to reduce peak memory usage
-
- # fill the left-side of the partition
- mask_src = a < split_value
- n_left = mask_src.sum(dim=-1, keepdim=True)
- mask_dest = ranks < n_left
- out[mask_dest] = a[mask_src]
-
- # fill the middle of the partition
- mask_src = a == split_value
- n_left += mask_src.sum(dim=-1, keepdim=True)
- mask_dest ^= ranks < n_left
- out[mask_dest] = a[mask_src]
-
- # fill the right-side of the partition
- mask_src = a > split_value
- mask_dest = ranks >= n_left
- out[mask_dest] = a[mask_src]
-
- if not (axis == -1 or axis == a.ndim - 1):
- out = xp.transpose(out, axis, -1)
- return out
-
- # Note: dask topk/argtopk sort the return values, so it's
- # not much more efficient than sorting everything when
- # kth is not small compared to x.size
-
- return _funcs.partition(a, kth, axis=axis, xp=xp)
-
-
-def argpartition(
- a: Array,
- kth: int,
- /,
- axis: int | None = -1,
- *,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Perform an indirect partition along the given axis.
-
- It returns an array of indices of the same shape as `a` that
- index data along the given axis in partitioned order.
-
- Parameters
- ----------
- a : Array
- Input array.
- kth : int
- Element index to partition by.
- axis : int, optional
- Axis along which to partition. The default is ``-1`` (the last axis).
- If ``None``, the flattened array is used.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- index_array
- Array of indices that partition `a` along the specified axis.
-
- Notes
- -----
- If `xp` implements ``argpartition`` or an equivalent function
- e.g. ``topk`` for torch), complexity will likely be O(n).
- If not, this function simply calls ``xp.argsort`` and complexity is O(n log n).
- """
- # Validate inputs.
- if xp is None:
- xp = array_namespace(a)
- if is_pydata_sparse_namespace(xp):
- msg = "Not implemented for sparse backend: no argsort"
- raise NotImplementedError(msg)
- if a.ndim < 1:
- msg = "`a` must be at least 1-dimensional"
- raise TypeError(msg)
- if axis is None:
- return argpartition(xp.reshape(a, (-1,)), kth, axis=0, xp=xp)
- (size,) = eager_shape(a, axis)
- if not (0 <= kth < size):
- msg = f"kth(={kth}) out of bounds [0 {size})"
- raise ValueError(msg)
-
- # Delegate where possible.
- if is_numpy_namespace(xp) or is_cupy_namespace(xp) or is_jax_namespace(xp):
- return xp.argpartition(a, kth, axis=axis)
-
- # Use top-k when possible:
- if is_torch_namespace(xp):
- # see `partition` above for commented details of those steps:
- if not (axis == -1 or axis == a.ndim - 1):
- a = xp.transpose(a, axis, -1)
-
- ranks = xp.arange(a.shape[-1]).expand_as(a)
- out = xp.empty_like(ranks)
-
- split_value, indices = xp.kthvalue(a, kth + 1, keepdim=True)
- del indices # indices won't be used => del ASAP to reduce peak memory usage
-
- mask_src = a < split_value
- n_left = mask_src.sum(dim=-1, keepdim=True)
- mask_dest = ranks < n_left
- out[mask_dest] = ranks[mask_src]
-
- mask_src = a == split_value
- n_left += mask_src.sum(dim=-1, keepdim=True)
- mask_dest ^= ranks < n_left
- out[mask_dest] = ranks[mask_src]
-
- mask_src = a > split_value
- mask_dest = ranks >= n_left
- out[mask_dest] = ranks[mask_src]
-
- if not (axis == -1 or axis == a.ndim - 1):
- out = xp.transpose(out, axis, -1)
- return out
-
- # Note: dask topk/argtopk sort the return values, so it's
- # not much more efficient than sorting everything when
- # kth is not small compared to x.size
-
- return _funcs.argpartition(a, kth, axis=axis, xp=xp)
-
-
-def isin(
- a: Array,
- b: Array,
- /,
- *,
- assume_unique: bool = False,
- invert: bool = False,
- kind: str | None = None,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Determine whether each element in `a` is present in `b`.
-
- This is :func:`array_api.isin`, with additional `assume_unique`
- and `kind` parameters.
-
- Parameters
- ----------
- a : array
- Input elements.
- b : array
- The elements against which to test each element of `a`.
- assume_unique : bool, optional
- If True, the input arrays are both assumed to be unique which can speed
- up the calculation. Default: False.
- invert : bool, optional
- If True, the values in the returned array are inverted. Default: False.
- kind : str | None, optional
- The algorithm or method to use. This will not affect the final result,
- but will affect the speed and memory use.
- For NumPy the options are {None, "sort", "table"}.
- For Jax the mapped parameter is instead `method` and the options are
- {"compare_all", "binary_search", "sort", and "auto" (default)}
- For CuPy, Dask, Torch and the default case this parameter is not present and
- thus ignored. Default: None.
- xp : array_namespace, optional
- The standard-compatible namespace for `a` and `b`. Default: infer.
-
- Returns
- -------
- array
- An array having the same shape as that of `a` that is True for elements
- that are in `b` and False otherwise.
- """
- if xp is None:
- xp = array_namespace(a, b)
-
- if is_numpy_namespace(xp):
- return xp.isin(a, b, assume_unique=assume_unique, invert=invert, kind=kind)
- if is_jax_namespace(xp):
- if kind is None:
- kind = "auto"
- return xp.isin(a, b, assume_unique=assume_unique, invert=invert, method=kind)
- if is_cupy_namespace(xp) or is_torch_namespace(xp) or is_dask_namespace(xp):
- return xp.isin(a, b, assume_unique=assume_unique, invert=invert)
-
- return _funcs.isin(a, b, assume_unique=assume_unique, invert=invert, xp=xp)
-
-
-def union1d(a: Array, b: Array, /, *, xp: ModuleType | None = None) -> Array:
- """
- Find the union of two arrays.
-
- Return the unique, sorted array of values that are in either of the two
- input arrays.
-
- Parameters
- ----------
- a, b : Array
- Input arrays. They are flattened internally if they are not already 1D.
-
- xp : array_namespace, optional
- The standard-compatible namespace for `a` and `b`. Default: infer.
-
- Returns
- -------
- Array
- Unique, sorted union of the input arrays.
-
- See Also
- --------
- jax.numpy.union1d : Corresponding function in JAX.
-
- Notes
- -----
- This function is not compatible with `jax.jit`.
- See the docstring of the corresponding JAX function for more information.
- """
- if xp is None:
- xp = array_namespace(a, b)
-
- if (
- is_numpy_namespace(xp)
- or is_cupy_namespace(xp)
- or is_dask_namespace(xp)
- or is_jax_namespace(xp)
- ):
- return xp.union1d(a, b)
-
- return _funcs.union1d(a, b, xp=xp)
diff --git a/src/array_api_extra/_lib/__init__.py b/src/array_api_extra/_lib/__init__.py
deleted file mode 100644
index d7b32033..00000000
--- a/src/array_api_extra/_lib/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Internals of array-api-extra."""
diff --git a/src/array_api_extra/_lib/_at.py b/src/array_api_extra/_lib/_at.py
deleted file mode 100644
index 28919f6a..00000000
--- a/src/array_api_extra/_lib/_at.py
+++ /dev/null
@@ -1,478 +0,0 @@
-"""Update operations for read-only arrays."""
-
-from __future__ import annotations
-
-import operator
-from collections.abc import Callable
-from enum import Enum
-from types import ModuleType
-from typing import TYPE_CHECKING, ClassVar, cast
-
-from ._utils import _compat
-from ._utils._compat import (
- array_namespace,
- is_dask_array,
- is_jax_array,
- is_torch_array,
- is_writeable_array,
-)
-from ._utils._helpers import meta_namespace
-from ._utils._typing import Array, SetIndex
-
-if TYPE_CHECKING: # pragma: no cover
- # TODO import from typing (requires Python >=3.11)
- from typing import Self
-
-
-class _AtOp(Enum):
- """Operations for use in `xpx.at`."""
-
- SET = "set"
- ADD = "add"
- SUBTRACT = "subtract"
- MULTIPLY = "multiply"
- DIVIDE = "divide"
- POWER = "power"
- MIN = "min"
- MAX = "max"
-
- # @override from Python 3.12
- def __str__(self) -> str: # pyright: ignore[reportImplicitOverride] # pyrefly: ignore[missing-override-decorator]
- """
- Return string representation (useful for pytest logs).
-
- Returns
- -------
- str
- The operation's name.
- """
- return self.value
-
-
-class Undef(Enum):
- """Sentinel for undefined values."""
-
- UNDEF = 0
-
-
-_undef = Undef.UNDEF
-
-
-class at: # pylint: disable=invalid-name # numpydoc ignore=PR02
- """
- Update operations for read-only arrays.
-
- This implements ``jax.numpy.ndarray.at`` for all writeable
- backends (those that support ``__setitem__``) and routes
- to the ``.at[]`` method for JAX arrays.
-
- Parameters
- ----------
- x : array
- Input array.
- idx : index, optional
- Only `array API standard compliant indices
- `_
- are supported.
-
- You may use two alternate syntaxes::
-
- >>> import array_api_extra as xpx
- >>> xpx.at(x, idx).set(value) # or add(value), etc.
- >>> xpx.at(x)[idx].set(value)
-
- copy : bool, optional
- None (default)
- The array parameter *may* be modified in place if it is
- possible and beneficial for performance.
- You should not reuse it after calling this function.
- True
- Ensure that the inputs are not modified.
- False
- Ensure that the update operation writes back to the input.
- Raise ``ValueError`` if a copy cannot be avoided.
-
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- Updated input array.
-
- Warnings
- --------
- (a) When you omit the ``copy`` parameter, you should never reuse the parameter
- array later on; ideally, you should reassign it immediately::
-
- >>> import array_api_extra as xpx
- >>> x = xpx.at(x, 0).set(2)
-
- The above best practice pattern ensures that the behaviour won't change depending
- on whether ``x`` is writeable or not, as the original ``x`` object is dereferenced
- as soon as ``xpx.at`` returns; this way there is no risk to accidentally update it
- twice.
-
- On the reverse, the anti-pattern below must be avoided, as it will result in
- different behaviour on read-only versus writeable arrays::
-
- >>> x = xp.asarray([0, 0, 0])
- >>> y = xpx.at(x, 0).set(2)
- >>> z = xpx.at(x, 1).set(3)
-
- In the above example, both calls to ``xpx.at`` update ``x`` in place *if possible*.
- This causes the behaviour to diverge depending on whether ``x`` is writeable or not:
-
- - If ``x`` is writeable, then after the snippet above you'll have
- ``x == y == z == [2, 3, 0]``
- - If ``x`` is read-only, then you'll end up with
- ``x == [0, 0, 0]``, ``y == [2, 0, 0]`` and ``z == [0, 3, 0]``.
-
- The correct pattern to use if you want diverging outputs from the same input is
- to enforce copies::
-
- >>> x = xp.asarray([0, 0, 0])
- >>> y = xpx.at(x, 0).set(2, copy=True) # Never updates x
- >>> z = xpx.at(x, 1).set(3) # May or may not update x in place
- >>> del x # avoid accidental reuse of x as we don't know its state anymore
-
- (b) The array API standard does not support integer array indices.
- The behaviour of update methods when the index is an array of integers is
- undefined and will vary between backends; this is particularly true when the
- index contains multiple occurrences of the same index, e.g.::
-
- >>> import numpy as np
- >>> import jax.numpy as jnp
- >>> import array_api_extra as xpx
- >>> xpx.at(np.asarray([123]), np.asarray([0, 0])).add(1)
- array([124])
- >>> xpx.at(jnp.asarray([123]), jnp.asarray([0, 0])).add(1)
- Array([125], dtype=int32)
-
- See Also
- --------
- jax.numpy.ndarray.at : Equivalent array method in JAX.
-
- Notes
- -----
- `sparse `_, as well as read-only arrays from libraries
- not explicitly covered by ``array-api-compat``, are not supported by update
- methods.
-
- Boolean masks are supported on Dask and jitted JAX arrays exclusively
- when `idx` has the same shape as `x` and `y` is 0-dimensional.
- Note that this support is not available in JAX's native
- ``x.at[mask].set(y)``.
-
- This pattern::
-
- >>> mask = m(x)
- >>> x[mask] = f(x[mask])
-
- Can't be replaced by `at`, as it won't work on Dask and JAX inside jax.jit::
-
- >>> mask = m(x)
- >>> x = xpx.at(x, mask).set(f(x[mask]) # Crash on Dask and jax.jit
-
- You should instead use::
-
- >>> x = xp.where(m(x), f(x), x)
-
- Examples
- --------
- Given either of these equivalent expressions::
-
- >>> import array_api_extra as xpx
- >>> x = xpx.at(x)[1].add(2)
- >>> x = xpx.at(x, 1).add(2)
-
- If x is a JAX array, they are the same as::
-
- >>> x = x.at[1].add(2)
-
- If x is a read-only NumPy array, they are the same as::
-
- >>> x = x.copy()
- >>> x[1] += 2
-
- For other known backends, they are the same as::
-
- >>> x[1] += 2
- """
-
- _x: Array
- _idx: SetIndex | Undef
- __slots__: ClassVar[tuple[str, ...]] = ("_idx", "_x")
-
- def __init__(
- self, x: Array, idx: SetIndex | Undef = _undef, /
- ) -> None: # numpydoc ignore=GL08
- self._x = x
- self._idx = idx
-
- def __getitem__(self, idx: SetIndex, /) -> Self: # numpydoc ignore=PR01,RT01
- """
- Allow for the alternate syntax ``at(x)[start:stop:step]``.
-
- It looks prettier than ``at(x, slice(start, stop, step))``
- and feels more intuitive coming from the JAX documentation.
- """
- if self._idx is not _undef:
- msg = "Index has already been set"
- raise ValueError(msg)
- return type(self)(self._x, idx)
-
- def _op(
- self,
- at_op: _AtOp,
- in_place_op: Callable[[Array, Array | complex], Array] | None,
- out_of_place_op: Callable[[Array, Array], Array] | None,
- y: Array | complex,
- /,
- copy: bool | None,
- xp: ModuleType | None,
- ) -> Array:
- """
- Implement all update operations.
-
- Parameters
- ----------
- at_op : _AtOp
- Method of JAX's Array.at[].
- in_place_op : Callable[[Array, Array | complex], Array] | None
- In-place operation to apply on mutable backends::
-
- x[idx] = in_place_op(x[idx], y)
-
- If None::
-
- x[idx] = y
-
- out_of_place_op : Callable[[Array, Array], Array] | None
- Out-of-place operation to apply when idx is a boolean mask and the backend
- doesn't support in-place updates::
-
- x = xp.where(idx, out_of_place_op(x, y), x)
-
- If None::
-
- x = xp.where(idx, y, x)
-
- y : array or complex
- Right-hand side of the operation.
- copy : bool or None
- Whether to copy the input array. See the class docstring for details.
- xp : array_namespace, optional
- The array namespace for the input array. Default: infer.
-
- Returns
- -------
- Array
- Updated `x`.
- """
- from ._funcs import apply_where # pylint: disable=cyclic-import
-
- x, idx = self._x, self._idx
- xp = array_namespace(x, y) if xp is None else xp
-
- if isinstance(idx, Undef):
- msg = (
- "Index has not been set.\n"
- "Usage: either\n"
- " at(x, idx).set(value)\n"
- "or\n"
- " at(x)[idx].set(value)\n"
- "(same for all other methods)."
- )
- raise ValueError(msg)
-
- if copy not in (True, False, None):
- msg = f"copy must be True, False, or None; got {copy!r}"
- raise ValueError(msg)
-
- writeable = None if copy else is_writeable_array(x)
-
- # JAX inside jax.jit doesn't support in-place updates with boolean
- # masks; Dask exclusively supports __setitem__ but not iops.
- # We can handle the common special case of 0-dimensional y
- # with where(idx, y, x) instead.
- if (
- (is_dask_array(idx) or is_jax_array(idx))
- and idx.dtype == xp.bool
- and idx.shape == x.shape
- ):
- y_xp = xp.asarray(y, dtype=x.dtype, device=_compat.device(x))
- if y_xp.ndim == 0:
- if out_of_place_op: # add(), subtract(), ...
- # suppress inf warnings on Dask
- out = apply_where(
- idx, (x, y_xp), out_of_place_op, fill_value=x, xp=xp
- )
- # Undo int->float promotion on JAX after _AtOp.DIVIDE
- out = xp.astype(out, x.dtype, copy=False)
- else: # set()
- out = xp.where(idx, y_xp, x)
-
- if copy is False:
- x[()] = out
- return x
- return out
-
- # else: this will work on eager JAX and crash on jax.jit and Dask
-
- if copy or (copy is None and not writeable):
- if is_jax_array(x):
- # Use JAX's at[]
- func = cast(
- Callable[[Array | complex], Array],
- getattr(x.at[idx], at_op.value), # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue,reportUnknownArgumentType]
- )
- out = func(y)
- # Undo int->float promotion on JAX after _AtOp.DIVIDE
- return xp.astype(out, x.dtype, copy=False)
-
- # Emulate at[] behaviour for non-JAX arrays
- # with a copy followed by an update
-
- x = xp.asarray(x, copy=True)
- # A copy of a read-only numpy array is writeable
- # Note: this assumes that a copy of a writeable array is writeable
- assert not writeable
- writeable = None
-
- if writeable is None:
- writeable = is_writeable_array(x)
- if not writeable:
- # sparse crashes here
- msg = f"Can't update read-only array {x}"
- raise ValueError(msg)
-
- # Work around bug in PyTorch where __setitem__ doesn't
- # always support mismatched dtypes
- # https://github.com/pytorch/pytorch/issues/150017
- if is_torch_array(y):
- y = xp.astype(y, x.dtype, copy=False)
-
- # Backends without boolean indexing (other than JAX) crash here
- if in_place_op: # add(), subtract(), ...
- x[idx] = in_place_op(x[idx], y)
- else: # set()
- x[idx] = y
- return x
-
- def set(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] = y`` and return the update array."""
- return self._op(_AtOp.SET, None, None, y, copy=copy, xp=xp)
-
- def add(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] += y`` and return the updated array."""
-
- # Note for this and all other methods based on _iop:
- # operator.iadd and operator.add subtly differ in behaviour, as
- # only iadd will trigger exceptions when y has an incompatible dtype.
- return self._op(_AtOp.ADD, operator.iadd, operator.add, y, copy=copy, xp=xp) # pyright: ignore[reportUnknownArgumentType]
-
- def subtract(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] -= y`` and return the updated array."""
- return self._op(
- _AtOp.SUBTRACT,
- operator.isub, # pyright: ignore[reportUnknownArgumentType]
- operator.sub,
- y,
- copy=copy,
- xp=xp,
- )
-
- def multiply(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] *= y`` and return the updated array."""
- return self._op(
- _AtOp.MULTIPLY,
- operator.imul, # pyright: ignore[reportUnknownArgumentType]
- operator.mul,
- y,
- copy=copy,
- xp=xp,
- )
-
- def divide(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] /= y`` and return the updated array."""
- return self._op(
- _AtOp.DIVIDE,
- operator.itruediv, # pyright: ignore[reportUnknownArgumentType]
- operator.truediv, # pyright: ignore[reportUnknownArgumentType]
- y,
- copy=copy,
- xp=xp,
- )
-
- def power(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] **= y`` and return the updated array."""
- return self._op(_AtOp.POWER, operator.ipow, operator.pow, y, copy=copy, xp=xp) # pyright: ignore[reportUnknownArgumentType]
-
- def min(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] = minimum(x[idx], y)`` and return the updated array."""
- # On Dask, this function runs on the chunks, so we need to determine the
- # namespace that Dask is wrapping.
- # Note that da.minimum _incidentally_ works on NumPy, CuPy, and sparse
- # thanks to all these meta-namespaces implementing the __array_ufunc__
- # interface, but there's no guarantee that it will work for other
- # wrapped libraries in the future.
- xp = array_namespace(self._x) if xp is None else xp
- mxp = meta_namespace(self._x, xp=xp)
- y = xp.asarray(y)
- return self._op(_AtOp.MIN, mxp.minimum, mxp.minimum, y, copy=copy, xp=xp)
-
- def max(
- self,
- y: Array | complex,
- /,
- copy: bool | None = None,
- xp: ModuleType | None = None,
- ) -> Array: # numpydoc ignore=PR01,RT01
- """Apply ``x[idx] = maximum(x[idx], y)`` and return the updated array."""
- # See note on min()
- xp = array_namespace(self._x) if xp is None else xp
- mxp = meta_namespace(self._x, xp=xp)
- y = xp.asarray(y)
- return self._op(_AtOp.MAX, mxp.maximum, mxp.maximum, y, copy=copy, xp=xp)
diff --git a/src/array_api_extra/_lib/_backends.py b/src/array_api_extra/_lib/_backends.py
deleted file mode 100644
index 56c411bd..00000000
--- a/src/array_api_extra/_lib/_backends.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""Backends against which array-api-extra runs its tests."""
-
-from __future__ import annotations
-
-from enum import Enum
-from typing import Any
-
-import numpy as np
-import pytest
-
-__all__ = ["NUMPY_VERSION", "Backend"]
-
-NUMPY_VERSION = tuple(int(v) for v in np.__version__.split(".")[:3])
-
-
-class Backend(Enum): # numpydoc ignore=PR02
- """
- All array library backends explicitly tested by array-api-extra.
-
- Parameters
- ----------
- value : str
- Tag of the backend's module, in the format ``[:]``.
- """
-
- # Use : to prevent Enum from deduplicating items with the same value
- ARRAY_API_STRICT = "array_api_strict"
- ARRAY_API_STRICTEST = "array_api_strict:strictest"
- NUMPY = "numpy"
- NUMPY_READONLY = "numpy:readonly"
- CUPY = "cupy"
- TORCH = "torch"
- TORCH_GPU = "torch:gpu"
- DASK = "dask.array"
- SPARSE = "sparse"
- JAX = "jax.numpy"
- JAX_GPU = "jax.numpy:gpu"
-
- @property
- def modname(self) -> str: # numpydoc ignore=RT01
- """Module name to be imported."""
- return self.value.split(":")[0]
-
- def like(self, *others: Backend) -> bool: # numpydoc ignore=PR01,RT01
- """Check if this backend uses the same module as others."""
- return any(self.modname == other.modname for other in others)
-
- def pytest_param(self) -> Any:
- """
- Backend as a pytest parameter.
-
- Returns
- -------
- pytest.mark.ParameterSet
- The backend as a pytest parameter.
- """
- id_ = (
- self.name.lower().replace("_gpu", ":gpu").replace("_readonly", ":readonly")
- )
-
- marks = []
- if self.like(Backend.ARRAY_API_STRICT):
- marks.append(
- pytest.mark.skipif(
- NUMPY_VERSION < (1, 26),
- reason="array_api_strict is untested on NumPy <1.26",
- )
- )
- if self.like(Backend.DASK, Backend.JAX):
- # Monkey-patched by lazy_xp_function
- marks.append(pytest.mark.thread_unsafe)
-
- return pytest.param(self, id=id_, marks=marks) # pyright: ignore[reportUnknownArgumentType]
diff --git a/src/array_api_extra/_lib/_funcs.py b/src/array_api_extra/_lib/_funcs.py
deleted file mode 100644
index 4e3b8753..00000000
--- a/src/array_api_extra/_lib/_funcs.py
+++ /dev/null
@@ -1,759 +0,0 @@
-"""Array-agnostic implementations for the public API."""
-
-import math
-import warnings
-from collections.abc import Callable, Sequence
-from types import ModuleType, NoneType
-from typing import Literal, cast, overload
-
-from ._at import at
-from ._utils import _compat, _helpers
-from ._utils._compat import (
- array_namespace,
- is_dask_namespace,
- is_jax_array,
-)
-from ._utils._helpers import (
- asarrays,
- capabilities,
- eager_shape,
- meta_namespace,
- ndindex,
-)
-from ._utils._typing import Array, Device, DType
-
-__all__ = [
- "angle",
- "apply_where",
- "atleast_nd",
- "broadcast_shapes",
- "cov",
- "create_diagonal",
- "expand_dims",
- "kron",
- "nunique",
- "pad",
- "searchsorted",
- "setdiff1d",
- "sinc",
-]
-
-
-@overload
-def apply_where( # numpydoc ignore=GL08
- cond: Array,
- args: Array | tuple[Array, ...],
- f1: Callable[..., Array],
- f2: Callable[..., Array],
- /,
- *,
- kwargs: dict[str, Array] | None = None,
- xp: ModuleType | None = None,
-) -> Array: ...
-
-
-@overload
-def apply_where( # numpydoc ignore=GL08
- cond: Array,
- args: Array | tuple[Array, ...],
- f1: Callable[..., Array],
- /,
- *,
- fill_value: Array | complex,
- kwargs: dict[str, Array] | None = None,
- xp: ModuleType | None = None,
-) -> Array: ...
-
-
-def apply_where( # numpydoc ignore=PR01,PR02
- cond: Array,
- args: Array | tuple[Array, ...],
- f1: Callable[..., Array],
- f2: Callable[..., Array] | None = None,
- /,
- *,
- fill_value: Array | complex | None = None,
- kwargs: dict[str, Array] | None = None,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Run one of two elementwise functions depending on a condition.
-
- Equivalent to ``f1(*args) if cond else fill_value`` performed elementwise
- when `fill_value` is defined, otherwise to ``f1(*args) if cond else f2(*args)``.
-
- Parameters
- ----------
- cond : array
- The condition, expressed as a boolean array.
- args : Array or tuple of Arrays
- Argument(s) to `f1` (and `f2`). Must be broadcastable with `cond`.
- f1 : callable
- Elementwise function of `args`, returning a single array.
- Where `cond` is True, output will be ``f1(arg0[cond], arg1[cond], ...)``.
- f2 : callable, optional
- Elementwise function of `args`, returning a single array.
- Where `cond` is False, output will be ``f2(arg0[cond], arg1[cond], ...)``.
- Mutually exclusive with `fill_value`.
- fill_value : Array or scalar, optional
- If provided, value with which to fill output array where `cond` is False.
- It does not need to be scalar; it needs however to be broadcastable with
- `cond` and `args`.
- Mutually exclusive with `f2`. You must provide one or the other.
- kwargs : dict of str : Array pairs
- Keyword argument(s) to `f1` (and `f2`). Values must be broadcastable with
- `cond`.
- xp : array_namespace, optional
- The standard-compatible namespace for `cond` and `args`. Default: infer.
-
- Returns
- -------
- Array
- An array with elements from the output of `f1` where `cond` is True and either
- the output of `f2` or `fill_value` where `cond` is False. The returned array has
- data type determined by type promotion rules between the output of `f1` and
- either `fill_value` or the output of `f2`.
-
- Notes
- -----
- ``xp.where(cond, f1(*args), f2(*args))`` requires explicitly evaluating `f1` even
- when `cond` is False, and `f2` when cond is True. This function evaluates each
- function only for their matching condition, if the backend allows for it.
-
- On Dask, `f1` and `f2` are applied to the individual chunks and should use functions
- from the namespace of the chunks.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> a = xp.asarray([5, 4, 3])
- >>> b = xp.asarray([0, 2, 2])
- >>> def f(a, b):
- ... return a // b
- >>> xpx.apply_where(b != 0, (a, b), f, fill_value=xp.nan)
- array([ nan, 2., 1.])
- """
- # Parse and normalize arguments
- if (f2 is None) == (fill_value is None):
- msg = "Exactly one of `fill_value` or `f2` must be given."
- raise TypeError(msg)
- args_ = list(args) if isinstance(args, tuple) else [args]
- del args
-
- kwargs_ = {} if kwargs is None else kwargs
- kwkeys = list(kwargs_.keys())
- args_ = [*args_, *kwargs_.values()]
- del kwargs
-
- xp = array_namespace(cond, fill_value, *args_) if xp is None else xp
-
- if isinstance(fill_value, int | float | complex | NoneType):
- cond, *args_ = xp.broadcast_arrays(cond, *args_)
- else:
- cond, fill_value, *args_ = xp.broadcast_arrays(cond, fill_value, *args_)
-
- if is_dask_namespace(xp):
- meta_xp = meta_namespace(cond, fill_value, *args_, xp=xp)
- # map_blocks doesn't descend into tuples of Arrays
- return xp.map_blocks(
- _apply_where, cond, f1, f2, fill_value, *args_, kwkeys=kwkeys, xp=meta_xp
- )
-
- return _apply_where(cond, f1, f2, fill_value, *args_, kwkeys=kwkeys, xp=xp)
-
-
-def _apply_where( # numpydoc ignore=PR01,RT01
- cond: Array,
- f1: Callable[..., Array],
- f2: Callable[..., Array] | None,
- fill_value: Array | int | float | complex | bool | None,
- *args: Array,
- kwkeys: list[str],
- xp: ModuleType,
-) -> Array:
- """Helper of `apply_where`. On Dask, this runs on a single chunk."""
-
- nargs = len(args) - len(kwkeys)
- kwargs = dict(zip(kwkeys, args[nargs:], strict=True))
- args = args[:nargs]
-
- if not capabilities(xp, device=_compat.device(cond))["boolean indexing"]:
- # jax.jit does not support assignment by boolean mask
- return xp.where(
- cond,
- f1(*args, **kwargs),
- f2(*args, **kwargs) if f2 is not None else fill_value,
- )
-
- temp1 = f1(
- *(arr[cond] for arr in args), **{key: val[cond] for key, val in kwargs.items()}
- )
-
- if f2 is None:
- dtype = xp.result_type(temp1, fill_value)
- if isinstance(fill_value, int | float | complex):
- out = xp.full_like(cond, dtype=dtype, fill_value=fill_value)
- else:
- out = xp.astype(fill_value, dtype, copy=True)
- else:
- ncond = ~cond
- temp2 = f2(
- *(arr[ncond] for arr in args),
- **{key: val[ncond] for key, val in kwargs.items()},
- )
- dtype = xp.result_type(temp1, temp2)
- out = xp.empty_like(cond, dtype=dtype)
- out = at(out, ncond).set(temp2)
-
- return at(out, cond).set(temp1)
-
-
-def atleast_nd(x: Array, /, *, ndim: int, xp: ModuleType) -> Array:
- # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
-
- if x.ndim < ndim:
- x = xp.expand_dims(x, axis=0)
- x = atleast_nd(x, ndim=ndim, xp=xp)
- return x
-
-
-# `float` in signature to accept `math.nan` for Dask.
-# `int`s are still accepted as `float` is a superclass of `int` in typing
-def broadcast_shapes( # numpydoc ignore=PR01,RT01
- *shapes: tuple[float | None, ...],
-) -> tuple[int | None, ...]:
- """See docstring in array_api_extra._delegation."""
- if not shapes:
- return () # Match NumPy output
-
- ndim = max(len(shape) for shape in shapes)
- out: list[int | None] = []
- for axis in range(-ndim, 0):
- sizes = {shape[axis] for shape in shapes if axis >= -len(shape)}
- # Dask uses NaN for unknown shape, which predates the Array API spec for None
- none_size = None in sizes or math.nan in sizes # noqa: PLW0177
- sizes -= {1, None, math.nan}
- if len(sizes) > 1:
- msg = (
- "shape mismatch: objects cannot be broadcast to a single shape: "
- f"{shapes}."
- )
- raise ValueError(msg)
- out.append(None if none_size else cast(int, sizes.pop()) if sizes else 1)
-
- return tuple(out)
-
-
-def cov(m: Array, /, *, xp: ModuleType) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
- m = xp.asarray(m, copy=True)
- dtype = (
- xp.float64 if xp.isdtype(m.dtype, "integral") else xp.result_type(m, xp.float64)
- )
-
- m = atleast_nd(m, ndim=2, xp=xp)
- m = xp.astype(m, dtype)
-
- avg = xp.mean(m, axis=-1, keepdims=True)
-
- m_shape = eager_shape(m)
- fact = m_shape[-1] - 1
-
- if fact <= 0:
- warnings.warn("Degrees of freedom <= 0 for slice", RuntimeWarning, stacklevel=2)
- fact = 0
-
- m -= avg
- m_transpose = xp.matrix_transpose(m)
- if xp.isdtype(m_transpose.dtype, "complex floating"):
- m_transpose = xp.conj(m_transpose)
- c = xp.matmul(m, m_transpose)
- c /= fact
- axes = tuple(axis for axis, length in enumerate(c.shape) if length == 1)
- return xp.squeeze(c, axis=axes)
-
-
-def one_hot(
- x: Array,
- /,
- num_classes: int,
- *,
- xp: ModuleType,
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
- # TODO: Benchmark whether this is faster on the NumPy backend:
- # if is_numpy_array(x):
- # out = xp.zeros((x.size, num_classes), dtype=dtype)
- # out[xp.arange(x.size), xp.reshape(x, (-1,))] = 1
- # return xp.reshape(out, (*x.shape, num_classes))
- range_num_classes = xp.arange(num_classes, dtype=x.dtype, device=_compat.device(x))
- return x[..., xp.newaxis] == range_num_classes
-
-
-def create_diagonal(
- x: Array, /, *, offset: int = 0, xp: ModuleType
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
- x_shape = eager_shape(x)
- batch_dims = x_shape[:-1]
- n = x_shape[-1] + abs(offset)
- diag = xp.zeros((*batch_dims, n**2), dtype=x.dtype, device=_compat.device(x))
-
- target_slice = slice(
- offset if offset >= 0 else abs(offset) * n,
- min(n * (n - offset), diag.shape[-1]),
- n + 1,
- )
- for index in ndindex(*batch_dims):
- diag = at(diag)[(*index, target_slice)].set(x[(*index, slice(None))])
- return xp.reshape(diag, (*batch_dims, n, n))
-
-
-def default_dtype(
- xp: ModuleType,
- kind: Literal[
- "real floating", "complex floating", "integral", "indexing"
- ] = "real floating",
- *,
- device: Device | None = None,
-) -> DType:
- """
- Return the default dtype for the given namespace and device.
-
- This is a convenience shorthand for
- ``xp.__array_namespace_info__().default_dtypes(device=device)[kind]``.
-
- Parameters
- ----------
- xp : array_namespace
- The standard-compatible namespace for which to get the default dtype.
- kind : {'real floating', 'complex floating', 'integral', 'indexing'}, optional
- The kind of dtype to return. Default is 'real floating'.
- device : Device, optional
- The device for which to get the default dtype. Default: current device.
-
- Returns
- -------
- dtype
- The default dtype for the given namespace, kind, and device.
- """
- dtypes = xp.__array_namespace_info__().default_dtypes(device=device)
- try:
- return dtypes[kind]
- except KeyError as e:
- domain = ("real floating", "complex floating", "integral", "indexing")
- assert set(dtypes) == set(domain), f"Non-compliant namespace: {dtypes}"
- msg = f"Unknown kind '{kind}'. Expected one of {domain}."
- raise ValueError(msg) from e
-
-
-def expand_dims(a: Array, /, *, axis: tuple[int, ...] = (0,), xp: ModuleType) -> Array:
- # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
- for i in sorted(axis):
- a = xp.expand_dims(a, axis=i)
- return a
-
-
-def isclose(
- a: Array | complex,
- b: Array | complex,
- *,
- rtol: float = 1e-05,
- atol: float = 1e-08,
- equal_nan: bool = False,
- xp: ModuleType,
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
- a, b = asarrays(a, b, xp=xp)
-
- a_inexact = xp.isdtype(a.dtype, ("real floating", "complex floating"))
- b_inexact = xp.isdtype(b.dtype, ("real floating", "complex floating"))
- if a_inexact or b_inexact:
- # prevent warnings on NumPy and Dask on inf - inf
- mxp = meta_namespace(a, b, xp=xp)
- out = apply_where(
- xp.isinf(a) | xp.isinf(b),
- (a, b),
- lambda a, b: mxp.isinf(a) & mxp.isinf(b) & (mxp.sign(a) == mxp.sign(b)), # pyright: ignore[reportUnknownArgumentType]
- # Note: inf <= inf is True!
- lambda a, b: mxp.abs(a - b) <= (atol + rtol * mxp.abs(b)), # pyright: ignore[reportUnknownArgumentType]
- xp=xp,
- )
- if equal_nan:
- out = xp.where(xp.isnan(a) & xp.isnan(b), True, out)
- return out
-
- if xp.isdtype(a.dtype, "bool") or xp.isdtype(b.dtype, "bool"):
- if atol >= 1 or rtol >= 1:
- return xp.ones_like(a == b)
- return a == b
-
- # integer types
- atol = int(atol)
- if rtol == 0:
- return xp.abs(a - b) <= atol
-
- # Don't rely on OverflowError, as it is not guaranteed by the Array API.
- nrtol = int(1.0 / rtol)
- if nrtol > xp.iinfo(b.dtype).max:
- # rtol * max_int < 1, so it's inconsequential
- return xp.abs(a - b) <= atol
- return xp.abs(a - b) <= (atol + xp.abs(b) // nrtol)
-
-
-def kron(
- a: Array,
- b: Array,
- /,
- *,
- xp: ModuleType,
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in array_api_extra._delegation."""
-
- singletons = (1,) * (b.ndim - a.ndim)
- a = cast(Array, xp.broadcast_to(a, singletons + a.shape))
-
- nd_b, nd_a = b.ndim, a.ndim
- nd_max = max(nd_b, nd_a)
- if nd_a == 0 or nd_b == 0:
- return xp.multiply(a, b)
-
- a_shape = eager_shape(a)
- b_shape = eager_shape(b)
-
- # Equalise the shapes by prepending smaller one with 1s
- a_shape = (1,) * max(0, nd_b - nd_a) + a_shape
- b_shape = (1,) * max(0, nd_a - nd_b) + b_shape
-
- # Insert empty dimensions
- a_arr = expand_dims(a, axis=tuple(range(nd_b - nd_a)), xp=xp)
- b_arr = expand_dims(b, axis=tuple(range(nd_a - nd_b)), xp=xp)
-
- # Compute the product
- a_arr = expand_dims(a_arr, axis=tuple(range(1, nd_max * 2, 2)), xp=xp)
- b_arr = expand_dims(b_arr, axis=tuple(range(0, nd_max * 2, 2)), xp=xp)
- result = xp.multiply(a_arr, b_arr)
-
- # Reshape back and return
- res_shape = tuple(a_s * b_s for a_s, b_s in zip(a_shape, b_shape, strict=True))
- return xp.reshape(result, res_shape)
-
-
-def nan_to_num( # numpydoc ignore=PR01,RT01
- x: Array,
- /,
- fill_value: int | float = 0.0,
- *,
- xp: ModuleType,
-) -> Array:
- """See docstring in `array_api_extra._delegation.py`."""
-
- def perform_replacements( # numpydoc ignore=PR01,RT01
- x: Array,
- fill_value: int | float,
- xp: ModuleType,
- ) -> Array:
- """Internal function to perform the replacements."""
- x = xp.where(xp.isnan(x), fill_value, x)
-
- # convert infinities to finite values
- finfo = xp.finfo(x.dtype)
- idx_posinf = xp.isinf(x) & ~xp.signbit(x)
- idx_neginf = xp.isinf(x) & xp.signbit(x)
- x = xp.where(idx_posinf, finfo.max, x)
- return xp.where(idx_neginf, finfo.min, x)
-
- if xp.isdtype(x.dtype, "complex floating"):
- return perform_replacements(
- xp.real(x),
- fill_value,
- xp,
- ) + 1j * perform_replacements(
- xp.imag(x),
- fill_value,
- xp,
- )
-
- if xp.isdtype(x.dtype, "numeric"):
- return perform_replacements(x, fill_value, xp)
-
- return x
-
-
-def nunique(x: Array, /, *, xp: ModuleType | None = None) -> Array:
- """
- Count the number of unique elements in an array.
-
- Compatible with JAX and Dask, whose laziness would be otherwise
- problematic.
-
- Parameters
- ----------
- x : Array
- Input array.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- array: 0-dimensional integer array
- The number of unique elements in `x`. It can be lazy.
- """
- if xp is None:
- xp = array_namespace(x)
-
- if is_jax_array(x):
- # size= is JAX-specific
- # https://github.com/data-apis/array-api/issues/883
- _, counts = xp.unique_counts(x, size=_compat.size(x))
- return (counts > 0).sum()
-
- # There are 3 general use cases:
- # 1. backend has unique_counts and it returns an array with known shape
- # 2. backend has unique_counts and it returns a None-sized array;
- # e.g. Dask, ndonnx
- # 3. backend does not have unique_counts; e.g. wrapped JAX
- if capabilities(xp, device=_compat.device(x))["data-dependent shapes"]:
- # xp has unique_counts; O(n) complexity
- _, counts = xp.unique_counts(x)
- n = _compat.size(counts)
- if n is None:
- return xp.sum(xp.ones_like(counts))
- return xp.asarray(n, device=_compat.device(x))
-
- # xp does not have unique_counts; O(n*logn) complexity
- x = xp.reshape(x, (-1,))
- x = xp.sort(x, stable=False)
- mask = x != xp.roll(x, -1)
- default_int = default_dtype(xp, "integral", device=_compat.device(x))
- return xp.maximum(
- # Special cases:
- # - array is size 0
- # - array has all elements equal to each other
- xp.astype(xp.any(~mask), default_int),
- xp.sum(xp.astype(mask, default_int)),
- )
-
-
-def pad(
- x: Array,
- pad_width: int | tuple[int, int] | Sequence[tuple[int, int]],
- *,
- constant_values: complex = 0,
- xp: ModuleType,
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
- # make pad_width a list of length-2 tuples of ints
- if isinstance(pad_width, int):
- pad_width_seq = [(pad_width, pad_width)] * x.ndim
- elif (
- isinstance(pad_width, tuple)
- and len(pad_width) == 2
- and all(isinstance(i, int) for i in pad_width)
- ):
- pad_width_seq = [cast(tuple[int, int], pad_width)] * x.ndim
- else:
- pad_width_seq = cast(list[tuple[int, int]], list(pad_width))
-
- slices: list[slice] = []
- newshape: list[int] = []
- for ax, w_tpl in enumerate(pad_width_seq):
- if len(w_tpl) != 2:
- msg = f"expect a 2-tuple (before, after), got {w_tpl}."
- raise ValueError(msg)
-
- sh = eager_shape(x)[ax]
-
- if w_tpl[0] == 0 and w_tpl[1] == 0:
- sl = slice(None, None, None)
- else:
- stop: int | None
- start, stop = w_tpl
- stop = None if stop == 0 else -stop
-
- sl = slice(start, stop, None)
- sh += w_tpl[0] + w_tpl[1]
-
- newshape.append(sh)
- slices.append(sl)
-
- padded = xp.full(
- tuple(newshape),
- fill_value=constant_values,
- dtype=x.dtype,
- device=_compat.device(x),
- )
- return at(padded, tuple(slices)).set(x)
-
-
-def searchsorted(
- x1: Array,
- x2: Array,
- /,
- *,
- side: Literal["left", "right"] = "left",
- xp: ModuleType,
-) -> Array:
- # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
- a = xp.full(x2.shape, 0, device=_compat.device(x1))
-
- if x1.shape[-1] == 0:
- return a
-
- n = xp.count_nonzero(~xp.isnan(x1), axis=-1, keepdims=True)
- b = xp.broadcast_to(n, x2.shape)
-
- compare = xp.less_equal if side == "left" else xp.less
-
- # while xp.any(b - a > 1):
- # refactored to for loop with ~log2(n) iterations for JAX JIT
- for _ in range(int(math.log2(x1.shape[-1])) + 1): # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
- c = (a + b) // 2
- x0 = xp.take_along_axis(x1, c, axis=-1)
- j = compare(x2, x0)
- b = xp.where(j, c, b)
- a = xp.where(j, a, c)
-
- out = xp.where(compare(x2, xp.min(x1, axis=-1, keepdims=True)), 0, b)
- out = xp.where(xp.isnan(x2), x1.shape[-1], out) if side == "right" else out
- return xp.astype(out, default_dtype(xp, kind="integral"), copy=False)
-
-
-def setdiff1d(
- x1: Array | complex,
- x2: Array | complex,
- /,
- *,
- assume_unique: bool = False,
- xp: ModuleType,
-) -> Array: # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
-
- # https://github.com/microsoft/pyright/issues/10103
- x1_, x2_ = asarrays(x1, x2, xp=xp)
-
- if assume_unique:
- x1_ = xp.reshape(x1_, (-1,))
- x2_ = xp.reshape(x2_, (-1,))
- else:
- x1_ = xp.unique_values(x1_)
- x2_ = xp.unique_values(x2_)
-
- return x1_[_helpers.in1d(x1_, x2_, assume_unique=True, invert=True, xp=xp)]
-
-
-def sinc(x: Array, /, *, xp: ModuleType) -> Array:
- # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
-
- # no scalars in `where` - array-api#807
- y = xp.pi * xp.where(
- xp.astype(x, xp.bool),
- x,
- xp.asarray(xp.finfo(x.dtype).eps, dtype=x.dtype, device=_compat.device(x)),
- )
- return xp.sin(y) / y
-
-
-def partition( # numpydoc ignore=PR01,RT01
- x: Array,
- kth: int, # noqa: ARG001
- /,
- axis: int = -1,
- *,
- xp: ModuleType,
-) -> Array:
- """See docstring in `array_api_extra._delegation.py`."""
- return xp.sort(x, axis=axis, stable=False)
-
-
-def argpartition( # numpydoc ignore=PR01,RT01
- x: Array,
- kth: int, # noqa: ARG001
- /,
- axis: int = -1,
- *,
- xp: ModuleType,
-) -> Array:
- """See docstring in `array_api_extra._delegation.py`."""
- return xp.argsort(x, axis=axis, stable=False)
-
-
-def isin( # numpydoc ignore=PR01,RT01
- a: Array,
- b: Array,
- /,
- *,
- assume_unique: bool = False,
- invert: bool = False,
- xp: ModuleType,
-) -> Array:
- """See docstring in `array_api_extra._delegation.py`."""
- original_a_shape = a.shape
- a = xp.reshape(a, (-1,))
- b = xp.reshape(b, (-1,))
- return xp.reshape(
- _helpers.in1d(a, b, assume_unique=assume_unique, invert=invert, xp=xp),
- original_a_shape,
- )
-
-
-def union1d(a: Array, b: Array, /, *, xp: ModuleType) -> Array:
- # numpydoc ignore=PR01,RT01
- """See docstring in `array_api_extra._delegation.py`."""
- a = xp.reshape(a, (-1,))
- b = xp.reshape(b, (-1,))
- # XXX: `sparse` returns NumPy arrays from `unique_values`
- return xp.asarray(xp.unique_values(xp.concat([a, b])))
-
-
-def angle(z: Array, /, *, deg: bool = False, xp: ModuleType | None = None) -> Array:
- """
- Return the angle of the complex argument.
-
- Parameters
- ----------
- z : Array
- Input array.
- deg : bool, optional
- Return angle in degrees if True, radians if False (default).
- xp : array_namespace, optional
- The standard-compatible namespace for `z`. Default: infer.
-
- Returns
- -------
- array
- The counterclockwise angle from the positive real axis on the complex
- plane in the range ``(-pi, pi]``.
-
- Notes
- -----
- Real input ``x`` is interpreted as ``x + 0j``.
-
- Examples
- --------
- >>> import array_api_strict as xp
- >>> import array_api_extra as xpx
- >>> xpx.angle(xp.asarray([1.0, 1.0j, 1 + 1j]), xp=xp)
- Array([0. , 1.57079633, 0.78539816], dtype=array_api_strict.float64)
- >>> xpx.angle(xp.asarray([1.0, 1.0j, 1 + 1j]), deg=True, xp=xp)
- Array([ 0., 90., 45.], dtype=array_api_strict.float64)
- """
- if xp is None:
- xp = array_namespace(z)
- if xp.isdtype(z.dtype, "complex floating"):
- zimag = xp.imag(z)
- zreal = xp.real(z)
- else:
- if not xp.isdtype(z.dtype, "real floating"):
- z = xp.astype(z, default_dtype(xp, device=_compat.device(z)))
- zimag = xp.zeros_like(z)
- zreal = z
- a = xp.atan2(zimag, zreal)
- if deg:
- a = a * 180 / xp.pi
- return a
diff --git a/src/array_api_extra/_lib/_lazy.py b/src/array_api_extra/_lib/_lazy.py
deleted file mode 100644
index be601cdd..00000000
--- a/src/array_api_extra/_lib/_lazy.py
+++ /dev/null
@@ -1,357 +0,0 @@
-"""Public API Functions."""
-
-from __future__ import annotations
-
-import math
-from collections.abc import Callable, Sequence
-from functools import partial, wraps
-from types import ModuleType
-from typing import TYPE_CHECKING, Any, ParamSpec, TypeAlias, cast, overload
-
-from ._funcs import broadcast_shapes
-from ._utils import _compat
-from ._utils._compat import (
- array_namespace,
- is_dask_namespace,
- is_jax_namespace,
-)
-from ._utils._helpers import is_python_scalar
-from ._utils._typing import Array, DType
-
-if TYPE_CHECKING: # pragma: no cover
- import numpy as np
- from numpy.typing import ArrayLike
-
- NumPyObject: TypeAlias = np.ndarray[Any, Any] | np.generic
-else:
- # Sphinx hack
- NumPyObject = Any
-
-P = ParamSpec("P")
-
-
-@overload # pyrefly: ignore[invalid-param-spec]
-def lazy_apply( # type: ignore[valid-type]
- func: Callable[P, Array | ArrayLike],
- *args: Array | complex | None,
- shape: tuple[int | None, ...] | None = None,
- dtype: DType | None = None,
- as_numpy: bool = False,
- xp: ModuleType | None = None,
- **kwargs: P.kwargs, # pyright: ignore[reportGeneralTypeIssues]
-) -> Array: ... # numpydoc ignore=GL08
-
-
-@overload # pyrefly: ignore[invalid-param-spec]
-def lazy_apply( # type: ignore[valid-type]
- func: Callable[P, Sequence[Array | ArrayLike]],
- *args: Array | complex | None,
- shape: Sequence[tuple[int | None, ...]],
- dtype: Sequence[DType] | None = None,
- as_numpy: bool = False,
- xp: ModuleType | None = None,
- **kwargs: P.kwargs, # pyright: ignore[reportGeneralTypeIssues]
-) -> tuple[Array, ...]: ... # numpydoc ignore=GL08
-
-
-def lazy_apply( # type: ignore[valid-type] # pyrefly: ignore[invalid-param-spec] # numpydoc ignore=GL07,SA04
- func: Callable[P, Array | ArrayLike | Sequence[Array | ArrayLike]],
- *args: Array | complex | None,
- shape: tuple[int | None, ...] | Sequence[tuple[int | None, ...]] | None = None,
- dtype: DType | Sequence[DType] | None = None,
- as_numpy: bool = False,
- xp: ModuleType | None = None,
- **kwargs: P.kwargs, # pyright: ignore[reportGeneralTypeIssues]
-) -> Array | tuple[Array, ...]:
- """
- Lazily apply an eager function.
-
- If the backend of the input arrays is lazy, e.g. Dask or jitted JAX, the execution
- of the function is delayed until the graph is materialized; if it's eager, the
- function is executed immediately.
-
- Parameters
- ----------
- func : callable
- The function to apply.
-
- It must accept one or more array API compliant arrays as positional arguments.
- If `as_numpy=True`, inputs are converted to NumPy before they are passed to
- `func`.
- It must return either a single array-like or a sequence of array-likes.
-
- `func` must be a pure function, i.e. without side effects, as depending on the
- backend it may be executed more than once or never.
- *args : Array | int | float | complex | bool | None
- One or more Array API compliant arrays, Python scalars, or None's.
-
- If `as_numpy=True`, you need to be able to apply :func:`numpy.asarray` to
- non-None args to convert them to NumPy; read notes below about specific
- backends.
- shape : tuple[int | None, ...] | Sequence[tuple[int | None, ...]], optional
- Output shape or sequence of output shapes, one for each output of `func`.
- Default: assume single output and broadcast shapes of the input arrays.
- dtype : DType | Sequence[DType], optional
- Output dtype or sequence of output dtypes, one for each output of `func`.
- dtype(s) must belong to the same array namespace as the input arrays.
- Default: infer the result type(s) from the input arrays.
- as_numpy : bool, optional
- If True, convert the input arrays to NumPy before passing them to `func`.
- This is particularly useful to make NumPy-only functions, e.g. written in Cython
- or Numba, work transparently with array API-compliant arrays.
- Default: False.
- xp : array_namespace, optional
- The standard-compatible namespace for `args`. Default: infer.
- **kwargs : Any, optional
- Additional keyword arguments to pass verbatim to `func`.
- They cannot contain Array objects.
-
- Returns
- -------
- Array | tuple[Array, ...]
- The result(s) of `func` applied to the input arrays, wrapped in the same
- array namespace as the inputs.
- If shape is omitted or a single `tuple[int | None, ...]`, return a single array.
- Otherwise, return a tuple of arrays.
-
- Notes
- -----
- JAX
- This allows applying eager functions to jitted JAX arrays, which are lazy.
- The function won't be applied until the JAX array is materialized.
- When running inside ``jax.jit``, `shape` must be fully known, i.e. it cannot
- contain any `None` elements.
-
- .. warning::
-
- `func` must never raise inside ``jax.jit``, as the resulting behavior is
- undefined.
-
- Using this with `as_numpy=False` is particularly useful to apply non-jittable
- JAX functions to arrays on GPU devices.
- If ``as_numpy=True``, the :doc:`jax:transfer_guard` may prevent arrays on a GPU
- device from being transferred back to CPU. This is treated as an implicit
- transfer.
-
- PyTorch, CuPy
- If ``as_numpy=True``, these backends raise by default if you attempt to convert
- arrays on a GPU device to NumPy.
-
- Sparse
- If ``as_numpy=True``, by default sparse prevents implicit densification through
- :func:`numpy.asarray`. `This safety mechanism can be disabled
- `_.
-
- Dask
- This allows applying eager functions to Dask arrays.
- The Dask graph won't be computed until the user calls ``compute()`` or
- ``persist()`` down the line.
-
- The function name will be prominently visible on the user-facing Dask
- dashboard and on Prometheus metrics, so it is recommended for it to be
- meaningful.
-
- `lazy_apply` doesn't know if `func` reduces along any axes; also, shape
- changes are non-trivial in chunked Dask arrays. For these reasons, all inputs
- will be rechunked into a single chunk.
-
- .. warning::
-
- The whole operation needs to fit in memory all at once on a single worker.
-
- The outputs will also be returned as a single chunk and you should consider
- rechunking them into smaller chunks afterwards.
-
- If you want to distribute the calculation across multiple workers, you
- should use :func:`dask.array.map_blocks`, :func:`dask.array.map_overlap`,
- :func:`dask.array.blockwise`, or a native Dask wrapper instead of
- `lazy_apply`.
-
- Dask wrapping around other backends
- If ``as_numpy=False``, `func` will receive in input eager arrays of the meta
- namespace, as defined by the ``._meta`` attribute of the input Dask arrays.
- The outputs of `func` will be wrapped by the meta namespace, and then wrapped
- again by Dask.
-
- Raises
- ------
- ValueError
- When ``xp=jax.numpy``, the output `shape` is unknown (it contains ``None`` on
- one or more axes) and this function was called inside ``jax.jit``.
- RuntimeError
- When ``xp=sparse`` and auto-densification is disabled.
- Exception (backend-specific)
- When the backend disallows implicit device to host transfers and the input
- arrays are on a non-CPU device, e.g. on GPU.
-
- See Also
- --------
- jax.transfer_guard
- jax.pure_callback
- dask.array.map_blocks
- dask.array.map_overlap
- dask.array.blockwise
- """
- args_not_none = [arg for arg in args if arg is not None]
- array_args = [arg for arg in args_not_none if not is_python_scalar(arg)]
- if not array_args:
- msg = "Must have at least one argument array"
- raise ValueError(msg)
- if xp is None:
- xp = array_namespace(*args)
-
- # Normalize and validate shape and dtype
- shapes: list[tuple[int | None, ...]]
- dtypes: list[DType]
- multi_output = False
-
- if shape is None:
- shapes = [broadcast_shapes(*(arg.shape for arg in array_args))]
- elif all(isinstance(s, int | None) for s in shape):
- # Do not test for shape to be a tuple
- # https://github.com/data-apis/array-api/issues/891#issuecomment-2637430522
- shapes = [cast(tuple[int | None, ...], shape)]
- else:
- shapes = list(shape) # type: ignore[arg-type] # pyright: ignore[reportAssignmentType]
- multi_output = True
-
- if dtype is None:
- dtypes = [xp.result_type(*args_not_none)] * len(shapes)
- elif multi_output:
- if not isinstance(dtype, Sequence):
- msg = "Got multiple shapes but only one dtype"
- raise ValueError(msg)
- dtypes = list(dtype) # pyright: ignore[reportUnknownArgumentType]
- else:
- if isinstance(dtype, Sequence):
- msg = "Got single shape but multiple dtypes"
- raise ValueError(msg)
-
- dtypes = [dtype]
-
- if len(shapes) != len(dtypes):
- msg = f"Got {len(shapes)} shapes and {len(dtypes)} dtypes"
- raise ValueError(msg)
- del shape
- del dtype
- # End of shape and dtype parsing
-
- # Backend-specific branches
- if is_dask_namespace(xp):
- import dask
-
- metas: list[Array] = [arg._meta for arg in array_args] # pylint: disable=protected-access # pyright: ignore[reportAttributeAccessIssue] # pyrefly: ignore[missing-attribute]
- meta_xp = array_namespace(*metas)
-
- wrapped = dask.delayed( # type: ignore[attr-defined] # pyright: ignore[reportPrivateImportUsage]
- _lazy_apply_wrapper(func, as_numpy, multi_output, meta_xp),
- pure=True,
- )
- # This finalizes each arg, which is the same as arg.rechunk(-1).
- # Please read docstring above for why we're not using
- # dask.array.map_blocks or dask.array.blockwise!
- delayed_out = wrapped(*args, **kwargs)
-
- out = tuple(
- xp.from_delayed(
- delayed_out[i], # pyright: ignore[reportIndexIssue]
- # Dask's unknown shapes diverge from the Array API specification
- shape=tuple(math.nan if s is None else s for s in shape),
- dtype=dtype,
- meta=metas[0],
- )
- for i, (shape, dtype) in enumerate(zip(shapes, dtypes, strict=True))
- )
-
- elif is_jax_namespace(xp) and _is_jax_jit_enabled(xp):
- # Delay calling func with jax.pure_callback, which will forward to func eager
- # JAX arrays. Do not use jax.pure_callback when running outside of the JIT,
- # as it does not support raising exceptions:
- # https://github.com/jax-ml/jax/issues/26102
- import jax
-
- if any(None in shape for shape in shapes):
- msg = "Output shape must be fully known when running inside jax.jit"
- raise ValueError(msg)
-
- # Shield kwargs from being coerced into JAX arrays.
- # jax.pure_callback calls jax.jit under the hood, but without the chance of
- # passing static_argnames / static_argnums.
- wrapped = _lazy_apply_wrapper(
- partial(func, **kwargs), as_numpy, multi_output, xp
- )
-
- # suppress unused-ignore to run mypy in -e lint as well as -e dev
- out = cast( # type: ignore[bad-cast,unused-ignore]
- tuple[Array, ...],
- jax.pure_callback(
- wrapped,
- tuple(
- jax.ShapeDtypeStruct(shape, dtype) # pyright: ignore[reportUnknownArgumentType]
- for shape, dtype in zip(shapes, dtypes, strict=True)
- ),
- *args,
- ),
- )
-
- else:
- # Eager backends, including non-jitted JAX
- wrapped = _lazy_apply_wrapper(func, as_numpy, multi_output, xp)
- out = wrapped(*args, **kwargs)
-
- return out if multi_output else out[0]
-
-
-def _is_jax_jit_enabled(xp: ModuleType) -> bool: # numpydoc ignore=PR01,RT01
- """Return True if this function is being called inside ``jax.jit``."""
- import jax # pylint: disable=import-outside-toplevel
-
- x = xp.asarray(False)
- try:
- return bool(x)
- except jax.errors.TracerBoolConversionError:
- return True
-
-
-def _lazy_apply_wrapper( # numpydoc ignore=PR01,RT01
- func: Callable[..., Array | ArrayLike | Sequence[Array | ArrayLike]],
- as_numpy: bool,
- multi_output: bool,
- xp: ModuleType,
-) -> Callable[..., tuple[Array, ...]]:
- """
- Helper of `lazy_apply`.
-
- Given a function that accepts one or more arrays as positional arguments and returns
- a single array-like or a sequence of array-likes, return a function that accepts the
- same number of Array API arrays and always returns a tuple of Array API array.
-
- Any keyword arguments are passed through verbatim to the wrapped function.
- """
-
- # On Dask, @wraps causes the graph key to contain the wrapped function's name
- @wraps(func)
- def wrapper(
- *args: Array | complex | None, **kwargs: Any
- ) -> tuple[Array, ...]: # numpydoc ignore=GL08
- args_list = []
- device = None
- for arg in args:
- if arg is not None and not is_python_scalar(arg):
- if device is None:
- device = _compat.device(arg)
- if as_numpy:
- import numpy as np
-
- arg = cast(Array, np.asarray(arg)) # pyright: ignore[reportInvalidCast] # noqa: PLW2901
- args_list.append(arg)
- assert device is not None
-
- out = func(*args_list, **kwargs)
-
- if multi_output:
- assert isinstance(out, Sequence)
- return tuple(xp.asarray(o, device=device) for o in out)
- return (xp.asarray(out, device=device),)
-
- return wrapper
diff --git a/src/array_api_extra/_lib/_testing.py b/src/array_api_extra/_lib/_testing.py
deleted file mode 100644
index 6dfa0fc2..00000000
--- a/src/array_api_extra/_lib/_testing.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""
-Private testing utilities.
-
-See also ..testing for public testing utilities.
-"""
-
-from __future__ import annotations
-
-import pytest
-
-
-def xfail(
- request: pytest.FixtureRequest, *, reason: str, strict: bool | None = None
-) -> None:
- """
- XFAIL the currently running test.
-
- Unlike ``pytest.xfail``, allow rest of test to execute instead of immediately
- halting it, so that it may result in a XPASS.
- xref https://github.com/pandas-dev/pandas/issues/38902
-
- Parameters
- ----------
- request : pytest.FixtureRequest
- ``request`` argument of the test function.
- reason : str
- Reason for the expected failure.
- strict : bool, optional
- If True, the test will be marked as failed if it passes.
- If False, the test will be marked as passed if it fails.
- Default: ``xfail_strict`` value in ``pyproject.toml``, or False if absent.
- """
- if strict is not None:
- marker = pytest.mark.xfail(reason=reason, strict=strict)
- else:
- marker = pytest.mark.xfail(reason=reason)
- request.node.add_marker(marker)
diff --git a/src/array_api_extra/_lib/_utils/__init__.py b/src/array_api_extra/_lib/_utils/__init__.py
deleted file mode 100644
index 3628c45f..00000000
--- a/src/array_api_extra/_lib/_utils/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Modules housing private utility functions."""
diff --git a/src/array_api_extra/_lib/_utils/_compat.py b/src/array_api_extra/_lib/_utils/_compat.py
deleted file mode 100644
index 82ce76b8..00000000
--- a/src/array_api_extra/_lib/_utils/_compat.py
+++ /dev/null
@@ -1,74 +0,0 @@
-"""Acquire helpers from array-api-compat."""
-# Allow packages that vendor both `array-api-extra` and
-# `array-api-compat` to override the import location
-
-# pylint: disable=duplicate-code
-try:
- from ...._array_api_compat_vendor import (
- array_namespace,
- device,
- is_array_api_obj,
- is_array_api_strict_namespace,
- is_cupy_array,
- is_cupy_namespace,
- is_dask_array,
- is_dask_namespace,
- is_jax_array,
- is_jax_namespace,
- is_lazy_array,
- is_numpy_array,
- is_numpy_namespace,
- is_pydata_sparse_array,
- is_pydata_sparse_namespace,
- is_torch_array,
- is_torch_namespace,
- is_writeable_array,
- size,
- to_device,
- )
-except ImportError:
- from array_api_compat import (
- array_namespace,
- device,
- is_array_api_obj,
- is_array_api_strict_namespace,
- is_cupy_array,
- is_cupy_namespace,
- is_dask_array,
- is_dask_namespace,
- is_jax_array,
- is_jax_namespace,
- is_lazy_array,
- is_numpy_array,
- is_numpy_namespace,
- is_pydata_sparse_array,
- is_pydata_sparse_namespace,
- is_torch_array,
- is_torch_namespace,
- is_writeable_array,
- size,
- to_device,
- )
-
-__all__ = [
- "array_namespace",
- "device",
- "is_array_api_obj",
- "is_array_api_strict_namespace",
- "is_cupy_array",
- "is_cupy_namespace",
- "is_dask_array",
- "is_dask_namespace",
- "is_jax_array",
- "is_jax_namespace",
- "is_lazy_array",
- "is_numpy_array",
- "is_numpy_namespace",
- "is_pydata_sparse_array",
- "is_pydata_sparse_namespace",
- "is_torch_array",
- "is_torch_namespace",
- "is_writeable_array",
- "size",
- "to_device",
-]
diff --git a/src/array_api_extra/_lib/_utils/_compat.pyi b/src/array_api_extra/_lib/_utils/_compat.pyi
deleted file mode 100644
index 95c6bc8a..00000000
--- a/src/array_api_extra/_lib/_utils/_compat.pyi
+++ /dev/null
@@ -1,45 +0,0 @@
-"""Static type stubs for `_compat.py`."""
-
-# https://github.com/scikit-learn/scikit-learn/pull/27910#issuecomment-2568023972
-from __future__ import annotations
-
-from types import ModuleType
-from typing import Any, TypeGuard
-
-# TODO import from typing (requires Python >=3.13)
-from typing_extensions import TypeIs
-
-from ._typing import Array, Device
-
-# pylint: disable=missing-class-docstring,unused-argument
-
-def array_namespace(
- *xs: Array | complex | None,
- api_version: str | None = None,
- use_compat: bool | None = None,
-) -> ModuleType: ...
-def device(x: Array, /) -> Device: ...
-def is_array_api_obj(x: object, /) -> TypeIs[Array]: ...
-def is_array_api_strict_namespace(xp: ModuleType, /) -> bool: ...
-def is_cupy_namespace(xp: ModuleType, /) -> bool: ...
-def is_dask_namespace(xp: ModuleType, /) -> bool: ...
-def is_jax_namespace(xp: ModuleType, /) -> bool: ...
-def is_numpy_namespace(xp: ModuleType, /) -> bool: ...
-def is_pydata_sparse_namespace(xp: ModuleType, /) -> bool: ...
-def is_torch_namespace(xp: ModuleType, /) -> bool: ...
-def is_cupy_array(x: object, /) -> TypeGuard[Array]: ...
-def is_dask_array(x: object, /) -> TypeGuard[Array]: ...
-def is_jax_array(x: object, /) -> TypeGuard[Array]: ...
-def is_numpy_array(x: object, /) -> TypeGuard[Array]: ...
-def is_pydata_sparse_array(x: object, /) -> TypeGuard[Array]: ...
-def is_torch_array(x: object, /) -> TypeGuard[Array]: ...
-def is_lazy_array(x: object, /) -> TypeGuard[Array]: ...
-def is_writeable_array(x: object, /) -> TypeGuard[Array]: ...
-def size(x: Array, /) -> int | None: ...
-def to_device(
- x: Array,
- device: Device, # pylint: disable=redefined-outer-name
- /,
- *,
- stream: int | Any | None = None,
-) -> Array: ...
diff --git a/src/array_api_extra/_lib/_utils/_helpers.py b/src/array_api_extra/_lib/_utils/_helpers.py
deleted file mode 100644
index 6fb7c78b..00000000
--- a/src/array_api_extra/_lib/_utils/_helpers.py
+++ /dev/null
@@ -1,610 +0,0 @@
-"""Helper functions used by `array_api_extra/_funcs.py`."""
-
-from __future__ import annotations
-
-import functools
-import io
-import math
-import pickle
-import types
-import warnings
-from collections.abc import Callable, Generator, Iterable, Iterator
-from functools import wraps
-from types import ModuleType
-from typing import (
- TYPE_CHECKING,
- Any,
- ClassVar,
- Generic,
- Literal,
- ParamSpec,
- TypeAlias,
- TypeVar,
- cast,
-)
-
-from . import _compat
-from ._compat import (
- array_namespace,
- is_array_api_obj,
- is_dask_namespace,
- is_jax_namespace,
- is_numpy_array,
- is_torch_namespace,
-)
-from ._typing import Array, Device
-
-if TYPE_CHECKING: # pragma: no cover
- # TODO import from typing (requires Python >=3.12 and >=3.13)
- from typing_extensions import TypeIs, override
-else:
-
- def override(func):
- return func
-
-
-P = ParamSpec("P")
-T = TypeVar("T")
-
-
-__all__ = [
- "asarrays",
- "capabilities",
- "deprecated",
- "eager_shape",
- "in1d",
- "is_python_scalar",
- "jax_autojit",
- "meta_namespace",
- "pickle_flatten",
- "pickle_unflatten",
-]
-
-
-def deprecated(
- msg: str, stacklevel: int = 2
-) -> Callable[[Callable[P, T]], Callable[P, T]]: # numpydoc ignore=PR01,RT01
- """Deprecate a function by emitting a warning on use."""
-
- def decorate(func: Callable[P, T]) -> Callable[P, T]: # numpydoc ignore=GL08
- @functools.wraps(func)
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: # numpydoc ignore=GL08
- warnings.warn(
- msg,
- category=DeprecationWarning,
- stacklevel=stacklevel,
- )
- return func(*args, **kwargs)
-
- return wrapper
-
- return decorate
-
-
-def in1d(
- x1: Array,
- x2: Array,
- /,
- *,
- assume_unique: bool = False,
- invert: bool = False,
- xp: ModuleType | None = None,
-) -> Array: # numpydoc ignore=PR01,RT01
- """
- Check whether each element of an array is also present in a second array.
-
- Returns a boolean array the same length as `x1` that is True
- where an element of `x1` is in `x2` and False otherwise.
-
- This function has been adapted using the original implementation
- present in numpy:
- https://github.com/numpy/numpy/blob/v1.26.0/numpy/lib/arraysetops.py#L524-L758
- """
- if xp is None:
- xp = array_namespace(x1, x2)
-
- x1_shape = eager_shape(x1)
- x2_shape = eager_shape(x2)
-
- # This code is run to make the code significantly faster
- if x2_shape[0] < 10 * x1_shape[0] ** 0.145 and isinstance(x2, Iterable):
- if invert:
- mask = xp.ones(x1_shape[0], dtype=xp.bool, device=_compat.device(x1))
- for a in x2:
- mask &= x1 != a
- else:
- mask = xp.zeros(x1_shape[0], dtype=xp.bool, device=_compat.device(x1))
- for a in x2:
- mask |= x1 == a
- return mask
-
- rev_idx = xp.empty(0) # placeholder
- if not assume_unique:
- x1, rev_idx = xp.unique_inverse(x1)
- x2 = xp.unique_values(x2)
-
- ar = xp.concat((x1, x2))
- device_ = _compat.device(ar)
- # We need this to be a stable sort.
- order = xp.argsort(ar, stable=True)
- reverse_order = xp.argsort(order, stable=True)
- sar = xp.take(ar, order, axis=0)
- ar_size = _compat.size(sar)
- assert ar_size is not None, "xp.unique*() on lazy backends raises"
- if ar_size >= 1:
- bool_ar = sar[1:] != sar[:-1] if invert else sar[1:] == sar[:-1]
- else:
- bool_ar = xp.asarray([False]) if invert else xp.asarray([True])
- flag = xp.concat((bool_ar, xp.asarray([invert], device=device_)))
- ret = xp.take(flag, reverse_order, axis=0)
-
- if assume_unique:
- return ret[: x1.shape[0]]
- return xp.take(ret, rev_idx, axis=0)
-
-
-def is_python_scalar(x: object) -> TypeIs[complex]: # numpydoc ignore=PR01,RT01
- """Return True if `x` is a Python scalar, False otherwise."""
- # isinstance(x, float) returns True for np.float64
- # isinstance(x, complex) returns True for np.complex128
- # bool is a subclass of int
- return isinstance(x, int | float | complex) and not is_numpy_array(x)
-
-
-def asarrays(
- a: Array | complex,
- b: Array | complex,
- xp: ModuleType,
-) -> tuple[Array, Array]:
- """
- Ensure both `a` and `b` are arrays.
-
- If `b` is a python scalar, it is converted to the same dtype as `a`, and vice versa.
-
- Behavior is not specified when mixing a Python ``float`` and an array with an
- integer data type; this may give ``float32``, ``float64``, or raise an exception.
- Behavior is implementation-specific.
-
- Similarly, behavior is not specified when mixing a Python ``complex`` and an array
- with a real-valued data type; this may give ``complex64``, ``complex128``, or raise
- an exception. Behavior is implementation-specific.
-
- Parameters
- ----------
- a, b : Array | int | float | complex | bool
- Input arrays or scalars. At least one must be an array.
- xp : array_namespace, optional
- The standard-compatible namespace for `x`. Default: infer.
-
- Returns
- -------
- Array, Array
- The input arrays, possibly converted to arrays if they were scalars.
-
- See Also
- --------
- mixing-arrays-with-python-scalars : Array API specification for the behavior.
- """
- a_scalar = is_python_scalar(a)
- b_scalar = is_python_scalar(b)
- if not a_scalar and not b_scalar:
- # This includes misc. malformed input e.g. str
- return a, b # type: ignore[return-value]
-
- swap = False
- if a_scalar:
- swap = True
- b, a = a, b
-
- if is_array_api_obj(a):
- # a is an Array API object
- # b is a int | float | complex | bool
- xa = a
-
- # https://data-apis.org/array-api/draft/API_specification/type_promotion.html#mixing-arrays-with-python-scalars
- same_dtype = {
- bool: "bool",
- int: ("integral", "real floating", "complex floating"),
- float: ("real floating", "complex floating"),
- complex: "complex floating",
- }
- kind = same_dtype[type(cast(complex, b))]
- if xp.isdtype(a.dtype, kind):
- xb = xp.asarray(b, dtype=a.dtype, device=_compat.device(a))
- else:
- # Undefined behaviour. Let the function deal with it, if it can.
- xb = xp.asarray(b, device=_compat.device(a))
-
- else:
- # Neither a nor b are Array API objects.
- # Note: we can only reach this point when one explicitly passes
- # xp=xp to the calling function; otherwise we fail earlier on
- # array_namespace(a, b).
- xa, xb = xp.asarray(a), xp.asarray(b)
-
- return (xb, xa) if swap else (xa, xb)
-
-
-def ndindex(*x: int) -> Generator[tuple[int, ...]]:
- """
- Generate all N-dimensional indices for a given array shape.
-
- Given the shape of an array, an ndindex instance iterates over the N-dimensional
- index of the array. At each iteration a tuple of indices is returned, the last
- dimension is iterated over first.
-
- This has an identical API to numpy.ndindex.
-
- Parameters
- ----------
- *x : int
- The shape of the array.
- """
- if not x:
- yield ()
- return
- for i in ndindex(*x[:-1]):
- for j in range(x[-1]):
- yield *i, j
-
-
-def eager_shape(x: Array, /, axis: int | None = None) -> tuple[int, ...]:
- """
- Return shape of an array. Raise if shape is not fully defined.
-
- Parameters
- ----------
- x : Array
- Input array.
- axis : int, optional
- If provided, only returns the tuple (shape[axis],).
-
- Returns
- -------
- tuple[int, ...]
- Shape of the array.
- """
- shape = x.shape
- if axis is not None:
- s = shape[axis]
- # Dask arrays uses non-standard NaN instead of None
- if s is None or math.isnan(s):
- msg = f"Unsupported lazy shape for axis {axis}"
- raise TypeError(msg)
- return (s,)
-
- if any(s is None or math.isnan(s) for s in shape):
- msg = "Unsupported lazy shape"
- raise TypeError(msg)
- return cast(tuple[int, ...], shape)
-
-
-def meta_namespace(
- *arrays: Array | complex | None, xp: ModuleType | None = None
-) -> ModuleType:
- """
- Get the namespace of Dask chunks.
-
- On all other backends, just return the namespace of the arrays.
-
- Parameters
- ----------
- *arrays : Array | int | float | complex | bool | None
- Input arrays.
- xp : array_namespace, optional
- The standard-compatible namespace for the input arrays. Default: infer.
-
- Returns
- -------
- array_namespace
- If xp is Dask, the namespace of the Dask chunks;
- otherwise, the namespace of the arrays.
- """
- xp = array_namespace(*arrays) if xp is None else xp
- if not is_dask_namespace(xp):
- return xp
- # Quietly skip scalars and None's
- metas = [cast(Array | None, getattr(a, "_meta", None)) for a in arrays]
- return array_namespace(*metas)
-
-
-def capabilities(
- xp: ModuleType, *, device: Device | None = None
-) -> dict[str, int | None]:
- """
- Return patched ``xp.__array_namespace_info__().capabilities()``.
-
- TODO this helper should be eventually removed once all the special cases
- it handles are fixed in the respective backends.
-
- Parameters
- ----------
- xp : array_namespace
- The standard-compatible namespace.
- device : Device, optional
- The device to use.
-
- Returns
- -------
- dict
- Capabilities of the namespace.
- """
- out = xp.__array_namespace_info__().capabilities()
- if is_jax_namespace(xp):
- if out["boolean indexing"]: # pragma: no cover
- # Backwards compatibility with jax <0.6.0
- # https://github.com/jax-ml/jax/issues/27418
- out = out.copy()
- out["boolean indexing"] = False
- elif is_torch_namespace(xp):
- # FIXME https://github.com/data-apis/array-api/issues/945
- device = xp.get_default_device() if device is None else xp.device(device)
- if device.type == "meta": # type: ignore[union-attr] # pyright: ignore[reportAttributeAccessIssue,reportOptionalMemberAccess]
- out = out.copy()
- out["boolean indexing"] = False
- out["data-dependent shapes"] = False
-
- return out
-
-
-_BASIC_PICKLED_TYPES = frozenset((
- bool, int, float, complex, str, bytes, bytearray,
- list, tuple, dict, set, frozenset, range, slice,
- types.NoneType, types.EllipsisType,
-)) # fmt: skip
-_BASIC_REST_TYPES = frozenset((
- type, types.BuiltinFunctionType, types.FunctionType, types.ModuleType
-)) # fmt: skip
-
-FlattenRest: TypeAlias = tuple[object, ...]
-
-
-def pickle_flatten(
- obj: object, cls: type[T] | tuple[type[T], ...]
-) -> tuple[list[T], FlattenRest]:
- """
- Use the pickle machinery to extract objects out of an arbitrary container.
-
- Unlike regular ``pickle.dumps``, this function always succeeds.
-
- Parameters
- ----------
- obj : object
- The object to pickle.
- cls : type | tuple[type, ...]
- One or multiple classes to extract from the object.
- The instances of these classes inside ``obj`` will not be pickled.
-
- Returns
- -------
- instances : list[cls]
- All instances of ``cls`` found inside ``obj`` (not pickled).
- rest
- Opaque object containing the pickled bytes plus all other objects where
- ``__reduce__`` / ``__reduce_ex__`` is either not implemented or raised.
- These are unpickleable objects, types, modules, and functions.
-
- This object is *typically* hashable save for fairly exotic objects
- that are neither pickleable nor hashable.
-
- This object is pickleable if everything except ``instances`` was pickleable
- in the input object.
-
- See Also
- --------
- pickle_unflatten : Reverse function.
-
- Examples
- --------
- >>> class A:
- ... def __repr__(self):
- ... return ""
- >>> class NS:
- ... def __repr__(self):
- ... return ""
- ... def __reduce__(self):
- ... assert False, "not serializable"
- >>> obj = {1: A(), 2: [A(), NS(), A()]}
- >>> instances, rest = pickle_flatten(obj, A)
- >>> instances
- [, , ]
- >>> pickle_unflatten(instances, rest)
- {1: , 2: [ , , ]}
-
- This can be also used to swap inner objects; the only constraint is that
- the number of objects in and out must be the same:
-
- >>> pickle_unflatten(["foo", "bar", "baz"], rest)
- {1: "foo", 2: ["bar", , "baz"]}
- """
- instances: list[T] = []
- rest: list[object] = []
-
- class Pickler(pickle.Pickler): # numpydoc ignore=GL08
- """
- Use the `pickle.Pickler.persistent_id` hook to extract objects.
- """
-
- @override
- def persistent_id(
- self, obj: object
- ) -> Literal[0, 1, None]: # numpydoc ignore=GL08
- if isinstance(obj, cls):
- instances.append(obj)
- return 0
-
- typ_ = type(obj)
- if typ_ in _BASIC_PICKLED_TYPES: # No subclasses!
- # If obj is a collection, recursively descend inside it
- return None
- if typ_ in _BASIC_REST_TYPES:
- rest.append(obj)
- return 1
-
- try:
- # Note: a class that defines __slots__ without defining __getstate__
- # cannot be pickled with __reduce__(), but can with __reduce_ex__(5)
- _ = obj.__reduce_ex__(pickle.HIGHEST_PROTOCOL)
- except Exception: # pylint: disable=broad-exception-caught
- rest.append(obj)
- return 1
-
- # Object can be pickled. Let the Pickler recursively descend inside it.
- return None
-
- f = io.BytesIO()
- p = Pickler(f, protocol=pickle.HIGHEST_PROTOCOL)
- p.dump(obj)
- return instances, (f.getvalue(), *rest)
-
-
-def pickle_unflatten(instances: Iterable[object], rest: FlattenRest) -> Any:
- """
- Reverse of ``pickle_flatten``.
-
- Parameters
- ----------
- instances : Iterable
- Inner objects to be reinserted into the flattened container.
- rest : FlattenRest
- Extra bits, as returned by ``pickle_flatten``.
-
- Returns
- -------
- object
- The outer object originally passed to ``pickle_flatten`` after a
- pickle->unpickle round-trip.
-
- See Also
- --------
- pickle_flatten : Serializing function.
- pickle.loads : Standard unpickle function.
-
- Notes
- -----
- The `instances` iterable must yield at least the same number of elements as the ones
- returned by ``pickle_flatten``, but the elements do not need to be the same objects
- or even the same types of objects. Excess elements, if any, will be left untouched.
- """
- iters = iter(instances), iter(rest)
- pik = cast(bytes, next(iters[1]))
-
- class Unpickler(pickle.Unpickler): # numpydoc ignore=GL08
- """Mirror of the overridden Pickler in pickle_flatten."""
-
- @override
- def persistent_load(self, pid: Literal[0, 1]) -> object: # numpydoc ignore=GL08
- try:
- return next(iters[pid])
- except StopIteration as e:
- msg = "Not enough objects to unpickle"
- raise ValueError(msg) from e
-
- f = io.BytesIO(pik)
- return Unpickler(f).load()
-
-
-class _AutoJITWrapper(Generic[T]): # numpydoc ignore=PR01
- """
- Helper of :func:`jax_autojit`.
-
- Wrap arbitrary inputs and outputs of the jitted function and
- convert them to/from PyTrees.
- """
-
- _obj: Any
- _is_iter: bool
- _registered: ClassVar[bool] = False
- __slots__: tuple[str, ...] = ("_is_iter", "_obj")
-
- def __init__(self, obj: T) -> None: # numpydoc ignore=GL08
- self._register()
- if isinstance(obj, Iterator):
- self._obj = list(obj)
- self._is_iter = True
- else:
- self._obj = obj
- self._is_iter = False
-
- @property
- def obj(self) -> T: # numpydoc ignore=RT01
- """Return wrapped object."""
- return iter(self._obj) if self._is_iter else self._obj
-
- @classmethod
- def _register(cls) -> None: # numpydoc ignore=SS06
- """
- Register upon first use instead of at import time, to avoid
- globally importing JAX.
- """
- if not cls._registered:
- import jax
-
- jax.tree_util.register_pytree_node(
- cls,
- lambda instance: pickle_flatten(instance, jax.Array), # pyright: ignore[reportUnknownArgumentType]
- lambda aux_data, children: pickle_unflatten(children, aux_data), # pyright: ignore[reportUnknownArgumentType]
- )
- cls._registered = True
-
-
-def jax_autojit(
- func: Callable[P, T],
-) -> Callable[P, T]: # numpydoc ignore=PR01,RT01,SS03
- """
- Wrap `func` with ``jax.jit``, with the following differences:
-
- - Python scalar arguments and return values are not automatically converted to
- ``jax.Array`` objects.
- - All non-array arguments are automatically treated as static.
- Unlike ``jax.jit``, static arguments must be either hashable or serializable with
- ``pickle``.
- - Unlike ``jax.jit``, non-array arguments and return values are not limited to
- tuple/list/dict, but can be any object serializable with ``pickle``.
- - Automatically descend into non-array arguments and find ``jax.Array`` objects
- inside them, then rebuild the arguments when entering `func`, swapping the JAX
- concrete arrays with tracer objects.
- - Automatically descend into non-array return values and find ``jax.Array`` objects
- inside them, then rebuild them downstream of exiting the JIT, swapping the JAX
- tracer objects with concrete arrays.
- - Returned iterators are immediately completely consumed.
-
- See Also
- --------
- jax.jit : JAX JIT compilation function.
-
- Notes
- -----
- These are useful choices *for testing purposes only*, which is how this function is
- intended to be used. The output of ``jax.jit`` is a C++ level callable, that
- directly dispatches to the compiled kernel after the initial call. In comparison,
- ``jax_autojit`` incurs a much higher dispatch time.
-
- Additionally, consider::
-
- def f(x: Array, y: float, plus: bool) -> Array:
- return x + y if plus else x - y
-
- j1 = jax.jit(f, static_argnames="plus")
- j2 = jax_autojit(f)
-
- In the above example, ``j2`` requires a lot less setup to be tested effectively than
- ``j1``, but on the flip side it means that it will be re-traced for every different
- value of ``y``, which likely makes it not fit for purpose in production.
- """
- import jax
-
- @jax.jit # type: ignore[untyped-decorator] # pyright: ignore[reportUntypedFunctionDecorator]
- def inner( # numpydoc ignore=GL08
- wargs: _AutoJITWrapper[Any],
- ) -> _AutoJITWrapper[T]:
- args, kwargs = wargs.obj
- res = func(*args, **kwargs) # pyright: ignore[reportCallIssue]
- return _AutoJITWrapper(res)
-
- @wraps(func)
- def outer(*args: P.args, **kwargs: P.kwargs) -> T: # numpydoc ignore=GL08
- wargs = _AutoJITWrapper((args, kwargs))
- return inner(wargs).obj
-
- return outer
diff --git a/src/array_api_extra/_lib/_utils/_typing.py b/src/array_api_extra/_lib/_utils/_typing.py
deleted file mode 100644
index 8204be47..00000000
--- a/src/array_api_extra/_lib/_utils/_typing.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# numpydoc ignore=GL08
-# pylint: disable=missing-module-docstring,duplicate-code
-
-Array = object
-DType = object
-Device = object
-GetIndex = object
-SetIndex = object
-
-__all__ = ["Array", "DType", "Device", "GetIndex", "SetIndex"]
diff --git a/src/array_api_extra/_lib/_utils/_typing.pyi b/src/array_api_extra/_lib/_utils/_typing.pyi
deleted file mode 100644
index 35c255fc..00000000
--- a/src/array_api_extra/_lib/_utils/_typing.pyi
+++ /dev/null
@@ -1,105 +0,0 @@
-"""Static typing helpers."""
-
-from __future__ import annotations
-
-from types import EllipsisType
-from typing import Protocol, TypeAlias
-
-# TODO import from typing (requires Python >=3.12)
-from typing_extensions import override
-
-# TODO: use array-api-typing once it is available
-
-class Array(Protocol): # pylint: disable=missing-class-docstring
- # Unary operations
- def __abs__(self) -> Array: ...
- def __pos__(self) -> Array: ...
- def __neg__(self) -> Array: ...
- def __invert__(self) -> Array: ...
- # Binary operations
- def __add__(self, other: Array | complex, /) -> Array: ...
- def __sub__(self, other: Array | complex, /) -> Array: ...
- def __mul__(self, other: Array | complex, /) -> Array: ...
- def __truediv__(self, other: Array | complex, /) -> Array: ...
- def __floordiv__(self, other: Array | complex, /) -> Array: ...
- def __mod__(self, other: Array | complex, /) -> Array: ...
- def __pow__(self, other: Array | complex, /) -> Array: ...
- def __matmul__(self, other: Array, /) -> Array: ...
- def __and__(self, other: Array | int, /) -> Array: ...
- def __or__(self, other: Array | int, /) -> Array: ...
- def __xor__(self, other: Array | int, /) -> Array: ...
- def __lshift__(self, other: Array | int, /) -> Array: ...
- def __rshift__(self, other: Array | int, /) -> Array: ...
- def __lt__(self, other: Array | complex, /) -> Array: ...
- def __le__(self, other: Array | complex, /) -> Array: ...
- def __gt__(self, other: Array | complex, /) -> Array: ...
- def __ge__(self, other: Array | complex, /) -> Array: ...
- @override
- def __eq__(self, other: Array | complex, /) -> Array: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
- @override
- def __ne__(self, other: Array | complex, /) -> Array: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
- # Reflected operations
- def __radd__(self, other: Array | complex, /) -> Array: ...
- def __rsub__(self, other: Array | complex, /) -> Array: ...
- def __rmul__(self, other: Array | complex, /) -> Array: ...
- def __rtruediv__(self, other: Array | complex, /) -> Array: ...
- def __rfloordiv__(self, other: Array | complex, /) -> Array: ...
- def __rmod__(self, other: Array | complex, /) -> Array: ...
- def __rpow__(self, other: Array | complex, /) -> Array: ...
- def __rmatmul__(self, other: Array, /) -> Array: ...
- def __rand__(self, other: Array | int, /) -> Array: ...
- def __ror__(self, other: Array | int, /) -> Array: ...
- def __rxor__(self, other: Array | int, /) -> Array: ...
- def __rlshift__(self, other: Array | int, /) -> Array: ...
- def __rrshift__(self, other: Array | int, /) -> Array: ...
- # Attributes
- @property
- def dtype(self) -> DType: ...
- @property
- def device(self) -> Device: ...
- @property
- def mT(self) -> Array: ... # pylint: disable=invalid-name
- @property
- def ndim(self) -> int: ...
- @property
- def shape(self) -> tuple[int | None, ...]: ...
- @property
- def size(self) -> int | None: ...
- @property
- def T(self) -> Array: ... # pylint: disable=invalid-name
- # Collection operations (note: an Array does not have to be Sized or Iterable)
- def __getitem__(self, key: GetIndex, /) -> Array: ...
- def __setitem__(self, key: SetIndex, value: Array | complex, /) -> None: ...
- # Materialization methods (may raise on lazy arrays)
- def __bool__(self) -> bool: ...
- def __complex__(self) -> complex: ...
- def __float__(self) -> float: ...
- def __index__(self) -> int: ...
- def __int__(self) -> int: ...
-
- # Misc methods (frequently not implemented in Arrays wrapped by array-api-compat)
- # def __array_namespace__(*, api_version: str | None) -> ModuleType: ...
- # def __dlpack__(
- # *,
- # stream: int | Any | None = None,
- # max_version: tuple[int, int] | None = None,
- # dl_device: tuple[int, int] | None = None, # tuple[Enum, int]
- # copy: bool | None = None,
- # ) -> Any: ...
- # def __dlpack_device__() -> tuple[int, int]: ... # tuple[Enum, int]
- # def to_device(device: Device, /, *, stream: int | Any | None = None) -> Array: ...
-
-class DType(Protocol): # pylint: disable=missing-class-docstring
- pass
-
-class Device(Protocol): # pylint: disable=missing-class-docstring
- pass
-
-SetIndex: TypeAlias = (
- int | slice | EllipsisType | Array | tuple[int | slice | EllipsisType | Array, ...]
-)
-GetIndex: TypeAlias = (
- SetIndex | None | tuple[int | slice | EllipsisType | None | Array, ...]
-)
-
-__all__ = ["Array", "DType", "Device", "GetIndex", "SetIndex"]
diff --git a/src/array_api_extra/testing.py b/src/array_api_extra/testing.py
deleted file mode 100644
index 6b46e09f..00000000
--- a/src/array_api_extra/testing.py
+++ /dev/null
@@ -1,1006 +0,0 @@
-"""
-Public testing utilities.
-
-See also _lib._testing for additional private testing utilities.
-"""
-
-from __future__ import annotations
-
-import contextlib
-import enum
-import math
-import warnings
-from collections.abc import Callable, Generator, Iterator, Sequence
-from functools import update_wrapper, wraps
-from inspect import getattr_static
-from types import FunctionType, ModuleType
-from typing import TYPE_CHECKING, Any, ParamSpec, TypeVar, cast
-
-from ._lib._utils._compat import (
- array_namespace,
- is_array_api_strict_namespace,
- is_cupy_namespace,
- is_dask_namespace,
- is_jax_namespace,
- is_numpy_namespace,
- is_pydata_sparse_namespace,
- is_torch_array,
- is_torch_namespace,
- to_device,
-)
-from ._lib._utils._helpers import jax_autojit, pickle_flatten, pickle_unflatten
-from ._lib._utils._typing import Array, Device
-
-__all__ = [
- "assert_close",
- "assert_close_nulp",
- "assert_equal",
- "assert_less",
- "lazy_xp_function",
- "patch_lazy_xp_functions",
-]
-
-if TYPE_CHECKING: # pragma: no cover
- # TODO import override from typing (requires Python >=3.12)
- import numpy as np
- import pytest
- from dask.typing import Graph, Key, SchedulerGetCallable
- from typing_extensions import override
-
-else:
- # Sphinx hacks
- SchedulerGetCallable = object
-
- def override(func):
- return func
-
-
-P = ParamSpec("P")
-T = TypeVar("T")
-
-_ufuncs_tags: dict[object, dict[str, Any]] = {}
-
-
-class Deprecated(enum.Enum):
- """Unique type for deprecated parameters."""
-
- DEPRECATED = 1
-
-
-DEPRECATED = Deprecated.DEPRECATED
-
-
-def _clone_function( # numpydoc ignore=PR01,RT01
- f: Callable[..., Any],
-) -> Callable[..., Any]:
- """Return a clone of an existing function."""
- f_new = FunctionType(
- f.__code__,
- f.__globals__,
- name=f.__name__,
- argdefs=f.__defaults__,
- closure=f.__closure__,
- )
- f_new.__kwdefaults__ = f.__kwdefaults__
- return update_wrapper(f_new, f)
-
-
-def lazy_xp_function(
- func: Callable[..., Any] | tuple[type, str],
- *,
- allow_dask_compute: bool | int = False,
- jax_jit: bool = True,
- static_argnums: Deprecated = DEPRECATED,
- static_argnames: Deprecated = DEPRECATED,
-) -> None: # numpydoc ignore=GL07
- """
- Tag a function to be tested on lazy backends.
-
- Tag a function so that when any tests are executed with ``xp=jax.numpy`` the
- function is replaced with a jitted version of itself, and when it is executed with
- ``xp=dask.array`` the function will raise if it attempts to materialize the graph.
- This will be later expanded to provide test coverage for other lazy backends.
-
- In order for the tag to be effective, the test or a fixture must call
- :func:`patch_lazy_xp_functions`.
-
- Parameters
- ----------
- func : callable | tuple[type, str]
- Function to be tested, or a tuple containing an (uninstantiated) class and a
- method name to specify a class method to be tested.
- allow_dask_compute : bool | int, optional
- Whether `func` is allowed to internally materialize the Dask graph, or maximum
- number of times it is allowed to do so. This is typically triggered by
- ``bool()``, ``float()``, or ``np.asarray()``.
-
- Set to 1 if you are aware that `func` converts the input parameters to NumPy and
- want to let it do so at least for the time being, knowing that it is going to be
- extremely detrimental for performance.
-
- If a test needs values higher than 1 to pass, it is a canary that the conversion
- to NumPy/bool/float is happening multiple times, which translates to multiple
- computations of the whole graph. Short of making the function fully lazy, you
- should at least add explicit calls to ``np.asarray()`` early in the function.
- *Note:* the counter of `allow_dask_compute` resets after each call to `func`, so
- a test function that invokes `func` multiple times should still work with this
- parameter set to 1.
-
- Set to True to allow `func` to materialize the graph an unlimited number
- of times.
-
- Default: False, meaning that `func` must be fully lazy and never materialize the
- graph.
- jax_jit : bool, optional
- Set to True to replace `func` with a smart variant of ``jax.jit(func)`` after
- calling the :func:`patch_lazy_xp_functions` test helper with ``xp=jax.numpy``.
- This is the default behaviour.
- Set to False if `func` is only compatible with eager (non-jitted) JAX.
-
- Unlike with vanilla ``jax.jit``, all arguments and return types that are not JAX
- arrays are treated as static; the function can accept and return arbitrary
- wrappers around JAX arrays. This difference is because, in real life, most users
- won't wrap the function directly with ``jax.jit`` but rather they will use it
- within their own code, which is itself then wrapped by ``jax.jit``, and
- internally consume the function's outputs.
-
- In other words, the pattern that is being tested is::
-
- >>> @jax.jit
- ... def user_func(x):
- ... y = user_prepares_inputs(x)
- ... z = func(y, some_static_arg=True)
- ... return user_consumes(z)
-
- Default: True.
- static_argnums : Deprecated
- Deprecated; ignored.
- static_argnames : Deprecated
- Deprecated; ignored.
-
- See Also
- --------
- patch_lazy_xp_functions : Companion function to call from the test or fixture.
- jax.jit : JAX function to compile a function for performance.
-
- Examples
- --------
- In ``test_mymodule.py``::
-
- from array_api_extra.testing import lazy_xp_function from mymodule import myfunc
-
- lazy_xp_function(myfunc)
-
- def test_myfunc(xp):
- a = xp.asarray([1, 2])
- # When xp=jax.numpy, this is similar to `b = jax.jit(myfunc)(a)`
- # When xp=dask.array, crash on compute() or persist()
- b = myfunc(a)
-
- Notes
- -----
- In order for this tag to be effective, the test function must be imported into the
- test module globals without its namespace; alternatively its namespace must be
- declared in a ``lazy_xp_modules`` list in the test module globals.
-
- Example 1::
-
- from mymodule import myfunc
-
- lazy_xp_function(myfunc)
-
- def test_myfunc(xp):
- x = myfunc(xp.asarray([1, 2]))
-
- Example 2::
-
- import mymodule
-
- lazy_xp_modules = [mymodule]
- lazy_xp_function(mymodule.myfunc)
-
- def test_myfunc(xp):
- x = mymodule.myfunc(xp.asarray([1, 2]))
-
- A test function can circumvent this monkey-patching system by using a namespace
- outside of the two above patterns. You need to sanitize your code to make sure this
- only happens intentionally.
-
- Example 1::
-
- import mymodule
- from mymodule import myfunc
-
- lazy_xp_function(myfunc)
-
- def test_myfunc(xp):
- a = xp.asarray([1, 2])
- b = myfunc(a) # This is wrapped when xp=jax.numpy or xp=dask.array
- c = mymodule.myfunc(a) # This is not
-
- Example 2::
-
- import mymodule
-
- class naked:
- myfunc = mymodule.myfunc
-
- lazy_xp_modules = [mymodule]
- lazy_xp_function(mymodule.myfunc)
-
- def test_myfunc(xp):
- a = xp.asarray([1, 2])
- b = mymodule.myfunc(a) # This is wrapped when xp=jax.numpy or xp=dask.array
- c = naked.myfunc(a) # This is not
- """
- if static_argnums is not DEPRECATED or static_argnames is not DEPRECATED:
- warnings.warn(
- (
- "The `static_argnums` and `static_argnames` parameters are deprecated "
- "and ignored. They will be removed in a future version."
- ),
- DeprecationWarning,
- stacklevel=2,
- )
- tags: dict[str, bool | int | type] = {
- "allow_dask_compute": allow_dask_compute,
- "jax_jit": jax_jit,
- }
-
- if isinstance(func, tuple):
- # Replace the method with a clone before adding tags
- # to avoid adding unwanted tags to a parent method when
- # the method was inherited from a parent class.
- # Note: can't just accept an unbound method `cls.method_name` because in
- # case of inheritance it would be impossible to attribute it to the child class.
- # This also makes it so tagged methods will appear in their class's ``__dict__``
- # and thus findable by ``iter_tagged_modules`` below.
- cls, method_name = func
- # The method might be a staticmethod or classmethod so we need to do a dance
- # to ensure that this is preserved.
- raw_attr = getattr_static(cls, method_name)
- method = getattr(cls, method_name)
- if isinstance(raw_attr, classmethod):
- method = method.__func__
- cloned_method = _clone_function(method)
-
- method_to_set: Any
- if isinstance(raw_attr, staticmethod):
- method_to_set = staticmethod(cloned_method)
- elif isinstance(raw_attr, classmethod):
- method_to_set = classmethod(cloned_method)
- else:
- method_to_set = cloned_method
-
- setattr(cls, method_name, method_to_set)
- f = getattr(cls, method_name)
- if isinstance(raw_attr, classmethod):
- f = f.__func__
- # Annotate that cls owns this method so we can check that later.
- tags["owner"] = cls
- else:
- f = func
-
- try:
- f._lazy_xp_function = tags # pylint: disable=protected-access # pyright: ignore[reportFunctionMemberAccess] # pyrefly: ignore[missing-attribute]
- except AttributeError: # @cython.vectorize
- _ufuncs_tags[f] = tags
-
-
-def patch_lazy_xp_functions(
- request: pytest.FixtureRequest,
- monkeypatch: pytest.MonkeyPatch | None = None,
- *,
- xp: ModuleType,
-) -> contextlib.AbstractContextManager[None]:
- """
- Test lazy execution of functions tagged with :func:`lazy_xp_function`.
-
- If ``xp==jax.numpy``, search for all functions and methods which have been tagged
- with :func:`lazy_xp_function` in the globals of the module that defines the current
- test, as well as in the ``lazy_xp_modules`` list in the globals of the same module,
- and wrap them with :func:`jax.jit`.
- Unwrap them at the end of the test.
-
- If ``xp==dask.array``, wrap the functions with a decorator that disables
- ``compute()`` and ``persist()`` and ensures that exceptions and warnings are raised
- eagerly.
-
- This function should be typically called by your library's `xp` fixture that runs
- tests on multiple backends::
-
- @pytest.fixture(params=[
- numpy,
- array_api_strict,
- pytest.param(jax.numpy, marks=pytest.mark.thread_unsafe),
- pytest.param(dask.array, marks=pytest.mark.thread_unsafe),
- ])
- def xp(request):
- with patch_lazy_xp_functions(request, xp=request.param):
- yield request.param
-
- but it can be otherwise be called by the test itself too.
-
- Parameters
- ----------
- request : pytest.FixtureRequest
- Pytest fixture, as acquired by the test itself or by one of its fixtures.
- monkeypatch : pytest.MonkeyPatch
- Deprecated.
- xp : array_namespace
- Array namespace to be tested.
-
- Returns
- -------
- contextlib.AbstractContextManager
- Testing context manager.
-
- See Also
- --------
- lazy_xp_function : Tag a function to be tested on lazy backends.
- pytest.FixtureRequest : `request` test function parameter.
-
- Notes
- -----
- This context manager monkey-patches modules and as such is thread unsafe
- on Dask and JAX. If you run your test suite with
- `pytest-run-parallel `_,
- you should mark these backends with ``@pytest.mark.thread_unsafe``, as shown in
- the example above.
- """
- mod = cast(ModuleType, request.module)
- search_targets: list[ModuleType | type] = [
- mod,
- *cast(list[ModuleType], getattr(mod, "lazy_xp_modules", [])),
- ]
- # Also search for classes within the above modules which have had lazy_xp_function
- # applied to methods through ``lazy_xp_function((cls, method_name))`` syntax.
- # We might end up adding classes incidentally imported into modules, so using a
- # set here to cut down on potential redundancy.
- classes: set[type] = set()
- for target in search_targets:
- for obj in target.__dict__.values():
- if isinstance(obj, type):
- classes.add(obj)
- search_targets.extend(classes)
-
- to_revert: list[tuple[ModuleType | type, str, object]] = []
-
- def temp_setattr( # numpydoc ignore=PR01
- target: ModuleType | type, name: str, func: object
- ) -> None:
- """
- Temporary setattr.
-
- Variant of monkeypatch.setattr, which allows monkey-patching only selected
- parameters of a test so that pytest-run-parallel can run on the remainder.
- """
- assert hasattr(target, name)
- # Need getattr_static because the attr could be a staticmethod or other
- # descriptor and we don't want that to be stripped away.
- original = getattr_static(target, name)
- to_revert.append((target, name, original))
- setattr(target, name, func)
-
- if monkeypatch is not None:
- warnings.warn(
- (
- "The `monkeypatch` parameter is deprecated and will be removed in a "
- "future version. "
- "Use `patch_lazy_xp_function` as a context manager instead."
- ),
- DeprecationWarning,
- stacklevel=2,
- )
- # Enable using patch_lazy_xp_function not as a context manager
- temp_setattr = monkeypatch.setattr # type: ignore[assignment] # pyright: ignore[reportAssignmentType]
-
- def iter_tagged() -> Iterator[
- tuple[ModuleType | type, str, Any, Callable[..., Any], dict[str, Any]]
- ]: # numpydoc ignore=GL08
- for target in search_targets:
- for name, attr in target.__dict__.items():
- # attr might be a staticmethod or classmethod. If so we need
- # to peel it back and wrap the underlying function and later
- # make sure not to accidentally replace it with a regular
- # method.
- func: Any = (
- attr.__func__
- if isinstance(attr, (staticmethod, classmethod))
- else attr
- )
- tags: dict[str, Any] | None = None
- with contextlib.suppress(AttributeError):
- tags = func._lazy_xp_function # pylint: disable=protected-access
- if tags is None:
- with contextlib.suppress(KeyError, TypeError):
- tags = _ufuncs_tags[func]
- if tags is not None:
- if isinstance(target, type) and tags.get("owner") is not target:
- # There's a common pattern to wrap functions in namespace
- # classes to bypass lazy_xp_function like this:
- #
- # class naked:
- # myfunc = mymodule.myfunc
- #
- # To ensure this still works when checking for tags in
- # attributes of classes, ensure that target is the actual
- # owning class where func was defined.
- continue
- # put attr, and func in the outputs so we can later tell
- # if this was a staticmethod or classmethod.
- yield target, name, attr, func, tags
-
- wrapped: Any
- if is_dask_namespace(xp):
- for target, name, attr, func, tags in iter_tagged():
- n = tags["allow_dask_compute"]
- if n is True:
- n = 1_000_000
- elif n is False:
- n = 0
- wrapped = _dask_wrap(func, n)
- # If we're dealing with a staticmethod or classmethod, make
- # sure things stay that way.
- if isinstance(attr, staticmethod):
- wrapped = staticmethod(wrapped)
- elif isinstance(attr, classmethod):
- wrapped = classmethod(wrapped)
- temp_setattr(target, name, wrapped)
-
- elif is_jax_namespace(xp):
- for target, name, attr, func, tags in iter_tagged():
- if tags["jax_jit"]:
- wrapped = jax_autojit(func)
- # If we're dealing with a staticmethod or classmethod, make
- # sure things stay that way.
- if isinstance(attr, staticmethod):
- wrapped = staticmethod(wrapped)
- elif isinstance(attr, classmethod):
- wrapped = classmethod(wrapped)
- temp_setattr(target, name, wrapped)
-
- # We can't just decorate patch_lazy_xp_functions with
- # @contextlib.contextmanager because it would not work with the
- # deprecated monkeypatch when not used as a context manager.
- @contextlib.contextmanager
- def revert_on_exit() -> Generator[None]: # numpydoc ignore=GL08
- try:
- yield
- finally:
- for target, name, orig_func in to_revert:
- setattr(target, name, orig_func)
-
- return revert_on_exit()
-
-
-class _CountingDaskScheduler(SchedulerGetCallable):
- """
- Dask scheduler that counts how many times `dask.compute` is called.
-
- If the number of times exceeds 'max_count', it raises an error.
- This is a wrapper around Dask's own 'synchronous' scheduler.
-
- Parameters
- ----------
- max_count : int
- Maximum number of allowed calls to `dask.compute`.
- msg : str
- Assertion to raise when the count exceeds `max_count`.
- """
-
- count: int
- max_count: int
- msg: str
-
- def __init__(self, max_count: int, msg: str) -> None: # numpydoc ignore=GL08
- self.count = 0
- self.max_count = max_count
- self.msg = msg
-
- @override
- def __call__(
- self, dsk: Graph, keys: Sequence[Key] | Key, **kwargs: Any
- ) -> Any: # numpydoc ignore=GL08
- import dask
-
- self.count += 1
- # This should yield a nice traceback to the
- # offending line in the user's code
- assert self.count <= self.max_count, self.msg
-
- return dask.get(dsk, keys, **kwargs) # type: ignore[attr-defined] # pyright: ignore[reportPrivateImportUsage]
-
-
-def _dask_wrap(
- func: Callable[P, T], n: int
-) -> Callable[P, T]: # numpydoc ignore=PR01,RT01
- """
- Wrap `func` to raise if it attempts to call `dask.compute` more than `n` times.
-
- After the function returns, materialize the graph in order to re-raise exceptions.
- """
- import dask
- import dask.array as da
-
- func_name = getattr(func, "__name__", str(func))
- n_str = f"only up to {n}" if n else "no"
- msg = (
- f"Called `dask.compute()` or `dask.persist()` {n + 1} times, "
- f"but {n_str} calls are allowed. Set "
- f"`lazy_xp_function({func_name}, allow_dask_compute={n + 1})` "
- "to allow for more (but note that this will harm performance). "
- )
-
- @wraps(func)
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: # numpydoc ignore=GL08
- scheduler = _CountingDaskScheduler(n, msg)
- with dask.config.set({"scheduler": scheduler}): # pyright: ignore[reportPrivateImportUsage]
- out = func(*args, **kwargs)
-
- # Block until the graph materializes and reraise exceptions. This allows
- # `pytest.raises` and `pytest.warns` to work as expected. Note that this would
- # not work on scheduler='distributed', as it would not block.
- arrays, rest = pickle_flatten(out, da.Array)
- arrays = dask.persist(arrays, scheduler="threads")[0] # type: ignore[attr-defined,no-untyped-call] # pyright: ignore[reportPrivateImportUsage]
- return pickle_unflatten(arrays, rest) # pyright: ignore[reportUnknownArgumentType]
-
- return wrapper
-
-
-def _require_numpy() -> ModuleType: # numpydoc ignore=RT01
- """
- Import and return `numpy` if it is available, otherwise raise informative error.
- """
- try:
- import numpy as np
- except ImportError as e:
- msg = (
- "The assertion functions of `xpx.testing` require the numpy module "
- "to be importable in the Python environment."
- )
- raise ImportError(msg) from e
-
- return np
-
-
-def _check_ns_shape_dtype(
- actual: Array,
- desired: Array,
- check_dtype: bool,
- check_shape: bool,
- check_scalar: bool,
- xp: ModuleType | None = None,
-) -> tuple[Array, Array, ModuleType, ModuleType]: # numpydoc ignore=RT03
- """
- Assert that namespace, shape and dtype of the two arrays match.
-
- Parameters
- ----------
- actual : Array
- The array produced by the tested function.
- desired : Array
- The expected array (typically hardcoded).
- check_dtype : bool, default: True
- Whether to check agreement between actual and desired dtypes.
- check_shape : bool, default: True
- Whether to check agreement between actual and desired shapes.
- check_scalar : bool, default: False
- NumPy only: whether to check agreement between actual and desired types -
- 0d array vs scalar.
- xp : array_namespace, optional
- A standard-compatible namespace which `actual` and `desired` must match.
-
- Returns
- -------
- Actual array, desired array, their array namespace, the numpy module.
- """
- np = _require_numpy()
-
- actual_xp = array_namespace(actual) # Raises on Python scalars and lists
-
- if xp is not None:
- _msg = (
- "Namespace of actual array does not match the `xp` argument.\n"
- f"Actual array's namespace: {actual_xp.__name__}\n"
- f"Expected namespace: {xp.__name__}."
- )
- assert actual_xp == xp, _msg
- desired_xp = xp
- else:
- desired_xp = array_namespace(desired)
- _msg = (
- "Namespaces of actual and desired arrays do not match.\n"
- f"Actual: {actual_xp.__name__}\n"
- f"Desired: {desired_xp.__name__}."
- )
- assert actual_xp == desired_xp, _msg
-
- if is_numpy_namespace(actual_xp) and check_scalar:
- # only NumPy distinguishes between scalars and arrays; we do if check_scalar.
- _msg = (
- "array-ness does not match:\n Actual: "
- f"{type(actual)}\n Desired: {type(desired)}"
- )
- assert np.isscalar(actual) == np.isscalar(desired), _msg
-
- # Dask uses nan instead of None for unknown shapes
- actual_shape = cast(tuple[float, ...], actual.shape)
- desired_shape = cast(tuple[float, ...], desired.shape)
- assert None not in actual_shape # Requires explicit support
- assert None not in desired_shape
-
- if is_dask_namespace(desired_xp):
- if any(math.isnan(i) for i in actual_shape):
- actual.compute_chunk_sizes() # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
- actual_shape = cast(tuple[float, ...], actual.shape)
- if any(math.isnan(i) for i in desired_shape):
- desired.compute_chunk_sizes() # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
- desired_shape = cast(tuple[float, ...], desired.shape)
-
- if check_shape:
- msg = f"shapes do not match: {actual_shape} != {desired_shape}"
- assert actual_shape == desired_shape, msg
- elif desired.ndim > 0:
- # Ignore shape, but check flattened size. This is normally done by
- # np.testing.assert_array_equal etc even when strict=False, but not for
- # non-materializable arrays.
- # This check excludes 0d arrays as they are special-cased in NumPy.
- actual_size = math.prod(actual_shape)
- desired_size = math.prod(desired_shape)
- msg = f"sizes do not match: {actual_size} != {desired_size}"
- assert actual_size == desired_size, msg
-
- desired = desired_xp.asarray(desired)
- if check_dtype:
- msg = f"dtypes do not match: {actual.dtype} != {desired.dtype}"
- assert actual.dtype == desired.dtype, msg
- desired = desired_xp.broadcast_to(desired, actual_shape)
- return actual, desired, desired_xp, np
-
-
-def _is_materializable(x: Array) -> bool: # numpydoc ignore=PR01,RT01
- """
- Return True if you can call `as_numpy_array(x)`; False otherwise.
- """
- # Important: here we assume that we're not tracing -
- # e.g. we're not inside `jax.jit`` nor `cupy.cuda.Stream.begin_capture`.
- return not is_torch_array(x) or x.device.type != "meta" # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-
-
-def _as_numpy_array( # numpydoc ignore=PR01,RT01
- array: Array, *, xp: ModuleType
-) -> np.typing.NDArray[Any]:
- """
- Convert array to NumPy, bypassing GPU-CPU transfer guards and densification guards.
- """
- np = _require_numpy()
- if is_cupy_namespace(xp):
- return xp.asnumpy(array)
- if is_pydata_sparse_namespace(xp):
- return array.todense() # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-
- if is_torch_namespace(xp):
- array = cast(Array, array.resolve_conj()) # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
- array = to_device(array, "cpu")
- if is_array_api_strict_namespace(xp):
- cpu: Device = xp.Device("CPU_DEVICE")
- array = to_device(array, cpu)
- if is_jax_namespace(xp):
- import jax
-
- # Note: only needed if the transfer guard is enabled
- cpu = cast(Device, jax.devices("cpu")[0])
- array = to_device(array, cpu)
-
- if hasattr(array, "__dlpack__"):
- try:
- return np.from_dlpack(array)
- except (TypeError, BufferError):
- pass
-
- return np.asarray(array)
-
-
-def assert_close(
- actual: Array,
- desired: Array,
- *,
- rtol: float | Array | None = None,
- atol: float | Array = 0,
- equal_nan: bool = True,
- err_msg: str = "",
- verbose: bool = True,
- check_dtype: bool = True,
- check_shape: bool = True,
- check_scalar: bool = False,
- xp: ModuleType | None = None,
-) -> None:
- """
- Check that two arrays are close, up to tolerance ``atol + rtol * abs(desired)``.
-
- This is an interface to :func:`numpy.testing.assert_allclose` which accepts
- any standard-compatible array and performs additional array namespace,
- shape, and dtype checks.
-
- Parameters
- ----------
- actual : Array
- The array produced by the tested function.
- desired : Array
- The expected array (typically hardcoded).
- rtol : float or Array, optional
- Relative tolerance. Default: dtype-dependent.
- atol : float or Array, optional
- Absolute tolerance. Default: 0.
- equal_nan : bool, default: True
- Whether to consider NaNs in corresponding locations as equal.
- err_msg : str, optional
- Error message to display on failure.
- verbose : bool, default: True
- Whether to include the conflicting arrays in the error message on failure.
- check_dtype : bool, default: True
- Whether to check agreement between actual and desired dtypes.
- check_shape : bool, default: True
- Whether to check agreement between actual and desired shapes.
- check_scalar : bool, default: False
- NumPy only: whether to check agreement between actual and desired types —
- 0-D :class:`numpy.ndarray` vs scalar (e.g. :class:`numpy.double`).
- xp : array_namespace, optional
- A standard-compatible namespace which `actual` and `desired` must match.
-
- Raises
- ------
- AssertionError
- If `actual` and `desired` are not equal up to the defined tolerance.
-
- ImportError
- If :mod:`numpy` is not importable in the Python environment.
-
- See Also
- --------
- assert_equal : Similar function for exact equality checks.
- array_api_extra.isclose : Similar function checking closeness, returning a bool.
- numpy.testing.assert_allclose : Similar function for NumPy arrays.
-
- Notes
- -----
- The default `atol` and `rtol` differ from ``xp.all(xpx.isclose(a, b))``.
- For inexact dtypes, the default `rtol` is
- ``xp.finfo(actual.dtype).eps ** 0.5 * 4``, which for ``float64`` is roughly halfway
- between :math:`\\sqrt{\\epsilon}` and the default for
- :func:`numpy.testing.assert_allclose`, ``1e-7``.
- This gives a more reasonable default for lower precision dtypes,
- for example approximately ``1e-3`` for ``float32``.
- For exact dtypes, the default ``1e-7`` is used.
-
- Array arguments to `atol` and `rtol` must be valid input to :class:`float`.
- """
- __tracebackhide__ = True
- actual, desired, xp, np = _check_ns_shape_dtype(
- actual, desired, check_dtype, check_shape, check_scalar, xp
- )
- if not _is_materializable(actual):
- return
-
- if rtol is None:
- if xp.isdtype(actual.dtype, ("real floating", "complex floating")):
- # multiplier of 4 is used as for `np.float64` this puts the default `rtol`
- # roughly half way between sqrt(eps) and the default for
- # `numpy.testing.assert_allclose`, 1e-7
- rtol = xp.finfo(actual.dtype).eps ** 0.5 * 4
- else:
- rtol = 1e-7
- else:
- rtol = float(rtol)
-
- atol = float(atol)
-
- actual_np = _as_numpy_array(actual, xp=xp)
- desired_np = _as_numpy_array(desired, xp=xp)
- np.testing.assert_allclose(
- actual_np,
- desired_np,
- rtol=rtol,
- atol=atol,
- equal_nan=equal_nan,
- err_msg=err_msg,
- verbose=verbose,
- )
-
-
-def assert_equal(
- actual: Array,
- desired: Array,
- *,
- err_msg: str = "",
- verbose: bool = True,
- check_dtype: bool = True,
- check_shape: bool = True,
- check_scalar: bool = False,
- xp: ModuleType | None = None,
-) -> None:
- """
- Check that two arrays are equal.
-
- This is an interface to :func:`numpy.testing.assert_array_equal` which accepts
- any standard-compatible array and performs additional array namespace,
- shape, and dtype checks.
-
- Parameters
- ----------
- actual : Array
- The array produced by the tested function.
- desired : Array
- The expected array (typically hardcoded).
- err_msg : str, optional
- Error message to display on failure.
- verbose : bool, default: True
- Whether to include the conflicting arrays in the error message on failure.
- check_dtype : bool, default: True
- Whether to check agreement between actual and desired dtypes.
- check_shape : bool, default: True
- Whether to check agreement between actual and desired shapes.
- check_scalar : bool, default: False
- NumPy only: whether to check agreement between actual and desired types —
- 0-D :class:`numpy.ndarray` vs scalar (e.g. :class:`numpy.double`).
- xp : array_namespace, optional
- A standard-compatible namespace which `actual` and `desired` must match.
-
- Raises
- ------
- AssertionError
- If `actual` and `desired` are not equal.
-
- ImportError
- If :mod:`numpy` is not importable in the Python environment.
-
- See Also
- --------
- assert_close : Similar function for inexact equality checks.
- numpy.testing.assert_array_equal : Similar function for NumPy arrays.
- """
- __tracebackhide__ = True
- actual, desired, xp, np = _check_ns_shape_dtype(
- actual, desired, check_dtype, check_shape, check_scalar, xp
- )
- if not _is_materializable(actual):
- return
- actual_np = _as_numpy_array(actual, xp=xp)
- desired_np = _as_numpy_array(desired, xp=xp)
- np.testing.assert_array_equal(
- actual_np, desired_np, err_msg=err_msg, verbose=verbose
- )
-
-
-def assert_less(
- x: Array,
- y: Array,
- *,
- err_msg: str = "",
- verbose: bool = True,
- check_dtype: bool = True,
- check_shape: bool = True,
- check_scalar: bool = False,
- xp: ModuleType | None = None,
-) -> None:
- """
- Check that two arrays are ordered by less than.
-
- This is an interface to :func:`numpy.testing.assert_array_less` which accepts
- any standard-compatible array and performs additional array namespace,
- shape, and dtype checks.
-
- Parameters
- ----------
- x, y : Array
- Array to compare according to ``x < y`` (elementwise).
- err_msg : str, optional
- Error message to display on failure.
- verbose : bool, default: True
- Whether to include the conflicting arrays in the error message on failure.
- check_dtype : bool, default: True
- Whether to check agreement between the dtypes of `x` and `y`.
- check_shape : bool, default: True
- Whether to check agreement between the shapes of `x` and `y`.
- check_scalar : bool, default: False
- NumPy only: whether to check agreement between actual and desired types —
- 0-D :class:`numpy.ndarray` vs scalar (e.g. :class:`numpy.double`).
- xp : array_namespace, optional
- A standard-compatible namespace which `x` and `y` must match.
-
- Raises
- ------
- AssertionError
- If `x` is not strictly smaller than `y`, elementwise.
-
- ImportError
- If :mod:`numpy` is not importable in the Python environment.
-
- See Also
- --------
- assert_close : Similar function for inexact equality checks.
- numpy.testing.assert_array_less : Similar function for NumPy arrays.
- """
- __tracebackhide__ = True
- x, y, xp, np = _check_ns_shape_dtype(
- x, y, check_dtype, check_shape, check_scalar, xp
- )
- if not _is_materializable(x):
- return
- x_np = _as_numpy_array(x, xp=xp)
- y_np = _as_numpy_array(y, xp=xp)
- np.testing.assert_array_less(x_np, y_np, err_msg=err_msg, verbose=verbose)
-
-
-def assert_close_nulp(
- actual: Array,
- desired: Array,
- *,
- nulp: int = 1,
- check_dtype: bool = True,
- check_shape: bool = True,
- check_scalar: bool = False,
- xp: ModuleType | None = None,
-) -> None:
- """
- Compare two arrays relatively to their spacing.
-
- This is an interface to :func:`numpy.testing.assert_array_almost_equal_nulp`
- which accepts any standard-compatible array and performs
- additional array namespace, shape, and dtype checks.
-
- Parameters
- ----------
- actual : Array
- The array produced by the tested function.
- desired : Array
- The expected array (typically hardcoded).
- nulp : int, optional
- The maximum number of units in the last place
- for the tolerance check. Default: ``1``.
- check_dtype : bool, default: True
- Whether to check agreement between actual and desired dtypes.
- check_shape : bool, default: True
- Whether to check agreement between actual and desired shapes.
- check_scalar : bool, default: False
- NumPy only: whether to check agreement between actual and desired types —
- 0-D :class:`numpy.ndarray` vs scalar (e.g. :class:`numpy.double`).
- xp : array_namespace, optional
- A standard-compatible namespace which `actual` and `desired` must match.
-
- Raises
- ------
- AssertionError
- If the spacing between `actual` and `desired` for one or more elements is \
- larger than `nulp`.
-
- ImportError
- If :mod:`numpy` is not importable in the Python environment.
-
- See Also
- --------
- assert_close : Similar function for inexact equality checks.
- numpy.spacing : Spacing calculation for NumPy arrays.
- numpy.testing.assert_array_almost_equal_nulp : Similar function for NumPy arrays.
-
- Notes
- -----
- This is a relatively robust method to compare two arrays whose amplitude is
- variable.
-
- An assertion is raised if the following condition is not met::
-
- abs(actual - desired) <= nulp * spacing(maximum(abs(actual), abs(desired)))
-
- where ``spacing(x)`` is the distance between ``x`` and the nearest adjacent number
- representable by in the data type of ``x``.
- """
- actual, desired, xp, np = _check_ns_shape_dtype(
- actual, desired, check_dtype, check_shape, check_scalar, xp
- )
- if not _is_materializable(actual):
- return
- actual_np = _as_numpy_array(actual, xp=xp)
- desired_np = _as_numpy_array(desired, xp=xp)
- np.testing.assert_array_almost_equal_nulp(actual_np, desired_np, nulp=nulp)
diff --git a/tests/__init__.py b/tests/__init__.py
deleted file mode 100644
index 3ccaf52b..00000000
--- a/tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Needed to import .conftest from the test modules."""
diff --git a/tests/conftest.py b/tests/conftest.py
deleted file mode 100644
index 5b88ab76..00000000
--- a/tests/conftest.py
+++ /dev/null
@@ -1,245 +0,0 @@
-"""Pytest fixtures."""
-
-from collections.abc import Callable, Generator
-from functools import partial, wraps
-from types import ModuleType
-from typing import ParamSpec, TypeVar, cast
-
-import numpy as np
-import pytest
-
-from array_api_extra._lib._backends import Backend
-from array_api_extra._lib._testing import xfail
-from array_api_extra._lib._utils._compat import array_namespace
-from array_api_extra._lib._utils._compat import device as get_device
-from array_api_extra._lib._utils._typing import Device
-from array_api_extra.testing import patch_lazy_xp_functions
-
-T = TypeVar("T")
-P = ParamSpec("P")
-
-np_compat = array_namespace(np.empty(0)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
-
-@pytest.fixture(params=[b.pytest_param() for b in Backend])
-def library(request: pytest.FixtureRequest) -> Backend: # numpydoc ignore=PR01,RT03
- """
- Parameterized fixture that iterates on all libraries.
-
- Returns
- -------
- The current Backend enum.
- """
- elem = cast(Backend, request.param)
-
- for marker_name, skip_or_xfail, allow_kwargs in (
- ("skip_xp_backend", pytest.skip, {"reason"}),
- ("xfail_xp_backend", partial(xfail, request), {"reason", "strict"}),
- ):
- for marker in request.node.iter_markers(marker_name):
- if len(marker.args) != 1:
- msg = f"Expected exactly one positional argument; got {marker.args}"
- raise TypeError(msg)
- if not isinstance(marker.args[0], Backend):
- msg = f"Argument of {marker_name} must be a Backend enum"
- raise TypeError(msg)
- if invalid_kwargs := set(marker.kwargs) - allow_kwargs:
- msg = f"Unexpected kwarg(s): {invalid_kwargs}"
- raise TypeError(msg)
-
- library: Backend = marker.args[0]
- reason: str | None = marker.kwargs.get("reason", None)
- strict: bool | None = marker.kwargs.get("strict", None)
-
- if library == elem:
- reason = f"{library}: {reason}" if reason else str(library)
- kwargs = {"strict": strict} if strict is not None else {}
- skip_or_xfail(reason=reason, **kwargs)
-
- return elem
-
-
-class NumPyReadOnly:
- """
- Variant of array_api_compat.numpy producing read-only arrays.
-
- Read-only NumPy arrays fail on `__iadd__` etc., whereas read-only libraries such as
- JAX and Sparse simply don't define those methods, which makes calls to `+=` fall
- back to `__add__`.
-
- Note that this is not a full read-only Array API library. Notably,
- `array_namespace(x)` returns array_api_compat.numpy. This is actually the desired
- behaviour, so that when a tested function internally calls `xp =
- array_namespace(*args) or xp`, it will internally create writeable arrays.
- For this reason, tests that explicitly pass xp=xp to the tested functions may
- misbehave and should be skipped for NUMPY_READONLY.
- """
-
- def __getattr__(self, name: str) -> object: # numpydoc ignore=PR01,RT01
- """Wrap all functions that return arrays to make their output read-only."""
- func = getattr(np_compat, name)
- if not callable(func) or isinstance(func, type):
- return func
- return self._wrap(func)
-
- @staticmethod
- def _wrap(func: Callable[P, T]) -> Callable[P, T]: # numpydoc ignore=PR01,RT01
- """Wrap func to make all np.ndarrays it returns read-only."""
-
- def as_readonly(o: T) -> T: # numpydoc ignore=PR01,RT01
- """Unset the writeable flag in o."""
- try:
- # Don't use is_numpy_array(o), as it includes np.generic
- if isinstance(o, np.ndarray):
- o.flags.writeable = False
- except TypeError:
- # Cannot interpret as a data type
- return o
-
- # This works with namedtuples too
- if isinstance(o, tuple | list):
- return type(o)(*(as_readonly(i) for i in o)) # type: ignore[arg-type,return-value] # pyright: ignore[reportArgumentType]
-
- return o
-
- @wraps(func)
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: # numpydoc ignore=GL08
- return as_readonly(func(*args, **kwargs))
-
- return wrapper
-
-
-@pytest.fixture
-def xp(
- library: Backend, request: pytest.FixtureRequest
-) -> Generator[ModuleType]: # numpydoc ignore=PR01,RT03
- """
- Parameterized fixture that iterates on all libraries.
-
- Returns
- -------
- The current array namespace.
- """
- if library == Backend.NUMPY_READONLY:
- yield NumPyReadOnly() # type: ignore[misc] # pyright: ignore[reportReturnType]
- return
-
- xp = pytest.importorskip(library.modname)
- # Possibly wrap module with array_api_compat
- xp = array_namespace(xp.empty(0))
-
- if library.like(Backend.ARRAY_API_STRICT):
- xp.set_array_api_strict_flags(api_version="2025.12")
-
- if library == Backend.ARRAY_API_STRICTEST:
- with xp.ArrayAPIStrictFlags(
- boolean_indexing=False,
- data_dependent_shapes=False,
- # writeable=False, # TODO implement in array-api-strict
- # lazy=True, # TODO implement in array-api-strict
- enabled_extensions=(),
- ):
- yield xp
- return
-
- if library.like(Backend.JAX):
- _setup_jax(library)
- elif library.like(Backend.TORCH):
- _setup_torch(library)
-
- # On Dask and JAX, monkey-patch all functions tagged by `lazy_xp_function`
- # in the global scope of the module containing the test function.
- with patch_lazy_xp_functions(request, xp=xp):
- yield xp
-
-
-def _setup_jax(library: Backend) -> None:
- import jax
-
- # suppress unused-ignore to run mypy in -e lint as well as -e dev
- jax.config.update("jax_enable_x64", True) # type: ignore[no-untyped-call,unused-ignore]
-
- if library == Backend.JAX_GPU:
- try:
- device = jax.devices("cuda")[0]
- except RuntimeError:
- pytest.skip("no CUDA device available")
- else:
- device = jax.devices("cpu")[0]
- jax.config.update("jax_default_device", device)
-
-
-def _setup_torch(library: Backend) -> None:
- import torch
-
- # This is already the default, but some tests or env variables may change it.
- # TODO test both float32 and float64, like in scipy.
- torch.set_default_dtype(torch.float32)
-
- if library == Backend.TORCH_GPU:
- import torch.cuda
-
- if not torch.cuda.is_available():
- pytest.skip("no CUDA device available")
- torch.set_default_device("cuda")
- else:
- assert library == Backend.TORCH
- torch.set_default_device("cpu")
-
-
-# Can select the test with `pytest -k dask`
-@pytest.fixture(params=[Backend.DASK.pytest_param()])
-def da(
- request: pytest.FixtureRequest,
-) -> Generator[ModuleType]: # numpydoc ignore=PR01,RT01
- """Variant of the `xp` fixture that only yields dask.array."""
- xp = pytest.importorskip("dask.array")
- xp = array_namespace(xp.empty(0))
- with patch_lazy_xp_functions(request, xp=xp):
- yield xp
-
-
-@pytest.fixture(params=[Backend.JAX.pytest_param(), Backend.JAX_GPU.pytest_param()])
-def jnp(
- request: pytest.FixtureRequest,
-) -> Generator[ModuleType]: # numpydoc ignore=PR01,RT01
- """Variant of the `xp` fixture that only yields jax.numpy."""
- xp = pytest.importorskip("jax.numpy")
- _setup_jax(request.param)
- with patch_lazy_xp_functions(request, xp=xp):
- yield xp
-
-
-@pytest.fixture(params=[Backend.TORCH, Backend.TORCH_GPU])
-def torch(request: pytest.FixtureRequest) -> ModuleType: # numpydoc ignore=PR01,RT01
- """Variant of the `xp` fixture that only yields torch."""
- xp = pytest.importorskip("torch")
- xp = array_namespace(xp.empty(0))
- _setup_torch(request.param)
- return xp
-
-
-@pytest.fixture
-def device(
- library: Backend, xp: ModuleType
-) -> Device: # numpydoc ignore=PR01,RT01,RT03
- """
- Return a valid device for the backend.
-
- Where possible, return a device that is not the default one.
- """
- if library == Backend.ARRAY_API_STRICT:
- return xp.Device("device1")
- if library == Backend.TORCH:
- return xp.device("meta")
- if library == Backend.TORCH_GPU:
- return xp.device("cpu")
- return get_device(xp.empty(0))
-
-
-@pytest.fixture
-def infinity(library: Backend) -> float:
- """Retrieve the positive infinity value for the given backend."""
- if library in (Backend.TORCH, Backend.TORCH_GPU):
- return 3.4028235e38
- return 1.7976931348623157e308
diff --git a/tests/meson.build b/tests/meson.build
deleted file mode 100644
index 246128f1..00000000
--- a/tests/meson.build
+++ /dev/null
@@ -1,14 +0,0 @@
-py.install_sources([
- '__init__.py',
- 'conftest.py',
- 'test_at.py',
- 'test_deprecation.py',
- 'test_funcs.py',
- 'test_helpers.py',
- 'test_lazy.py',
- 'test_testing.py',
- 'test_version.py',
- ],
- subdir: 'array_api_extra/tests',
- install_tag: 'tests',
-)
diff --git a/tests/test_at.py b/tests/test_at.py
deleted file mode 100644
index b98ab46b..00000000
--- a/tests/test_at.py
+++ /dev/null
@@ -1,338 +0,0 @@
-import math
-from collections.abc import Callable, Generator
-from contextlib import contextmanager
-from types import ModuleType
-from typing import cast
-
-import numpy as np
-import pytest
-
-from array_api_extra import at
-from array_api_extra._lib._at import _AtOp
-from array_api_extra._lib._backends import Backend
-from array_api_extra._lib._utils._compat import array_namespace, is_writeable_array
-from array_api_extra._lib._utils._compat import device as get_device
-from array_api_extra._lib._utils._typing import Array, Device, SetIndex
-from array_api_extra.testing import assert_equal, lazy_xp_function
-
-pytestmark = [
- pytest.mark.skip_xp_backend(
- Backend.SPARSE, reason="read-only backend without .at support"
- ),
- pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="boolean indexing"),
-]
-
-
-def at_op(
- x: Array,
- idx: SetIndex,
- op: _AtOp,
- y: Array | object,
- copy: bool | None = None,
- xp: ModuleType | None = None,
-) -> Array:
- """
- Wrapper around at(x, idx).op(y, copy=copy, xp=xp).
-
- This is a hack to allow wrapping `at()` with `lazy_xp_function`.
- For clarity, at() itself works inside jax.jit without hacks; this is
- just a workaround for when one wants to apply jax.jit to `at()` directly,
- which is not a common use case.
- """
- meth = cast(Callable[..., Array], getattr(at(x, idx), op.value))
- return meth(y, copy=copy, xp=xp)
-
-
-lazy_xp_function(at_op)
-
-
-@contextmanager
-def assert_copy(
- array: Array, copy: bool | None, expect_copy: bool | None = None
-) -> Generator[None, None, None]:
- if copy is False and not is_writeable_array(array):
- with pytest.raises((TypeError, ValueError)):
- yield
- return
-
- xp = array_namespace(array)
- array_orig = xp.asarray(array, copy=True)
- yield
-
- if expect_copy is None:
- expect_copy = copy
-
- if expect_copy:
- # Original has not been modified
- assert_equal(array, array_orig)
- elif expect_copy is False:
- # Original has been modified
- with pytest.raises(AssertionError):
- assert_equal(array, array_orig)
- # Test nothing for copy=None. Dask changes behaviour depending on
- # whether it's a special case of a bool mask with scalar RHS or not.
-
-
-@pytest.mark.parametrize("copy", [False, True, None])
-@pytest.mark.parametrize(
- ("op", "y", "expect_list"),
- [
- (_AtOp.SET, 40.0, [10.0, 40.0, 40.0]),
- (_AtOp.ADD, 40.0, [10.0, 60.0, 70.0]),
- (_AtOp.SUBTRACT, 100.0, [10.0, -80.0, -70.0]),
- (_AtOp.MULTIPLY, 2.0, [10.0, 40.0, 60.0]),
- (_AtOp.DIVIDE, 2.0, [10.0, 10.0, 15.0]),
- (_AtOp.POWER, 2.0, [10.0, 400.0, 900.0]),
- (_AtOp.MIN, 25.0, [10.0, 20.0, 25.0]),
- (_AtOp.MAX, 25.0, [10.0, 25.0, 30.0]),
- ],
-)
-@pytest.mark.parametrize(
- ("bool_mask", "x_ndim", "y_ndim"),
- [
- (False, 1, 0),
- (False, 1, 1),
- (True, 1, 0), # Uses xp.where(idx, y, x) on JAX and Dask
- pytest.param(
- *(True, 1, 1),
- marks=(
- pytest.mark.xfail_xp_backend(
- Backend.JAX,
- reason="bool mask update with shaped rhs",
- strict=False, # test passes when copy=False
- ),
- pytest.mark.xfail_xp_backend(
- Backend.JAX_GPU,
- reason="bool mask update with shaped rhs",
- strict=False, # test passes when copy=False
- ),
- pytest.mark.xfail_xp_backend(
- Backend.DASK, reason="bool mask update with shaped rhs"
- ),
- ),
- ),
- (False, 0, 0),
- (True, 0, 0),
- ],
-)
-def test_update_ops(
- xp: ModuleType,
- copy: bool | None,
- op: _AtOp,
- y: float,
- expect_list: list[float],
- bool_mask: bool,
- x_ndim: int,
- y_ndim: int,
-):
- if x_ndim == 1:
- x = xp.asarray([10.0, 20.0, 30.0])
- idx = xp.asarray([False, True, True]) if bool_mask else slice(1, None)
- expect: list[float] | float = expect_list
- else:
- idx = xp.asarray(True) if bool_mask else ()
- # Pick an element that does change with the operation
- if op is _AtOp.MIN:
- x = xp.asarray(30.0)
- expect = expect_list[2]
- else:
- x = xp.asarray(20.0)
- expect = expect_list[1]
-
- if y_ndim == 1:
- y = xp.asarray([y, y])
-
- with assert_copy(x, copy):
- z = at_op(x, idx, op, y, copy=copy)
- assert isinstance(z, type(x))
- assert_equal(z, xp.asarray(expect))
-
-
-@pytest.mark.parametrize("op", list(_AtOp))
-def test_copy_default(xp: ModuleType, library: Backend, op: _AtOp):
- """
- Test that the default copy behaviour is False for writeable arrays
- and True for read-only ones.
- """
- x = xp.asarray([1.0, 10.0, 20.0])
- expect_copy = not is_writeable_array(x)
- meth = cast(Callable[..., Array], getattr(at(x)[:2], op.value))
- with assert_copy(x, None, expect_copy):
- _ = meth(2.0)
-
- x = xp.asarray([1.0, 10.0, 20.0])
- # Dask's default copy value is True for bool masks,
- # even if the arrays are writeable.
- expect_copy = not is_writeable_array(x) or library is Backend.DASK
- idx = xp.asarray([True, True, False])
- meth = cast(Callable[..., Array], getattr(at(x, idx), op.value))
- with assert_copy(x, None, expect_copy):
- _ = meth(2.0)
-
-
-def test_copy_invalid():
- a = np.asarray([1, 2, 3])
- with pytest.raises(ValueError, match="copy"):
- _ = at(a, 0).set(4, copy="invalid") # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
-
-def test_xp():
- a = cast(Array, np.asarray([1, 2, 3])) # pyright: ignore[reportInvalidCast]
- _ = at(a, 0).set(4, xp=np)
- _ = at(a, 0).add(4, xp=np)
- _ = at(a, 0).subtract(4, xp=np)
- _ = at(a, 0).multiply(4, xp=np)
- _ = at(a, 0).divide(4, xp=np)
- _ = at(a, 0).power(4, xp=np)
- _ = at(a, 0).min(4, xp=np)
- _ = at(a, 0).max(4, xp=np)
-
-
-def test_alternate_index_syntax():
- xp = cast(ModuleType, np) # type: ignore[redundant-cast] # pyright: ignore[reportInvalidCast]
- a = cast(Array, xp.asarray([1, 2, 3]))
- assert_equal(at(a, 0).set(4, copy=True), xp.asarray([4, 2, 3]))
- assert_equal(at(a)[0].set(4, copy=True), xp.asarray([4, 2, 3]))
-
- a_at = at(a)
- assert_equal(a_at[0].add(1, copy=True), xp.asarray([2, 2, 3]))
- assert_equal(a_at[1].add(2, copy=True), xp.asarray([1, 4, 3]))
-
- with pytest.raises(ValueError, match="Index"):
- _ = at(a).set(4)
- with pytest.raises(ValueError, match="Index"):
- _ = at(a, 0)[0].set(4)
-
-
-@pytest.mark.parametrize("copy", [True, None])
-@pytest.mark.parametrize("bool_mask", [False, True])
-@pytest.mark.parametrize("op", list(_AtOp))
-def test_incompatible_dtype(
- xp: ModuleType,
- library: Backend,
- op: _AtOp,
- copy: bool | None,
- bool_mask: bool,
-):
- """Test that at() replicates the backend's behaviour for
- in-place operations with incompatible dtypes.
-
- Behavior is backend-specific, but only two behaviors are allowed:
- 1. raise an exception, or
- 2. return the same dtype as x, disregarding y.dtype (no broadcasting).
-
- Note that __i__ and ____ behave differently, and we want to
- replicate the behavior of __i__:
-
- >>> a = np.asarray([1, 2, 3])
- >>> a / 1.5
- array([0. , 0.66666667, 1.33333333])
- >>> a /= 1.5
- UFuncTypeError: Cannot cast ufunc 'divide' output from dtype('float64')
- to dtype('int64') with casting rule 'same_kind'
- """
- x = xp.asarray([2, 4])
- idx = xp.asarray([True, False]) if bool_mask else slice(None)
- z = None
-
- if library.like(Backend.JAX):
- if bool_mask:
- z = at_op(x, idx, op, 1.1, copy=copy)
- else:
- with pytest.warns(FutureWarning, match="cannot safely cast"):
- z = at_op(x, idx, op, 1.1, copy=copy)
-
- elif library.like(Backend.DASK):
- z = at_op(x, idx, op, 1.1, copy=copy)
-
- elif library.like(Backend.ARRAY_API_STRICT):
- with pytest.raises(Exception, match=r"cast|promote|dtype"):
- _ = at_op(x, idx, op, 1.1, copy=copy)
-
- elif op in (_AtOp.SET, _AtOp.MIN, _AtOp.MAX):
- # There is no __i__ version of min/max.
- # libraries other than array-api-strict are happy with
- # int[:] = float
- # int[:] = min(int[:], float)
- # int[:] = max(int[:], float)
- z = at_op(x, idx, op, 1.1, copy=copy)
-
- else:
- with pytest.raises(Exception, match=r"cast|promote|dtype"):
- _ = at_op(x, idx, op, 1.1, copy=copy)
-
- assert z is None or z.dtype == x.dtype
-
-
-def test_bool_mask_nd(xp: ModuleType):
- x = xp.asarray([[1, 2, 3], [4, 5, 6]])
- idx = xp.asarray([[True, False, False], [False, True, True]])
- z = at_op(x, idx, _AtOp.SET, 0)
- assert_equal(z, xp.asarray([[0, 2, 3], [4, 0, 0]]))
-
-
-@pytest.mark.parametrize("bool_mask", [False, True])
-def test_no_inf_warnings(xp: ModuleType, bool_mask: bool):
- x = xp.asarray([math.inf, 1.0, 2.0])
- idx = ~xp.isinf(x) if bool_mask else slice(1, None)
- # inf - inf -> nan with a warning
- z = at_op(x, idx, _AtOp.SUBTRACT, math.inf)
- assert_equal(z, xp.asarray([math.inf, -math.inf, -math.inf]))
-
-
-@pytest.mark.parametrize(
- "copy",
- [
- None,
- pytest.param(
- False,
- marks=[
- pytest.mark.skip_xp_backend(
- Backend.NUMPY, reason="np.generic is read-only"
- ),
- pytest.mark.skip_xp_backend(
- Backend.NUMPY_READONLY, reason="read-only backend"
- ),
- pytest.mark.skip_xp_backend(Backend.JAX, reason="read-only backend"),
- pytest.mark.skip_xp_backend(
- Backend.JAX_GPU, reason="read-only backend"
- ),
- pytest.mark.skip_xp_backend(Backend.SPARSE, reason="read-only backend"),
- ],
- ),
- ],
-)
-@pytest.mark.parametrize("bool_mask", [False, True])
-def test_gh134(xp: ModuleType, bool_mask: bool, copy: bool | None):
- """
- Test that xpx.at doesn't encroach in a bug of dask.array.Array.__setitem__, which
- blindly assumes that chunk contents are writeable np.ndarray objects:
-
- https://github.com/dask/dask/issues/11722
-
- In other words: when special-casing bool masks for Dask, unless the user explicitly
- asks for copy=False, do not needlessly write back to the input.
- """
- x = xp.zeros(1)
-
- # In NumPy, we have a writeable np.ndarray in input and a read-only np.generic in
- # output. As both are Arrays, this behaviour is Array API compliant.
- # In Dask, we have a writeable da.Array on both sides, and if you call __setitem__
- # on it all seems fine, but when you compute() your graph is corrupted.
- y = x[0]
-
- idx = xp.asarray(True) if bool_mask else ()
- z = at_op(y, idx, _AtOp.SET, 1, copy=copy)
- assert_equal(z, xp.asarray(1, dtype=x.dtype))
-
-
-def test_device(xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3], device=device)
-
- y = xp.asarray([4, 5], device=device)
- z = at(x)[:2].set(y)
- assert get_device(z) == get_device(x)
-
- idx = xp.asarray([True, False, True], device=device)
- z = at(x)[idx].set(4)
- assert get_device(z) == get_device(x)
diff --git a/tests/test_deprecation.py b/tests/test_deprecation.py
deleted file mode 100644
index 535e11dd..00000000
--- a/tests/test_deprecation.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from types import ModuleType
-
-import pytest
-
-from array_api_extra import broadcast_shapes, expand_dims
-
-
-class TestDeprecatedFunctions:
- def test_broadcast_shapes(self, xp: ModuleType):
- with pytest.raises(DeprecationWarning, match=r"removed in v1.0.0"):
- _ = broadcast_shapes((2, 3), (2, 1), xp=xp)
-
- def test_expand_dims(self, xp: ModuleType):
- with pytest.raises(DeprecationWarning, match=r"removed in v1.0.0"):
- _ = expand_dims(xp.ones(2), axis=0, xp=xp)
diff --git a/tests/test_funcs.py b/tests/test_funcs.py
deleted file mode 100644
index 2b9b01d9..00000000
--- a/tests/test_funcs.py
+++ /dev/null
@@ -1,1985 +0,0 @@
-import math
-import warnings
-from collections.abc import Callable
-from types import ModuleType
-from typing import Any, Literal, cast
-
-import hypothesis
-import hypothesis.extra.numpy as npst
-import numpy as np
-import pytest
-from hypothesis import given
-from hypothesis import strategies as st
-from typing_extensions import override
-
-from array_api_extra import (
- angle,
- apply_where,
- argpartition,
- at,
- atleast_nd,
- broadcast_shapes,
- cov,
- create_diagonal,
- default_dtype,
- expand_dims,
- isclose,
- isin,
- kron,
- nan_to_num,
- nunique,
- one_hot,
- pad,
- partition,
- setdiff1d,
- sinc,
- union1d,
-)
-from array_api_extra import (
- searchsorted as xpx_searchsorted,
-)
-from array_api_extra._lib._backends import NUMPY_VERSION, Backend
-from array_api_extra._lib._funcs import searchsorted as _funcs_searchsorted
-from array_api_extra._lib._utils._compat import (
- array_namespace,
- is_torch_namespace,
-)
-from array_api_extra._lib._utils._compat import device as get_device
-from array_api_extra._lib._utils._helpers import eager_shape, ndindex
-from array_api_extra._lib._utils._typing import Array, Device
-from array_api_extra.testing import assert_close, assert_equal, lazy_xp_function
-
-lazy_xp_function(apply_where)
-lazy_xp_function(argpartition)
-lazy_xp_function(atleast_nd)
-lazy_xp_function(broadcast_shapes)
-lazy_xp_function(cov)
-lazy_xp_function(create_diagonal)
-lazy_xp_function(default_dtype)
-lazy_xp_function(expand_dims)
-lazy_xp_function(isclose)
-lazy_xp_function(isin)
-lazy_xp_function(kron)
-lazy_xp_function(nan_to_num)
-lazy_xp_function(nunique)
-lazy_xp_function(one_hot)
-lazy_xp_function(pad)
-lazy_xp_function(partition)
-# FIXME calls in1d which calls xp.unique_values without size
-lazy_xp_function(setdiff1d, jax_jit=False)
-lazy_xp_function(sinc)
-lazy_xp_function(union1d, jax_jit=False)
-lazy_xp_function(xpx_searchsorted)
-lazy_xp_function(_funcs_searchsorted)
-
-
-class TestApplyWhere:
- @staticmethod
- def f1(x: Array, y: Array | int = 10) -> Array:
- return x + y
-
- @staticmethod
- def f2(x: Array, y: Array | int = 10) -> Array:
- return x - y
-
- def test_f1_f2(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3, 4])
- cond = x % 2 == 0
- actual = apply_where(cond, x, self.f1, self.f2)
- expect = xp.where(cond, self.f1(x), self.f2(x))
- assert_equal(actual, expect)
-
- def test_fill_value(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3, 4])
- cond = x % 2 == 0
- actual = apply_where(x % 2 == 0, x, self.f1, fill_value=0)
- expect = xp.where(cond, self.f1(x), xp.asarray(0))
- assert_equal(actual, expect)
-
- actual = apply_where(x % 2 == 0, x, self.f1, fill_value=xp.asarray(0))
- assert_equal(actual, expect)
-
- def test_args_tuple(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3, 4])
- y = xp.asarray([10, 20, 30, 40])
- cond = x % 2 == 0
- actual = apply_where(cond, (x, y), self.f1, self.f2)
- expect = xp.where(cond, self.f1(x, y), self.f2(x, y))
- assert_equal(actual, expect)
-
- def test_broadcast(self, xp: ModuleType):
- x = xp.asarray([1, 2])
- y = xp.asarray([[10], [20], [30]])
- cond = xp.broadcast_to(xp.asarray(True), (4, 1, 1))
-
- actual = apply_where(cond, (x, y), self.f1, self.f2)
- expect = xp.where(cond, self.f1(x, y), self.f2(x, y))
- assert_equal(actual, expect)
-
- actual = apply_where(
- cond,
- (x, y),
- lambda x, _: x,
- lambda _, y: y,
- )
- expect = xp.where(cond, x, y)
- assert_equal(actual, expect)
-
- # Shaped fill_value
- actual = apply_where(cond, x, self.f1, fill_value=y)
- expect = xp.where(cond, self.f1(x), y)
- assert_equal(actual, expect)
-
- def test_dtype_propagation(self, xp: ModuleType, library: Backend):
- x = xp.asarray([1, 2], dtype=xp.int8)
- y = xp.asarray([3, 4], dtype=xp.int16)
- cond = x % 2 == 0
-
- mxp = np if library is Backend.DASK else xp
- actual = apply_where(
- cond,
- (x, y),
- self.f1,
- lambda x, y: mxp.astype(x - y, xp.int64), # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
- )
- assert actual.dtype == xp.int64
-
- actual = apply_where(cond, y, self.f1, fill_value=5)
- assert actual.dtype == xp.int16
-
- @pytest.mark.parametrize("fill_value_raw", [3, [3, 4]])
- @pytest.mark.parametrize(
- ("fill_value_dtype", "expect_dtype"), [("int32", "int32"), ("int8", "int16")]
- )
- def test_dtype_propagation_fill_value(
- self,
- xp: ModuleType,
- fill_value_raw: int | list[int],
- fill_value_dtype: str,
- expect_dtype: str,
- ):
- x = xp.asarray([1, 2], dtype=xp.int16)
- cond = x % 2 == 0
- fill_value = xp.asarray(fill_value_raw, dtype=getattr(xp, fill_value_dtype))
-
- actual = apply_where(cond, x, self.f1, fill_value=fill_value)
- assert actual.dtype == getattr(xp, expect_dtype)
-
- def test_dont_overwrite_fill_value(self, xp: ModuleType):
- x = xp.asarray([1, 2])
- fill_value = xp.asarray([100, 200])
- actual = apply_where(x % 2 == 0, x, self.f1, fill_value=fill_value)
- assert_equal(actual, xp.asarray([100, 12]))
- assert_equal(fill_value, xp.asarray([100, 200]))
-
- @pytest.mark.skip_xp_backend(
- Backend.ARRAY_API_STRICTEST,
- reason="no boolean indexing -> run everywhere",
- )
- @pytest.mark.skip_xp_backend(
- Backend.SPARSE,
- reason="no indexing by sparse array -> run everywhere",
- )
- def test_dont_run_on_false(self, xp: ModuleType):
- x = xp.asarray([1.0, 2.0, 0.0])
- y = xp.asarray([0.0, 3.0, 4.0])
- # On NumPy, division by zero will trigger warnings
- actual = apply_where(
- x == 0,
- (x, y),
- lambda x, y: x / y,
- lambda x, y: y / x,
- )
- assert_equal(actual, xp.asarray([0.0, 1.5, 0.0]))
-
- def test_bad_args(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3, 4])
- cond = x % 2 == 0
- # Neither f2 nor fill_value
- with pytest.raises(TypeError, match="Exactly one of"):
- apply_where(cond, x, self.f1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
- # Both f2 and fill_value
- with pytest.raises(TypeError, match="Exactly one of"):
- apply_where(cond, x, self.f1, self.f2, fill_value=0) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_xp(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3, 4])
- cond = x % 2 == 0
- actual = apply_where(cond, x, self.f1, self.f2, xp=xp)
- expect = xp.where(cond, self.f1(x), self.f2(x))
- assert_equal(actual, expect)
-
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3, 4], device=device)
- y = apply_where(x % 2 == 0, x, self.f1, self.f2)
- assert get_device(y) == device
- y = apply_where(x % 2 == 0, x, self.f1, fill_value=0)
- assert get_device(y) == device
- y = apply_where(x % 2 == 0, x, self.f1, fill_value=x)
- assert get_device(y) == device
-
- @pytest.mark.filterwarnings("ignore::RuntimeWarning") # overflows, etc.
- @hypothesis.settings(
- # The xp and library fixtures are not regenerated between hypothesis iterations
- suppress_health_check=[hypothesis.HealthCheck.function_scoped_fixture],
- # JAX can take a long time to initialize on the first call
- deadline=None,
- )
- @given(
- n_arrays=st.integers(min_value=0, max_value=3),
- n_kwarrays=st.integers(min_value=0, max_value=3),
- rng_seed=st.integers(min_value=1000000000, max_value=9999999999),
- dtype=npst.floating_dtypes(sizes=(32, 64)),
- p=st.floats(min_value=0, max_value=1),
- data=st.data(),
- )
- def test_hypothesis(
- self,
- n_arrays: int,
- n_kwarrays: int,
- rng_seed: int,
- dtype: np.dtype[Any],
- p: float,
- data: st.DataObject,
- xp: ModuleType,
- library: Backend,
- ):
- if (
- library.like(Backend.NUMPY)
- and NUMPY_VERSION < (2, 0)
- and dtype.type is np.float32
- ):
- pytest.xfail(reason="NumPy 1.x dtype promotion for scalars")
-
- _ = hypothesis.assume(n_arrays + n_kwarrays > 0)
- mbs = npst.mutually_broadcastable_shapes(
- num_shapes=1 + n_arrays + n_kwarrays, min_side=0
- )
- input_shapes, _ = data.draw(mbs)
- cond_shape = input_shapes[0]
- shapes = input_shapes[1 : 1 + n_arrays]
- kwshapes = input_shapes[1 + n_arrays :]
-
- # cupy/cupy#8382
- # https://github.com/jax-ml/jax/issues/26658
- elements = {"allow_subnormal": not library.like(Backend.CUPY, Backend.JAX)}
-
- fill_value = xp.asarray(
- data.draw(npst.arrays(dtype=dtype.type, shape=(), elements=elements))
- )
- float_fill_value = float(fill_value)
- if library is Backend.CUPY and dtype.type is np.float32:
- # Avoid data-dependent dtype promotion when encountering subnormals
- # close to the max float32 value
- float_fill_value = float(np.clip(float_fill_value, -1e38, 1e38))
-
- arrays = tuple(
- xp.asarray(
- data.draw(npst.arrays(dtype=dtype.type, shape=shape, elements=elements))
- )
- for shape in shapes
- )
-
- kwargs = {
- f"kw{n}": xp.asarray(
- data.draw(npst.arrays(dtype=dtype.type, shape=shape, elements=elements))
- )
- for n, shape in enumerate(kwshapes)
- }
- kwkeys = kwargs.keys()
-
- def f1(*args: Array, **kwargs: dict[str, Array]) -> Array:
- assert kwargs.keys() == kwkeys
- args_kwargs = cast(tuple[Array, ...], (*args, *kwargs.values()))
- return cast(Array, sum(args_kwargs))
-
- def f2(*args: Array, **kwargs: dict[str, Array]) -> Array:
- assert kwargs.keys() == kwkeys
- args_kwargs = cast(tuple[Array, ...], (*args, *kwargs.values()))
- return cast(Array, sum(args_kwargs) / 2)
-
- rng = np.random.default_rng(rng_seed)
- cond = xp.asarray(rng.random(size=cond_shape) > p)
-
- res1 = apply_where(cond, arrays, f1, fill_value=fill_value, kwargs=kwargs)
- res2 = apply_where(cond, arrays, f1, f2, kwargs=kwargs)
- res3 = apply_where(cond, arrays, f1, fill_value=float_fill_value, kwargs=kwargs)
-
- ref1 = xp.where(cond, f1(*arrays, **kwargs), fill_value)
- ref2 = xp.where(cond, f1(*arrays, **kwargs), f2(*arrays, **kwargs))
- ref3 = xp.where(cond, f1(*arrays, **kwargs), float_fill_value)
-
- assert_close(res1, ref1, rtol=2e-16)
- assert_equal(res2, ref2)
- assert_equal(res3, ref3)
-
-
-class TestAtLeastND:
- def test_0D(self, xp: ModuleType):
- x = xp.asarray(1.0)
-
- y = atleast_nd(x, ndim=0)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=1)
- assert_equal(y, xp.ones((1,)))
-
- y = atleast_nd(x, ndim=5)
- assert_equal(y, xp.ones((1, 1, 1, 1, 1)))
-
- @pytest.mark.parametrize(
- ("input_shape", "ndim", "expected_shape"),
- [
- ((1,), 0, (1,)),
- ((5,), 1, (5,)),
- ((2,), 2, (1, 2)),
- ((3,), 3, (1, 1, 3)),
- ((2,), 5, (1, 1, 1, 1, 2)),
- ],
- )
- def test_1D_shapes(
- self,
- input_shape: tuple[int],
- ndim: int,
- expected_shape: tuple[int],
- xp: ModuleType,
- ):
- n = math.prod(input_shape)
- x = xp.asarray(np.arange(n).reshape(input_shape))
- y = atleast_nd(x, ndim=ndim)
-
- assert y.shape == expected_shape
- assert xp.sum(y) == int(n * (n - 1) / 2)
-
- def test_1D_values(self, xp: ModuleType):
- x = xp.asarray([0, 1])
-
- y = atleast_nd(x, ndim=0)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=1)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=2)
- assert_equal(y, xp.asarray([[0, 1]]))
-
- y = atleast_nd(x, ndim=5)
- assert_equal(y, xp.asarray([[[[[0, 1]]]]]))
-
- @pytest.mark.parametrize(
- ("input_shape", "ndim", "expected_shape"),
- [
- ((2, 1), 0, (2, 1)),
- ((5, 2), 1, (5, 2)),
- ((2, 1), 2, (2, 1)),
- ((3, 1), 3, (1, 3, 1)),
- ((2, 8), 5, (1, 1, 1, 2, 8)),
- ],
- )
- def test_2D_shapes(
- self,
- input_shape: tuple[int],
- ndim: int,
- expected_shape: tuple[int],
- xp: ModuleType,
- ):
- n = math.prod(input_shape)
- x = xp.asarray(np.arange(n).reshape(input_shape))
- y = atleast_nd(x, ndim=ndim)
-
- assert y.shape == expected_shape
- assert xp.sum(y) == int(n * (n - 1) / 2)
-
- def test_2D_values(self, xp: ModuleType):
- x = xp.asarray([[3.0], [4.0]])
-
- y = atleast_nd(x, ndim=0)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=2)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=3)
- assert_equal(y, xp.asarray([[[3.0], [4.0]]]))
-
- y = atleast_nd(x, ndim=5)
- assert_equal(y, xp.asarray([[[[[3.0], [4.0]]]]]))
-
- @pytest.mark.parametrize(
- ("input_shape", "ndim", "expected_shape"),
- [
- ((2, 1, 1), 0, (2, 1, 1)),
- ((1, 5, 2), 1, (1, 5, 2)),
- ((2, 1, 1), 2, (2, 1, 1)),
- ((1, 3, 1), 3, (1, 3, 1)),
- ((2, 8, 1), 5, (1, 1, 2, 8, 1)),
- ],
- )
- def test_3D_shapes(
- self,
- input_shape: tuple[int],
- ndim: int,
- expected_shape: tuple[int],
- xp: ModuleType,
- ):
- n = math.prod(input_shape)
- x = xp.asarray(np.arange(n).reshape(input_shape))
- y = atleast_nd(x, ndim=ndim)
-
- assert y.shape == expected_shape
- assert xp.sum(y) == int(n * (n - 1) / 2)
-
- def test_3D_values(self, xp: ModuleType):
- x = xp.asarray([[[3.0], [2.0]]])
-
- y = atleast_nd(x, ndim=0)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=2)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=3)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=5)
- assert_equal(y, xp.asarray([[[[[3.0], [2.0]]]]]))
-
- @pytest.mark.parametrize(
- ("input_shape", "ndim", "expected_shape"),
- [
- ((2, 1, 1, 2, 1), 0, (2, 1, 1, 2, 1)),
- ((1, 5, 2, 3, 2), 2, (1, 5, 2, 3, 2)),
- ((2, 1, 1, 5, 2), 5, (2, 1, 1, 5, 2)),
- ((1, 3, 1, 2, 1), 6, (1, 1, 3, 1, 2, 1)),
- ((2, 8, 1, 9, 8), 9, (1, 1, 1, 1, 2, 8, 1, 9, 8)),
- ],
- )
- def test_5D_shapes(
- self,
- input_shape: tuple[int],
- ndim: int,
- expected_shape: tuple[int],
- xp: ModuleType,
- ):
- n = math.prod(input_shape)
- x = xp.asarray(np.arange(n).reshape(input_shape))
- y = atleast_nd(x, ndim=ndim)
-
- assert y.shape == expected_shape
- assert xp.sum(y) == int(n * (n - 1) / 2)
-
- def test_5D_values(self, xp: ModuleType):
- x = xp.asarray([[[[[3.0]], [[2.0]]]]])
-
- y = atleast_nd(x, ndim=0)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=4)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=5)
- assert_equal(y, x)
-
- y = atleast_nd(x, ndim=6)
- assert_equal(y, xp.asarray([[[[[[3.0]], [[2.0]]]]]]))
-
- y = atleast_nd(x, ndim=9)
- assert_equal(y, xp.asarray([[[[[[[[[3.0]], [[2.0]]]]]]]]]))
-
-
-@pytest.mark.filterwarnings("ignore:.*removed in v1.0.0.*:DeprecationWarning")
-class TestBroadcastShapes:
- def test_delegates_known_integer_shapes(self, monkeypatch: pytest.MonkeyPatch):
- calls = []
-
- def mock_broadcast_shapes(*shapes: tuple[int, ...]) -> tuple[int, ...]:
- calls.append(shapes)
- return (99,)
-
- monkeypatch.setattr(np, "broadcast_shapes", mock_broadcast_shapes)
-
- assert broadcast_shapes((2,), (1,), xp=np) == (99,)
- assert calls == [((2,), (1,))]
-
- def test_fallback_without_xp(self, monkeypatch: pytest.MonkeyPatch):
- def mock_broadcast_shapes(*_shapes: tuple[int, ...]) -> tuple[int, ...]:
- msg = "Native delegation should not be used without xp"
- raise AssertionError(msg)
-
- monkeypatch.setattr(np, "broadcast_shapes", mock_broadcast_shapes)
-
- assert broadcast_shapes((2,), (1,)) == (2,)
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_xp(self, xp: ModuleType):
- assert broadcast_shapes((2, 3), (2, 1), xp=xp) == (2, 3)
-
- @pytest.mark.parametrize(
- "args",
- [
- (),
- ((),),
- ((), ()),
- ((1,),),
- ((1,), (1,)),
- ((2,), (1,)),
- ((3, 1, 4), (2, 1)),
- ((1, 1, 4), (2, 1)),
- ((1,), ()),
- ((), (2,), ()),
- ((0,),),
- ((0,), (1,)),
- ((2, 0), (1, 1)),
- ((2, 0, 3), (2, 1, 1)),
- ],
- )
- def test_simple(self, args: tuple[tuple[int, ...], ...]):
- expect = np.broadcast_shapes(*args)
- actual = broadcast_shapes(*args)
- assert actual == expect
-
- @pytest.mark.parametrize(
- "args",
- [
- ((2,), (3,)),
- ((2, 3), (1, 2)),
- ((2,), (0,)),
- ((2, 0, 2), (1, 3, 1)),
- ],
- )
- def test_fail(self, args: tuple[tuple[int, ...], ...]):
- match = "cannot be broadcast to a single shape"
- with pytest.raises(ValueError, match=match):
- _ = np.broadcast_shapes(*args)
- with pytest.raises(ValueError, match=match):
- _ = broadcast_shapes(*args)
-
- @pytest.mark.parametrize(
- "args",
- [
- ((None,), (None,)),
- ((math.nan,), (None,)),
- ((1, None, 2, 4), (2, 3, None, 1), (2, None, None, 4)),
- ((1, math.nan, 2), (4, 2, 3, math.nan), (4, 2, None, None)),
- ((math.nan, 1), (None, 2), (None, 2)),
- ],
- )
- def test_none(self, args: tuple[tuple[float | None, ...], ...]):
- expect = args[-1]
- actual = broadcast_shapes(*args[:-1])
- assert actual == expect
-
-
-class TestCov:
- def test_basic(self, xp: ModuleType):
- assert_close(
- cov(xp.asarray([[0, 2], [1, 1], [2, 0]], dtype=xp.float64).T),
- xp.asarray([[1.0, -1.0], [-1.0, 1.0]], dtype=xp.float64),
- )
-
- def test_complex(self, xp: ModuleType):
- actual = cov(xp.asarray([[1, 2, 3], [1j, 2j, 3j]], dtype=xp.complex128))
- expect = xp.asarray([[1.0, -1.0j], [1.0j, 1.0]], dtype=xp.complex128)
- assert_close(actual, expect)
-
- def test_empty(self, xp: ModuleType):
- with warnings.catch_warnings(record=True):
- warnings.simplefilter("always", RuntimeWarning)
- warnings.simplefilter("always", UserWarning)
- assert_equal(
- cov(xp.asarray([], dtype=xp.float64)),
- xp.asarray(xp.nan, dtype=xp.float64),
- )
- assert_equal(
- cov(xp.reshape(xp.asarray([], dtype=xp.float64), (0, 2))),
- xp.reshape(xp.asarray([], dtype=xp.float64), (0, 0)),
- )
- assert_equal(
- cov(xp.reshape(xp.asarray([], dtype=xp.float64), (2, 0))),
- xp.asarray([[xp.nan, xp.nan], [xp.nan, xp.nan]], dtype=xp.float64),
- )
-
- def test_combination(self, xp: ModuleType):
- x = xp.asarray([-2.1, -1, 4.3], dtype=xp.float64)
- y = xp.asarray([3, 1.1, 0.12], dtype=xp.float64)
- X = xp.stack((x, y), axis=0)
- desired = xp.asarray([[11.71, -4.286], [-4.286, 2.144133]], dtype=xp.float64)
- assert_close(cov(X), desired, rtol=1e-6)
- assert_close(cov(x), xp.asarray(11.71, dtype=xp.float64))
- assert_close(cov(y), xp.asarray(2.144133, dtype=xp.float64), rtol=1e-6)
-
- @pytest.mark.xfail_xp_backend(Backend.TORCH, reason="array-api-extra#455")
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3], device=device)
- assert get_device(cov(x)) == device
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_xp(self, xp: ModuleType):
- assert_close(
- cov(
- xp.asarray([[0.0, 2.0], [1.0, 1.0], [2.0, 0.0]], dtype=xp.float64).T,
- xp=xp,
- ),
- xp.asarray([[1.0, -1.0], [-1.0, 1.0]], dtype=xp.float64),
- )
-
- def test_batch(self, xp: ModuleType):
- rng = np.random.default_rng(8847643423)
- batch_shape = (3, 4)
- n_var, n_obs = 3, 20
- m = rng.random((*batch_shape, n_var, n_obs))
- res = cov(xp.asarray(m))
- ref_list = [np.cov(m_) for m_ in np.reshape(m, (-1, n_var, n_obs))]
- ref = np.reshape(np.stack(ref_list), (*batch_shape, n_var, n_var))
- assert_close(res, xp.asarray(ref))
-
-
-@pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="no arange", strict=False)
-class TestOneHot:
- @pytest.mark.parametrize("n_dim", range(4))
- @pytest.mark.parametrize("num_classes", [1, 3, 10])
- def test_dims_and_classes(self, xp: ModuleType, n_dim: int, num_classes: int):
- shape = tuple(range(2, 2 + n_dim))
- rng = np.random.default_rng(2347823)
- np_x = rng.integers(num_classes, size=shape)
- x = xp.asarray(np_x)
- y = one_hot(x, num_classes)
- assert y.shape == (*x.shape, num_classes)
- for *i_list, j in ndindex(*shape, num_classes):
- i = tuple(i_list)
- assert float(y[(*i, j)]) == (int(x[i]) == j)
-
- def test_basic(self, xp: ModuleType):
- actual = one_hot(xp.asarray([0, 1, 2]), 3)
- expected = xp.asarray([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]])
- assert_equal(actual, expected)
-
- actual = one_hot(xp.asarray([1, 2, 0]), 3)
- expected = xp.asarray([[0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]])
- assert_equal(actual, expected)
-
- def test_2d(self, xp: ModuleType):
- actual = one_hot(xp.asarray([[2, 1, 0], [1, 0, 2]]), 3, axis=1)
- expected = xp.asarray(
- [
- [[0.0, 0.0, 1.0], [0.0, 1.0, 0.0], [1.0, 0.0, 0.0]],
- [[0.0, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]],
- ]
- )
- assert_equal(actual, expected)
-
- @pytest.mark.skip_xp_backend(
- Backend.ARRAY_API_STRICTEST, reason="backend doesn't support Boolean indexing"
- )
- def test_abstract_size(self, xp: ModuleType):
- x = xp.arange(5)
- x = x[x > 2]
- actual = one_hot(x, 5)
- expected = xp.asarray([[0.0, 0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0]])
- assert_equal(actual, expected)
-
- @pytest.mark.skip_xp_backend(
- Backend.TORCH_GPU, reason="Puts Pytorch into a bad state."
- )
- def test_out_of_bound(self, xp: ModuleType):
- # Undefined behavior. Either return zero, or raise.
- try:
- actual = one_hot(xp.asarray([-1, 3]), 3)
- except IndexError:
- return
- expected = xp.asarray([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])
- assert_equal(actual, expected)
-
- @pytest.mark.parametrize(
- "int_dtype",
- ["int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64"],
- )
- def test_int_types(self, xp: ModuleType, int_dtype: str):
- dtype = getattr(xp, int_dtype)
- x = xp.asarray([0, 1, 2], dtype=dtype)
- actual = one_hot(x, 3)
- expected = xp.asarray([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]])
- assert_equal(actual, expected)
-
- def test_custom_dtype(self, xp: ModuleType):
- actual = one_hot(xp.asarray([0, 1, 2], dtype=xp.int32), 3, dtype=xp.bool)
- expected = xp.asarray(
- [[True, False, False], [False, True, False], [False, False, True]]
- )
- assert_equal(actual, expected)
-
- def test_axis(self, xp: ModuleType):
- expected = xp.asarray([[0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]]).T
- actual = one_hot(xp.asarray([1, 2, 0]), 3, axis=0)
- assert_equal(actual, expected)
-
- actual = one_hot(xp.asarray([1, 2, 0]), 3, axis=-2)
- assert_equal(actual, expected)
-
- def test_non_integer(self, xp: ModuleType):
- with pytest.raises(TypeError):
- _ = one_hot(xp.asarray([1.0]), 3)
-
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([0, 1, 2], device=device)
- y = one_hot(x, 3)
- assert get_device(y) == device
-
-
-@pytest.mark.skip_xp_backend(
- Backend.SPARSE, reason="read-only backend without .at support"
-)
-class TestCreateDiagonal:
- def test_1d_from_numpy(self, xp: ModuleType):
- # from np.diag tests
- vals = 100 * xp.arange(5, dtype=xp.float64)
- b = xp.zeros((5, 5), dtype=xp.float64)
- for k in range(5):
- b = at(b)[k, k].set(vals[k])
- assert_equal(create_diagonal(vals), b)
- b = xp.zeros((7, 7), dtype=xp.float64)
- c = xp.asarray(b, copy=True)
- for k in range(5):
- b = at(b)[k, k + 2].set(vals[k])
- c = at(c)[k + 2, k].set(vals[k])
- assert_equal(create_diagonal(vals, offset=2), b)
- assert_equal(create_diagonal(vals, offset=-2), c)
-
- @pytest.mark.parametrize("n", range(1, 10))
- @pytest.mark.parametrize("offset", range(1, 10))
- def test_1d_from_scipy(self, xp: ModuleType, n: int, offset: int):
- # from scipy._lib tests
- rng = np.random.default_rng(2347823)
- one = xp.asarray(1.0)
- x = rng.random(n)
- A = create_diagonal(xp.asarray(x, dtype=one.dtype), offset=offset)
- B = xp.asarray(np.diag(x, offset), dtype=one.dtype)
- assert_equal(A, B)
-
- def test_0d_raises(self, xp: ModuleType):
- with pytest.raises(ValueError, match="1-dimensional"):
- _ = create_diagonal(xp.asarray(1))
-
- @pytest.mark.parametrize(
- "shape",
- [
- (0,),
- (10,),
- (0, 1),
- (1, 0),
- (0, 0),
- (2, 3),
- (4, 2, 1),
- (1, 1, 7),
- (0, 0, 1),
- (3, 2, 4, 5),
- ],
- )
- def test_nd(self, xp: ModuleType, shape: tuple[int, ...]):
- rng = np.random.default_rng(2347823)
- b = xp.asarray(
- rng.integers((1 << 64) - 1, size=shape, dtype=np.uint64), dtype=xp.uint64
- )
- c = create_diagonal(b)
- zero = xp.zeros((), dtype=xp.uint64)
- assert c.shape == (*b.shape, b.shape[-1])
- for i in ndindex(*eager_shape(c)):
- assert_equal(c[i], b[i[:-1]] if i[-2] == i[-1] else zero)
-
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3], device=device)
- assert get_device(create_diagonal(x)) == device
-
- def test_xp(self, xp: ModuleType):
- x = xp.asarray([1, 2])
- y = create_diagonal(x, xp=xp)
- assert_equal(y, xp.asarray([[1, 0], [0, 2]]))
-
-
-class TestDefaultDType:
- def test_basic(self, xp: ModuleType):
- assert default_dtype(xp) == xp.empty(0).dtype
-
- def test_kind(self, xp: ModuleType):
- assert default_dtype(xp, "real floating") == xp.empty(0).dtype
- assert default_dtype(xp, "complex floating") == (xp.empty(0) * 1j).dtype
- assert default_dtype(xp, "integral") == xp.int64
- assert default_dtype(xp, "indexing") == xp.int64
-
- with pytest.raises(ValueError, match="Unknown kind"):
- _ = default_dtype(xp, "foo") # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
- def test_device(self, xp: ModuleType, device: Device):
- # Note: at the moment there are no known namespaces with
- # device-specific default dtypes.
- assert default_dtype(xp, device=None) == xp.empty(0).dtype
- assert default_dtype(xp, device=device) == xp.empty(0).dtype
-
- def test_torch(self, torch: ModuleType):
- xp = torch
- xp.set_default_dtype(xp.float64)
- assert default_dtype(xp) == xp.float64
- assert default_dtype(xp, "real floating") == xp.float64
- assert default_dtype(xp, "complex floating") == xp.complex128
-
- xp.set_default_dtype(xp.float32)
- assert default_dtype(xp) == xp.float32
- assert default_dtype(xp, "real floating") == xp.float32
- assert default_dtype(xp, "complex floating") == xp.complex64
-
-
-@pytest.mark.filterwarnings(r"ignore:.*removed in v1.0.0.*:DeprecationWarning")
-class TestExpandDims:
- def test_single_axis(self, xp: ModuleType):
- """Trivial case where xpx.expand_dims doesn't add anything to xp.expand_dims"""
- a = xp.asarray(np.reshape(np.arange(2 * 3 * 4 * 5), (2, 3, 4, 5)))
- for axis in range(-5, 4):
- b = expand_dims(a, axis=axis)
- assert_equal(b, xp.expand_dims(a, axis=axis))
-
- def test_axis_tuple(self, xp: ModuleType):
- a = xp.empty((3, 3, 3))
- assert expand_dims(a, axis=(0, 1, 2)).shape == (1, 1, 1, 3, 3, 3)
- assert expand_dims(a, axis=(0, -1, -2)).shape == (1, 3, 3, 3, 1, 1)
- assert expand_dims(a, axis=(0, 3, 5)).shape == (1, 3, 3, 1, 3, 1)
- assert expand_dims(a, axis=(0, -3, -5)).shape == (1, 1, 3, 1, 3, 3)
-
- def test_axis_out_of_range(self, xp: ModuleType):
- a = xp.empty((2, 3, 4, 5))
- with pytest.raises(IndexError, match="out of bounds"):
- _ = expand_dims(a, axis=-6)
- with pytest.raises(IndexError, match="out of bounds"):
- _ = expand_dims(a, axis=5)
-
- a = xp.empty((3, 3, 3))
- with pytest.raises(IndexError, match="out of bounds"):
- _ = expand_dims(a, axis=(0, -6))
- with pytest.raises(IndexError, match="out of bounds"):
- _ = expand_dims(a, axis=(0, 5))
-
- def test_repeated_axis(self, xp: ModuleType):
- a = xp.empty((3, 3, 3))
- with pytest.raises(ValueError, match="Duplicate dimensions"):
- _ = expand_dims(a, axis=(1, 1))
-
- def test_positive_negative_repeated(self, xp: ModuleType):
- # https://github.com/data-apis/array-api/issues/760#issuecomment-1989449817
- a = xp.empty((2, 3, 4, 5))
- with pytest.raises(ValueError, match="Duplicate dimensions"):
- _ = expand_dims(a, axis=(3, -3))
-
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3], device=device)
- assert get_device(expand_dims(x, axis=0)) == device
-
- def test_xp(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3])
- y = expand_dims(x, axis=(0, 1, 2), xp=xp)
- assert y.shape == (1, 1, 1, 3)
-
-
-@pytest.mark.filterwarnings( # array_api_strictest
- "ignore:invalid value encountered:RuntimeWarning:array_api_strict"
-)
-@pytest.mark.filterwarnings( # sparse
- "ignore:invalid value encountered:RuntimeWarning:sparse"
-)
-class TestIsClose:
- @pytest.mark.parametrize("swap", [False, True])
- @pytest.mark.parametrize(
- ("a", "b"),
- [
- (0.0, 0.0),
- (1.0, 1.0),
- (1.0, 2.0),
- (1.0, -1.0),
- (100.0, 101.0),
- (0, 0),
- (1, 1),
- (1, 2),
- (1, -1),
- (1.0 + 1j, 1.0 + 1j),
- (1.0 + 1j, 1.0 - 1j),
- (float("inf"), float("inf")),
- (float("inf"), 100.0),
- (float("inf"), float("-inf")),
- (float("-inf"), float("-inf")),
- (float("nan"), float("nan")),
- (float("nan"), 100.0),
- (1e6, 1e6 + 1), # True - within rtol
- (1e6, 1e6 + 100), # False - outside rtol
- (1e-6, 1.1e-6), # False - outside atol
- (1e-7, 1.1e-7), # True - outside atol
- (1e6 + 0j, 1e6 + 1j), # True - within rtol
- (1e6 + 0j, 1e6 + 100j), # False - outside rtol
- ],
- )
- def test_basic(self, a: float, b: float, swap: bool, xp: ModuleType):
- if swap:
- b, a = a, b
- a_xp = xp.asarray(a)
- b_xp = xp.asarray(b)
-
- assert_equal(isclose(a_xp, b_xp), xp.asarray(np.isclose(a, b)))
-
- with warnings.catch_warnings():
- warnings.simplefilter("ignore")
- ar_np = a * np.arange(10)
- br_np = b * np.arange(10)
- ar_xp = xp.asarray(ar_np)
- br_xp = xp.asarray(br_np)
-
- assert_equal(isclose(ar_xp, br_xp), xp.asarray(np.isclose(ar_np, br_np)))
-
- @pytest.mark.parametrize("dtype", ["float32", "int32"])
- def test_broadcast(self, dtype: str, xp: ModuleType):
- dtype = getattr(xp, dtype)
- a = xp.asarray([1, 2, 3], dtype=dtype)
- b = xp.asarray([[1], [5]], dtype=dtype)
- actual = isclose(a, b)
- expect = xp.asarray(
- [[True, False, False], [False, False, False]], dtype=xp.bool
- )
-
- assert_equal(actual, expect)
-
- def test_some_inf(self, xp: ModuleType):
- a = xp.asarray([0.0, 1.0, xp.inf, xp.inf, xp.inf])
- b = xp.asarray([1e-9, 1.0, xp.inf, -xp.inf, 2.0])
- actual = isclose(a, b)
- assert_equal(actual, xp.asarray([True, True, True, False, False]))
-
- def test_equal_nan(self, xp: ModuleType):
- a = xp.asarray([xp.nan, xp.nan, 1.0])
- b = xp.asarray([xp.nan, 1.0, xp.nan])
- assert_equal(isclose(a, b), xp.asarray([False, False, False]))
- assert_equal(isclose(a, b, equal_nan=True), xp.asarray([True, False, False]))
-
- @pytest.mark.parametrize("dtype", ["float32", "complex64", "int32"])
- def test_tolerance(self, dtype: str, xp: ModuleType):
- dtype = getattr(xp, dtype)
- a = xp.asarray([100, 100], dtype=dtype)
- b = xp.asarray([101, 102], dtype=dtype)
- assert_equal(isclose(a, b), xp.asarray([False, False]))
- assert_equal(isclose(a, b, atol=1), xp.asarray([True, False]))
- assert_equal(isclose(a, b, rtol=0.01), xp.asarray([True, False]))
-
- # Attempt to trigger division by 0 in rtol on int dtype
- assert_equal(isclose(a, b, rtol=0), xp.asarray([False, False]))
- assert_equal(isclose(a, b, atol=1, rtol=0), xp.asarray([True, False]))
-
- @pytest.mark.parametrize("dtype", ["int8", "uint8"])
- def test_tolerance_integer_overflow(self, dtype: str, xp: ModuleType):
- """1/rtol is too large for dtype"""
- a = xp.asarray([100, 100], dtype=getattr(xp, dtype))
- b = xp.asarray([100, 101], dtype=getattr(xp, dtype))
- assert_equal(isclose(a, b), xp.asarray([True, False]))
-
- def test_very_small_numbers(self, xp: ModuleType):
- a = xp.asarray([1e-9, 1e-9])
- b = xp.asarray([1.0001e-9, 1.00001e-9])
- # Difference is below default atol
- assert_equal(isclose(a, b), xp.asarray([True, True]))
- # Use only rtol
- assert_equal(isclose(a, b, atol=0), xp.asarray([False, True]))
- assert_equal(isclose(a, b, atol=0, rtol=0), xp.asarray([False, False]))
-
- def test_bool_dtype(self, xp: ModuleType):
- a = xp.asarray([False, True, False])
- b = xp.asarray([True, True, False])
- assert_equal(isclose(a, b), xp.asarray([False, True, True]))
- assert_equal(isclose(a, b, atol=1), xp.asarray([True, True, True]))
- assert_equal(isclose(a, b, atol=2), xp.asarray([True, True, True]))
- assert_equal(isclose(a, b, rtol=1), xp.asarray([True, True, True]))
- assert_equal(isclose(a, b, rtol=2), xp.asarray([True, True, True]))
-
- # Test broadcasting
- assert_equal(
- isclose(a, xp.asarray(True), atol=1), xp.asarray([True, True, True])
- )
- assert_equal(
- isclose(xp.asarray(True), b, atol=1), xp.asarray([True, True, True])
- )
-
- @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="index by sparse array")
- @pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="unknown shape")
- def test_none_shape(self, xp: ModuleType):
- a = xp.asarray([1, 5, 0])
- b = xp.asarray([1, 4, 2])
- b = b[a < 5]
- a = a[a < 5]
- assert_equal(isclose(a, b), xp.asarray([True, False]))
-
- @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="index by sparse array")
- @pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="unknown shape")
- def test_none_shape_bool(self, xp: ModuleType):
- a = xp.asarray([True, True, False])
- b = xp.asarray([True, False, True])
- b = b[a]
- a = a[a]
- assert_equal(isclose(a, b), xp.asarray([True, False]))
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_python_scalar(self, xp: ModuleType):
- a = xp.asarray([0.0, 0.1], dtype=xp.float32)
- assert_equal(isclose(a, 0.0), xp.asarray([True, False]))
- assert_equal(isclose(0.0, a), xp.asarray([True, False]))
-
- a = xp.asarray([0, 1], dtype=xp.int16)
- assert_equal(isclose(a, 0), xp.asarray([True, False]))
- assert_equal(isclose(0, a), xp.asarray([True, False]))
-
- assert_equal(isclose(0, 0, xp=xp), xp.asarray(True))
- assert_equal(isclose(0, 1, xp=xp), xp.asarray(False))
-
- def test_all_python_scalars(self):
- with pytest.raises(TypeError, match=r"array_namespace requires .* array input"):
- _ = isclose(0, 0)
-
- def test_xp(self, xp: ModuleType):
- a = xp.asarray([0.0, 0.0])
- b = xp.asarray([1e-9, 1e-4])
- assert_equal(isclose(a, b, xp=xp), xp.asarray([True, False]))
-
- @pytest.mark.parametrize("equal_nan", [True, False])
- def test_device(self, xp: ModuleType, device: Device, equal_nan: bool):
- a = xp.asarray([0.0, 0.0, xp.nan], device=device)
- b = xp.asarray([1e-9, 1e-4, xp.nan], device=device)
- res = isclose(a, b, equal_nan=equal_nan)
- assert get_device(res) == device
-
- def test_array_on_device_with_scalar(self, xp: ModuleType, device: Device):
- a = xp.asarray([0.01, 0.5, 0.8, 0.9, 1.00001], device=device, dtype=xp.float64)
- b = 1
- res = isclose(a, b)
- assert get_device(res) == device
- assert_equal(res, xp.asarray([False, False, False, False, True]))
-
- a = 0.1
- b = xp.asarray([0.01, 0.5, 0.8, 0.9, 0.100001], device=device, dtype=xp.float64)
- res = isclose(a, b)
- assert get_device(res) == device
- assert_equal(res, xp.asarray([False, False, False, False, True]))
-
-
-class TestKron:
- def test_basic(self, xp: ModuleType):
- # Using 0-dimensional array
- a = xp.asarray(1)
- b = xp.asarray([[1, 2], [3, 4]])
- assert_equal(kron(a, b), b)
- assert_equal(kron(b, a), b)
-
- # Using 1-dimensional array
- a = xp.asarray([3])
- b = xp.asarray([[1, 2], [3, 4]])
- k = xp.asarray([[3, 6], [9, 12]])
- assert_equal(kron(a, b), k)
- assert_equal(kron(b, a), k)
-
- # Using 3-dimensional array
- a = xp.asarray([[[1]], [[2]]])
- b = xp.asarray([[1, 2], [3, 4]])
- k = xp.asarray([[[1, 2], [3, 4]], [[2, 4], [6, 8]]])
- assert_equal(kron(a, b), k)
- assert_equal(kron(b, a), k)
-
- def test_kron_smoke(self, xp: ModuleType):
- a = xp.ones((3, 3))
- b = xp.ones((3, 3))
- k = xp.ones((9, 9))
-
- assert_equal(kron(a, b), k)
-
- @pytest.mark.parametrize(
- ("shape_a", "shape_b"),
- [
- ((1, 1), (1, 1)),
- ((1, 2, 3), (4, 5, 6)),
- ((2, 2), (2, 2, 2)),
- ((1, 0), (1, 1)),
- ((2, 0, 2), (2, 2)),
- ((2, 0, 0, 2), (2, 0, 2)),
- ],
- )
- def test_kron_shape(
- self, xp: ModuleType, shape_a: tuple[int, ...], shape_b: tuple[int, ...]
- ):
- a = xp.ones(shape_a)
- b = xp.ones(shape_b)
- normalised_shape_a = xp.asarray(
- (1,) * max(0, len(shape_b) - len(shape_a)) + shape_a
- )
- normalised_shape_b = xp.asarray(
- (1,) * max(0, len(shape_a) - len(shape_b)) + shape_b
- )
- expected_shape = tuple(
- int(dim) for dim in xp.multiply(normalised_shape_a, normalised_shape_b)
- )
-
- k = kron(a, b)
- assert k.shape == expected_shape
-
- def test_python_scalar(self, xp: ModuleType):
- a = 1
- # Test no dtype promotion to xp.asarray(a); use b.dtype
- b = xp.asarray([[1, 2], [3, 4]], dtype=xp.int16)
- assert_equal(kron(a, b), b)
- assert_equal(kron(b, a), b)
- assert_equal(kron(1, 1, xp=xp), xp.asarray(1))
-
- def test_all_python_scalars(self):
- with pytest.raises(TypeError, match=r"array_namespace requires .* array input"):
- _ = kron(1, 1)
-
- def test_device(self, xp: ModuleType, device: Device):
- x1 = xp.asarray([1, 2, 3], device=device)
- x2 = xp.asarray([4, 5], device=device)
- assert get_device(kron(x1, x2)) == device
-
- def test_xp(self, xp: ModuleType):
- a = xp.ones((3, 3))
- b = xp.ones((3, 3))
- k = xp.ones((9, 9))
- assert_equal(kron(a, b, xp=xp), k)
-
-
-class TestNanToNum:
- def test_bool(self, xp: ModuleType) -> None:
- a = xp.asarray([True])
- assert_equal(nan_to_num(a, xp=xp), a)
-
- def test_scalar_pos_inf(self, xp: ModuleType, infinity: float) -> None:
- a = xp.inf
- assert_equal(nan_to_num(a, xp=xp), xp.asarray(infinity))
-
- def test_scalar_neg_inf(self, xp: ModuleType, infinity: float) -> None:
- a = -xp.inf
- assert_equal(nan_to_num(a, xp=xp), -xp.asarray(infinity))
-
- def test_scalar_nan(self, xp: ModuleType) -> None:
- a = xp.nan
- assert_equal(nan_to_num(a, xp=xp), xp.asarray(0.0))
-
- def test_real(self, xp: ModuleType, infinity: float) -> None:
- a = xp.asarray([xp.inf, -xp.inf, xp.nan, -128, 128])
- assert_equal(
- nan_to_num(a, xp=xp),
- xp.asarray(
- [
- infinity,
- -infinity,
- 0.0,
- -128,
- 128,
- ]
- ),
- )
-
- def test_complex(self, xp: ModuleType, infinity: float) -> None:
- a = xp.asarray(
- [
- complex(xp.inf, xp.nan),
- xp.nan,
- complex(xp.nan, xp.inf),
- ]
- )
- assert_equal(
- nan_to_num(a),
- xp.asarray([complex(infinity, 0), complex(0, 0), complex(0, infinity)]),
- )
-
- def test_empty_array(self, xp: ModuleType) -> None:
- a = xp.asarray([], dtype=xp.float32) # forced dtype due to torch
- assert_equal(nan_to_num(a, xp=xp), a)
- assert xp.isdtype(nan_to_num(a, xp=xp).dtype, xp.float32)
-
- @pytest.mark.parametrize(
- ("in_vals", "fill_value", "out_vals"),
- [
- ([1, 2, np.nan, 4], 3, [1.0, 2.0, 3.0, 4.0]),
- ([1, 2, np.nan, 4], 3.0, [1.0, 2.0, 3.0, 4.0]),
- (
- [
- complex(1, 1),
- complex(2, 2),
- complex(np.nan, 0),
- complex(4, 4),
- ],
- 3,
- [
- complex(1.0, 1.0),
- complex(2.0, 2.0),
- complex(3.0, 0.0),
- complex(4.0, 4.0),
- ],
- ),
- (
- [
- complex(1, 1),
- complex(2, 2),
- complex(0, np.nan),
- complex(4, 4),
- ],
- 3.0,
- [
- complex(1.0, 1.0),
- complex(2.0, 2.0),
- complex(0.0, 3.0),
- complex(4.0, 4.0),
- ],
- ),
- (
- [
- complex(1, 1),
- complex(2, 2),
- complex(np.nan, np.nan),
- complex(4, 4),
- ],
- 3.0,
- [
- complex(1.0, 1.0),
- complex(2.0, 2.0),
- complex(3.0, 3.0),
- complex(4.0, 4.0),
- ],
- ),
- ],
- )
- def test_fill_value_success(
- self,
- xp: ModuleType,
- in_vals: Array,
- fill_value: int | float,
- out_vals: Array,
- ) -> None:
- a = xp.asarray(in_vals)
- assert_equal(
- nan_to_num(a, fill_value=fill_value, xp=xp),
- xp.asarray(out_vals),
- )
-
- def test_fill_value_failure(self, xp: ModuleType) -> None:
- a = xp.asarray(
- [
- complex(1, 1),
- complex(xp.nan, xp.nan),
- complex(3, 3),
- ]
- )
- with pytest.raises(
- TypeError,
- match="Complex fill values are not supported",
- ):
- _ = nan_to_num(
- a,
- fill_value=complex(2, 2), # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
- xp=xp,
- )
-
-
-class TestNUnique:
- def test_simple(self, xp: ModuleType):
- a = xp.asarray([[1, 1], [0, 2], [2, 2]])
- assert_equal(nunique(a), xp.asarray(3))
-
- def test_empty(self, xp: ModuleType):
- a = xp.asarray([])
- assert_equal(nunique(a), xp.asarray(0))
-
- def test_size1(self, xp: ModuleType):
- a = xp.asarray([123])
- assert_equal(nunique(a), xp.asarray(1))
-
- def test_all_equal(self, xp: ModuleType):
- a = xp.asarray([123, 123, 123])
- assert_equal(nunique(a), xp.asarray(1))
-
- @pytest.mark.xfail_xp_backend(Backend.DASK, reason="No equal_nan kwarg in unique")
- @pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="sparse#855")
- def test_nan(self, xp: ModuleType, library: Backend):
- if library.like(Backend.NUMPY) and NUMPY_VERSION < (1, 24):
- pytest.xfail("NumPy <1.24 has no equal_nan kwarg in unique")
-
- # Each NaN is counted separately
- a = xp.asarray([xp.nan, 123.0, xp.nan])
- assert_equal(nunique(a), xp.asarray(3))
-
- @pytest.mark.parametrize("size", [0, 1, 2])
- def test_device(self, xp: ModuleType, device: Device, size: int):
- a = xp.asarray([0.0] * size, device=device)
- assert get_device(nunique(a)) == device
-
- def test_xp(self, xp: ModuleType):
- a = xp.asarray([[1, 1], [0, 2], [2, 2]])
- assert_equal(nunique(a, xp=xp), xp.asarray(3))
-
-
-class TestPad:
- def test_simple(self, xp: ModuleType):
- a = xp.asarray([1, 2, 3])
- padded = pad(a, 2)
- assert_equal(padded, xp.asarray([0, 0, 1, 2, 3, 0, 0]))
-
- @pytest.mark.xfail_xp_backend(
- Backend.SPARSE, reason="constant_values can only be equal to fill value"
- )
- def test_fill_value(self, xp: ModuleType):
- a = xp.asarray([1, 2, 3])
- padded = pad(a, 2, constant_values=42)
- assert_equal(padded, xp.asarray([42, 42, 1, 2, 3, 42, 42]))
-
- def test_ndim(self, xp: ModuleType):
- a = xp.asarray(np.reshape(np.arange(2 * 3 * 4), (2, 3, 4)))
- padded = pad(a, 2)
- assert padded.shape == (6, 7, 8)
-
- def test_mode_not_implemented(self, xp: ModuleType):
- a = xp.asarray([1, 2, 3])
- with pytest.raises(NotImplementedError, match="Only `'constant'`"):
- _ = pad(a, 2, mode="edge") # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
- def test_device(self, xp: ModuleType, device: Device):
- a = xp.asarray(0.0, device=device)
- assert get_device(pad(a, 2)) == device
-
- def test_xp(self, xp: ModuleType):
- padded = pad(xp.asarray(0), 1, xp=xp)
- assert_equal(padded, xp.asarray(0))
-
- def test_tuple_width(self, xp: ModuleType):
- a = xp.asarray(np.reshape(np.arange(12), (3, 4)))
- padded = pad(a, (1, 0))
- assert padded.shape == (4, 5)
-
- padded = pad(a, (1, 2))
- assert padded.shape == (6, 7)
-
- with pytest.raises((ValueError, RuntimeError)):
- _ = pad(a, [(1, 2, 3)]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
-
- def test_sequence_of_tuples_width(self, xp: ModuleType):
- a = xp.asarray(np.reshape(np.arange(12), (3, 4)))
-
- padded = pad(a, ((1, 0), (0, 2)))
- assert padded.shape == (4, 6)
- padded = pad(a, ((1, 0), (0, 0)))
- assert padded.shape == (4, 4)
-
-
-assume_unique = pytest.mark.parametrize(
- "assume_unique",
- [
- True,
- pytest.param(
- False,
- marks=pytest.mark.xfail_xp_backend(
- Backend.DASK, reason="NaN-shaped arrays"
- ),
- ),
- ],
-)
-
-
-@pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="no argsort")
-@pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="no unique_values")
-class TestSetDiff1D:
- @pytest.mark.xfail_xp_backend(Backend.DASK, reason="NaN-shaped arrays")
- @pytest.mark.xfail_xp_backend(
- Backend.TORCH, reason="index_select not implemented for uint32"
- )
- @pytest.mark.xfail_xp_backend(
- Backend.TORCH_GPU, reason="index_select not implemented for uint32"
- )
- def test_setdiff1d(self, xp: ModuleType):
- x1 = xp.asarray([6, 5, 4, 7, 1, 2, 7, 4])
- x2 = xp.asarray([2, 4, 3, 3, 2, 1, 5])
-
- expected = xp.asarray([6, 7])
- actual = setdiff1d(x1, x2)
- assert_equal(actual, expected)
-
- x1 = xp.arange(21)
- x2 = xp.arange(19)
- expected = xp.asarray([19, 20])
- actual = setdiff1d(x1, x2)
- assert_equal(actual, expected)
-
- assert_equal(setdiff1d(xp.empty(0), xp.empty(0)), xp.empty(0))
- x1 = xp.empty(0, dtype=xp.uint32)
- x2 = x1
- assert xp.isdtype(setdiff1d(x1, x2).dtype, xp.uint32)
-
- def test_assume_unique(self, xp: ModuleType):
- x1 = xp.asarray([3, 2, 1])
- x2 = xp.asarray([7, 5, 2])
- expected = xp.asarray([3, 1])
- actual = setdiff1d(x1, x2, assume_unique=True)
- assert_equal(actual, expected)
-
- @assume_unique
- @pytest.mark.parametrize("shape1", [(), (1,), (1, 1)])
- @pytest.mark.parametrize("shape2", [(), (1,), (1, 1)])
- def test_shapes(
- self,
- assume_unique: bool,
- shape1: tuple[int, ...],
- shape2: tuple[int, ...],
- xp: ModuleType,
- ):
- x1 = xp.zeros(shape1)
- x2 = xp.zeros(shape2)
-
- actual = setdiff1d(x1, x2, assume_unique=assume_unique)
- assert_equal(actual, xp.empty((0,)))
-
- @assume_unique
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_python_scalar(self, xp: ModuleType, assume_unique: bool):
- # Test no dtype promotion to xp.asarray(x2); use x1.dtype
- x1 = xp.asarray([3, 1, 2], dtype=xp.int16)
- x2 = 3
- actual = setdiff1d(x1, x2, assume_unique=assume_unique)
- assert_equal(actual, xp.asarray([1, 2], dtype=xp.int16))
-
- actual = setdiff1d(x2, x1, assume_unique=assume_unique)
- assert_equal(actual, xp.asarray([], dtype=xp.int16))
-
- assert_equal(
- setdiff1d(0, 0, assume_unique=assume_unique, xp=xp),
- xp.asarray([0])[:0], # Default int dtype for backend
- )
-
- @pytest.mark.parametrize("assume_unique", [True, False])
- def test_all_python_scalars(self, assume_unique: bool):
- with pytest.raises(TypeError, match=r"array_namespace requires .* array input"):
- _ = setdiff1d(0, 0, assume_unique=assume_unique)
-
- @assume_unique
- @pytest.mark.skip_xp_backend(
- Backend.TORCH, reason="device='meta' does not support unknown shapes"
- )
- def test_device(self, xp: ModuleType, device: Device, assume_unique: bool):
- x1 = xp.asarray([3, 8, 20], device=device)
- x2 = xp.asarray([2, 3, 4], device=device)
- assert get_device(setdiff1d(x1, x2, assume_unique=assume_unique)) == device
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_xp(self, xp: ModuleType):
- x1 = xp.asarray([3, 8, 20])
- x2 = xp.asarray([2, 3, 4])
- expected = xp.asarray([8, 20])
- actual = setdiff1d(x1, x2, assume_unique=True, xp=xp)
- assert_equal(actual, expected)
-
-
-class TestSinc:
- def test_simple(self, xp: ModuleType):
- assert_equal(sinc(xp.asarray(0.0)), xp.asarray(1.0))
- x = xp.asarray(np.linspace(-1, 1, 100))
- w = sinc(x)
- # check symmetry
- assert_close(w, xp.flip(w, axis=0))
-
- @pytest.mark.parametrize("x", [0, 1 + 3j])
- def test_dtype(self, xp: ModuleType, x: int | complex):
- with pytest.raises(ValueError, match="real floating data type"):
- _ = sinc(xp.asarray(x))
-
- def test_3d(self, xp: ModuleType):
- x = np.arange(18, dtype=np.float64).reshape((3, 3, 2))
- expected = np.zeros_like(x)
- expected[0, 0, 0] = 1
- x = xp.asarray(x)
- expected = xp.asarray(expected)
- assert_close(sinc(x), expected, atol=1e-15)
-
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray(0.0, device=device)
- assert get_device(sinc(x)) == device
-
- def test_xp(self, xp: ModuleType):
- assert_equal(sinc(xp.asarray(0.0), xp=xp), xp.asarray(1.0))
-
-
-class TestPartition:
- @classmethod
- def _assert_valid_partition(
- cls,
- x_np: np.ndarray | None,
- k: int,
- y: Array,
- xp: ModuleType,
- axis: int | None = -1,
- ):
- """
- x_np : input array
- k : int
- y : output array returned by the partition function to test
- """
- if x_np is not None:
- assert y.shape == np.partition(x_np, k, axis=axis).shape
- if y.ndim != 1 and axis == 0:
- assert isinstance(y.shape[1], int)
- for i in range(y.shape[1]):
- cls._assert_valid_partition(None, k, y[:, i, ...], xp, axis=0)
- elif y.ndim != 1:
- assert axis is not None
- axis = axis - 1 if axis != -1 else -1
- assert isinstance(y.shape[0], int)
- for i in range(y.shape[0]):
- cls._assert_valid_partition(None, k, y[i, ...], xp, axis=axis)
- else:
- if k > 0:
- assert xp.max(y[:k]) <= y[k]
- assert y[k] <= xp.min(y[k:])
-
- @classmethod
- def _partition(cls, x: np.ndarray, k: int, xp: ModuleType, axis: int | None = -1):
- return partition(xp.asarray(x), k, axis=axis)
-
- def _test_1d(self, xp: ModuleType):
- rng = np.random.default_rng()
- for n in [2, 3, 4, 5, 7, 10, 20, 50, 100, 1_000]:
- k = int(rng.integers(n))
- x1 = rng.integers(n, size=n)
- y = self._partition(x1, k, xp)
- self._assert_valid_partition(x1, k, y, xp)
- x2 = rng.random(n)
- y = self._partition(x2, k, xp)
- self._assert_valid_partition(x2, k, y, xp)
-
- def _test_nd(self, xp: ModuleType, ndim: int):
- rng = np.random.default_rng()
-
- for n in [2, 3, 5, 10, 20, 100]:
- base_shape = [int(v) for v in rng.integers(1, 4, size=ndim)]
- k = int(rng.integers(n))
-
- for i in range(ndim):
- shape = base_shape[:]
- shape[i] = n
- x = rng.integers(n, size=tuple(shape))
- y = self._partition(x, k, xp, axis=i)
- self._assert_valid_partition(x, k, y, xp, axis=i)
-
- z = rng.random(tuple(base_shape))
- k = int(rng.integers(z.size))
- y = self._partition(z, k, xp, axis=None)
- self._assert_valid_partition(z, k, y, xp, axis=None)
-
- def _test_input_validation(self, xp: ModuleType):
- with pytest.raises(TypeError):
- _ = self._partition(np.asarray(1), 1, xp)
- with pytest.raises(ValueError, match="out of bounds"):
- _ = self._partition(np.asarray([1, 2]), 3, xp)
-
- def test_1d(self, xp: ModuleType):
- self._test_1d(xp)
-
- @pytest.mark.parametrize("ndim", [2, 3, 4])
- def test_nd(self, xp: ModuleType, ndim: int):
- self._test_nd(xp, ndim)
-
- def test_input_validation(self, xp: ModuleType):
- self._test_input_validation(xp)
-
-
-@pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="no argsort")
-class TestArgpartition(TestPartition):
- @classmethod
- @override
- def _partition(cls, x: np.ndarray, k: int, xp: ModuleType, axis: int | None = -1):
- arr = xp.asarray(x)
- indices = argpartition(arr, k, axis=axis)
- if axis is None:
- arr = xp.reshape(arr, shape=(-1,))
- return arr[indices]
- if arr.ndim == 1:
- return arr[indices]
- return cls._take_along_axis(arr, indices, axis=axis, xp=xp)
-
- @classmethod
- def _take_along_axis(cls, arr: Array, indices: Array, axis: int, xp: ModuleType):
- if hasattr(xp, "take_along_axis"):
- return xp.take_along_axis(arr, indices, axis=axis)
- if arr.ndim == 1:
- return arr[indices]
- if axis == 0:
- assert isinstance(arr.shape[1], int)
- arrs = []
- for i in range(arr.shape[1]):
- arrs.append(
- cls._take_along_axis(
- arr[:, i, ...], indices[:, i, ...], axis=0, xp=xp
- )
- )
- return xp.stack(arrs, axis=1)
- axis = axis - 1 if axis != -1 else -1
- assert isinstance(arr.shape[0], int)
- arrs = []
- for i in range(arr.shape[0]):
- arrs.append(
- cls._take_along_axis(arr[i, ...], indices[i, ...], axis=axis, xp=xp)
- )
- return xp.stack(arrs, axis=0)
-
- @override
- def test_1d(self, xp: ModuleType):
- self._test_1d(xp)
-
- @pytest.mark.parametrize("ndim", [2, 3, 4])
- @override
- def test_nd(self, xp: ModuleType, ndim: int):
- self._test_nd(xp, ndim)
-
- @override
- def test_input_validation(self, xp: ModuleType):
- self._test_input_validation(xp)
-
-
-@pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="no unique_inverse")
-class TestIsIn:
- def test_simple(self, xp: ModuleType, library: Backend):
- if library.like(Backend.NUMPY) and NUMPY_VERSION < (1, 24):
- pytest.xfail("NumPy <1.24 has no kind kwarg in isin")
-
- b = xp.asarray([1, 2, 3, 4])
-
- # `a` with 1 dimension
- a = xp.asarray([1, 3, 6, 10])
- expected = xp.asarray([True, True, False, False])
- res = isin(a, b)
- assert_equal(res, expected)
-
- # `a` with 2 dimensions
- a = xp.asarray([[0, 2], [4, 6]])
- expected = xp.asarray([[False, True], [True, False]])
- res = isin(a, b)
- assert_equal(res, expected)
-
- def test_device(self, xp: ModuleType, device: Device, library: Backend):
- if library.like(Backend.NUMPY) and NUMPY_VERSION < (1, 24):
- pytest.xfail("NumPy <1.24 has no kind kwarg in isin")
-
- a = xp.asarray([1, 3, 6], device=device)
- b = xp.asarray([1, 2, 3], device=device)
- assert get_device(isin(a, b)) == device
-
- def test_assume_unique_and_invert(
- self, xp: ModuleType, device: Device, library: Backend
- ):
- if library.like(Backend.NUMPY) and NUMPY_VERSION < (1, 24):
- pytest.xfail("NumPy <1.24 has no kind kwarg in isin")
-
- a = xp.asarray([0, 3, 6, 10], device=device)
- b = xp.asarray([1, 2, 3, 10], device=device)
- expected = xp.asarray([True, False, True, False])
- res = isin(a, b, assume_unique=True, invert=True)
- assert get_device(res) == device
- assert_equal(res, expected)
-
- def test_kind(self, xp: ModuleType, library: Backend):
- if library.like(Backend.NUMPY) and NUMPY_VERSION < (1, 24):
- pytest.xfail("NumPy <1.24 has no kind kwarg in isin")
-
- a = xp.asarray([0, 3, 6, 10])
- b = xp.asarray([1, 2, 3, 10])
- expected = xp.asarray([False, True, False, True])
- res = isin(a, b, kind="sort")
- assert_equal(res, expected)
-
-
-def _apply_over_batch(*argdefs: tuple[str, int]) -> Any:
- """
- Factory for decorator that applies a function over batched arguments.
-
- Copied (with light simplifications) from `scipy._lib._util`.
-
- Array arguments may have any number of core dimensions (typically 0,
- 1, or 2) and any broadcastable batch shapes. There may be any
- number of array outputs of any number of dimensions. Assumptions
- right now - which are satisfied by all functions of interest in `linalg` -
- are that all array inputs are consecutive keyword or positional arguments,
- and that the wrapped function returns either a single array or a tuple of
- arrays. It's only as general as it needs to be right now - it can be extended.
-
- Parameters
- ----------
- *argdefs : tuple of (str, int)
- Definitions of array arguments: the keyword name of the argument, and
- the number of core dimensions.
-
- Example:
- --------
- `linalg.eig` accepts two matrices as the first two arguments `a` and `b`, where
- `b` is optional, and returns one array or a tuple of arrays, depending on the
- values of other positional or keyword arguments. To generate a wrapper that applies
- the function over batches of `a` and optionally `b` :
-
- >>> _apply_over_batch(('a', 2), ('b', 2))
- """
- names, ndims = list(zip(*argdefs, strict=True))
- n_arrays = len(names)
-
- def decorator(f: Any) -> Any:
- def wrapper(
- *args_tuple: Any,
- **kwargs: Any,
- ) -> Any:
- args = list(args_tuple)
-
- # Ensure all arrays in `arrays`, other arguments in `other_args`/`kwargs`
- arrays, other_args = args[:n_arrays], args[n_arrays:]
- arrays = cast(list[Array | None], arrays)
- for i, name in enumerate(names):
- if name in kwargs:
- if i + 1 <= len(args):
- message = (
- f"{f.__name__}() got multiple values for argument `{name}`."
- )
- raise ValueError(message)
- arrays.append(kwargs.pop(name))
-
- xp = array_namespace(*arrays)
-
- # Determine core and batch shapes
- batch_shapes = []
- core_shapes = []
- for i, (array, ndim) in enumerate(zip(arrays, ndims, strict=True)):
- array = None if array is None else xp.asarray(array) # noqa: PLW2901
- shape = () if array is None else array.shape
- arrays[i] = array
- batch_shapes.append(shape[:-ndim] if ndim > 0 else shape)
- core_shapes.append(shape[-ndim:] if ndim > 0 else ())
-
- # Early exit if call is not batched
- if not any(batch_shapes):
- return f(*arrays, *other_args, **kwargs)
-
- # Determine broadcasted batch shape
- batch_shape = np.broadcast_shapes(*batch_shapes) # Gives OK error message
-
- # Broadcast arrays to appropriate shape
- for i, (array, core_shape) in enumerate(
- zip(arrays, core_shapes, strict=True)
- ):
- if array is None:
- continue
- arrays[i] = xp.broadcast_to(array, batch_shape + core_shape)
-
- # Main loop
- results = []
- for index in np.ndindex(batch_shape):
- result = f(
- *(
- (array[index] if array is not None else None)
- for array in arrays
- ),
- *other_args,
- **kwargs,
- )
- # Assume `result` is either a tuple or single array. This is easily
- # generalized by allowing the contributor to pass an `unpack_result`
- # callable to the decorator factory.
- result = (result,) if not isinstance(result, tuple) else result
- results.append(result)
- results = list(zip(*results, strict=True))
-
- # Reshape results
- for i, result in enumerate(results):
- result = xp.stack(result) # noqa: PLW2901
- core_shape = result.shape[1:]
- results[i] = xp.reshape(result, batch_shape + core_shape)
-
- # Assume `result` should be a single array if there is only one element or
- # a `tuple` otherwise. This is easily generalized by allowing the
- # contributor to pass an `pack_result` callable to the decorator factory.
- return results[0] if len(results) == 1 else results
-
- return wrapper
-
- return decorator
-
-
-@_apply_over_batch(("a", 1), ("v", 1)) # type: ignore[untyped-decorator]
-def xp_searchsorted(
- a: Array,
- v: Array,
- side: Literal["left", "right"],
- xp: ModuleType,
-) -> Array:
- return xp.searchsorted(a, v, side=side)
-
-
-@pytest.mark.skip_xp_backend(Backend.DASK, reason="no take_along_axis")
-@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no searchsorted")
-class TestSearchsorted:
- def test_input_validation(self, xp: ModuleType):
- message = "`side` must be either 'left' or 'right'."
- with pytest.raises(ValueError, match=message):
- _ = xpx_searchsorted(xp.asarray([1, 2]), xp.asarray([1, 2]), side="center") # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
- @pytest.mark.parametrize("side", ["left", "right"])
- @pytest.mark.parametrize("ties", [False, True])
- @pytest.mark.parametrize(
- "shape", [0, 1, 2, 10, 11, 1000, 10001, (2, 0), (0, 2), (2, 10), (2, 3, 11)]
- )
- @pytest.mark.parametrize("nans_x", [False, True])
- @pytest.mark.parametrize("infs_x", [False, True])
- @pytest.mark.parametrize("searchsorted", [xpx_searchsorted, _funcs_searchsorted])
- def test_nd(
- self,
- side: Literal["left", "right"],
- ties: bool,
- shape: int | tuple[int],
- nans_x: bool,
- infs_x: bool,
- xp: ModuleType,
- searchsorted: Callable[..., Array],
- ):
- if nans_x and is_torch_namespace(xp) and searchsorted == xpx_searchsorted:
- pytest.skip("torch sorts NaNs differently")
- if isinstance(shape, tuple) and searchsorted == _funcs_searchsorted:
- message = (
- "Redundant; `xpx_searchsorted` delegates to "
- "`_funcs_searchsorted` for multidimensional input."
- )
- pytest.skip(message)
- rng = np.random.default_rng(945298725498274853)
- x = rng.integers(5, size=shape) if ties else rng.random(shape)
- # float32 is to accommodate JAX - nextafter with `float64` is too small?
- x = np.asarray(x, dtype=np.float32) # type:ignore[assignment]
- xr = np.nextafter(x, np.inf)
- xl = np.nextafter(x, -np.inf)
- x_ = np.asarray([-np.inf, np.inf, np.nan])
- x_ = np.broadcast_to(x_, (*x.shape[:-1], 3))
- y = rng.permuted(np.concatenate((xl, x, xr, x_), axis=-1), axis=-1)
- if nans_x:
- mask = rng.random(shape) < 0.1
- x[mask] = np.nan
- if infs_x:
- mask = rng.random(shape) < 0.1
- x[mask] = -np.inf
- mask = rng.random(shape) > 0.9
- x[mask] = np.inf
- x = np.sort(x, axis=-1) # type:ignore[assignment]
- x, y = np.asarray(x, dtype=np.float64), np.asarray(y, dtype=np.float64)
- xp_default_int = default_dtype(xp, kind="integral")
- if x.size == 0 and x.ndim > 0 and x.shape[-1] != 0:
- ref = xp.empty((*x.shape[:-1], y.shape[-1]), dtype=xp_default_int)
- else:
- ref = xp_searchsorted(x, y, side=side, xp=np)
- ref = xp.asarray(ref, dtype=xp_default_int)
- x, y = xp.asarray(x.copy()), xp.asarray(y.copy())
- res = searchsorted(x, y, side=side, xp=xp)
- assert_equal(res, ref)
-
-
-@pytest.mark.skip_xp_backend(
- Backend.ARRAY_API_STRICTEST,
- reason="data_dependent_shapes flag for unique_values is disabled",
-)
-class TestUnion1d:
- def test_simple(self, xp: ModuleType):
- a = xp.asarray([-1, 1, 0])
- b = xp.asarray([2, -2, 0])
- expected = xp.asarray([-2, -1, 0, 1, 2])
- res = union1d(a, b)
- assert_equal(res, expected)
-
- def test_2d(self, xp: ModuleType):
- a = xp.asarray([[-1, 1, 0], [1, 2, 0]])
- b = xp.asarray([[1, 0, 1], [-2, -1, 0]])
- expected = xp.asarray([-2, -1, 0, 1, 2])
- res = union1d(a, b)
- assert_equal(res, expected)
-
- def test_3d(self, xp: ModuleType):
- a = xp.asarray([[[-1, 0], [1, 2]], [[-1, 0], [1, 2]]])
- b = xp.asarray([[[0, 1], [-1, 2]], [[1, -2], [0, 2]]])
- expected = xp.asarray([-2, -1, 0, 1, 2])
- res = union1d(a, b)
- assert_equal(res, expected)
-
- @pytest.mark.skip_xp_backend(Backend.TORCH, reason="materialize 'meta' device")
- def test_device(self, xp: ModuleType, device: Device):
- a = xp.asarray([-1, 1, 0], device=device)
- b = xp.asarray([2, -2, 0], device=device)
- assert get_device(union1d(a, b)) == device
-
-
-class TestAngle:
- def test_simple(self, xp: ModuleType):
- a = xp.asarray([1, 0])
- res = angle(a)
- expected = xp.asarray([0.0, 0.0], dtype=res.dtype)
- assert_equal(res, expected)
-
- def test_basic(self, xp: ModuleType):
- x = xp.asarray(
- [
- 1 + 3j,
- np.sqrt(2) / 2.0 + 1j * np.sqrt(2) / 2,
- 1,
- 1j,
- -1,
- -1j,
- 1 - 3j,
- -1 + 3j,
- ],
- dtype=xp.complex128,
- )
- expected = xp.asarray(
- [
- np.arctan(3.0 / 1.0),
- np.arctan(1.0),
- 0,
- np.pi / 2,
- np.pi,
- -np.pi / 2.0,
- -np.arctan(3.0 / 1.0),
- np.pi - np.arctan(3.0 / 1.0),
- ],
- dtype=xp.float64,
- )
- assert_close(angle(x, xp=xp), expected, rtol=0, atol=1e-11)
- assert_close(
- angle(x, deg=True, xp=xp),
- expected * 180 / xp.pi,
- rtol=0,
- atol=1e-11,
- )
-
- def test_real(self, xp: ModuleType):
- x = xp.asarray([0.0, -0.0, 1.0, -1.0])
- expected = xp.asarray([0.0, xp.pi, 0.0, xp.pi], dtype=x.dtype)
- assert_close(angle(x, xp=xp), expected)
-
- def test_complex(self, xp: ModuleType):
- a = xp.asarray([1 + 1j, 1 - 1j, -1 + 1j, -1 - 1j])
- expected = xp.asarray([xp.pi / 4, -xp.pi / 4, 3 * xp.pi / 4, -3 * xp.pi / 4])
- res = angle(a, xp=xp)
- assert_equal(res, expected)
-
- def test_integral(self, xp: ModuleType):
- x = xp.asarray([0, -1, 1], dtype=xp.int32)
- actual = angle(x, xp=xp)
- expected = xp.asarray(
- [0.0, xp.pi, 0.0], dtype=default_dtype(xp, device=get_device(x))
- )
- assert_close(actual, expected)
-
- def test_2d(self, xp: ModuleType):
- a = xp.asarray([[1 + 1j, 1 - 1j], [-1 + 1j, -1 - 1j]])
- expected = xp.asarray(
- [[xp.pi / 4, -xp.pi / 4], [3 * xp.pi / 4, -3 * xp.pi / 4]]
- )
- res = angle(a, xp=xp)
- assert_equal(res, expected)
-
- @pytest.mark.skip_xp_backend(Backend.TORCH, reason="materialize 'meta' device")
- def test_device(self, xp: ModuleType, device: Device):
- a = xp.asarray([1 + 1j], device=device)
- assert get_device(angle(a)) == device
diff --git a/tests/test_helpers.py b/tests/test_helpers.py
deleted file mode 100644
index 6d89aa51..00000000
--- a/tests/test_helpers.py
+++ /dev/null
@@ -1,435 +0,0 @@
-from collections.abc import Iterator
-from types import ModuleType
-from typing import TYPE_CHECKING, Generic, TypeVar, cast
-
-import numpy as np
-import pytest
-
-from array_api_extra._lib._backends import Backend
-from array_api_extra._lib._utils._compat import array_namespace
-from array_api_extra._lib._utils._compat import device as get_device
-from array_api_extra._lib._utils._helpers import (
- asarrays,
- capabilities,
- eager_shape,
- in1d,
- jax_autojit,
- meta_namespace,
- ndindex,
- pickle_flatten,
- pickle_unflatten,
-)
-from array_api_extra._lib._utils._typing import Array, Device, DType
-from array_api_extra.testing import assert_equal, lazy_xp_function
-
-from .conftest import np_compat
-
-if TYPE_CHECKING: # pragma: no cover
- # TODO import from typing (requires Python >=3.12)
- from typing_extensions import override
-else:
-
- def override(func):
- return func
-
-
-T = TypeVar("T")
-
-# FIXME calls xp.unique_values without size
-lazy_xp_function(in1d, jax_jit=False)
-
-
-@pytest.mark.xfail_xp_backend(Backend.SPARSE, reason="no unique_inverse")
-@pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="no unique_inverse")
-class TestIn1D:
- # cover both code paths
- @pytest.mark.parametrize(
- "n",
- [
- pytest.param(9, id="fast path"),
- pytest.param(
- 15,
- id="slow path",
- marks=pytest.mark.xfail_xp_backend(
- Backend.DASK, reason="NaN-shaped array"
- ),
- ),
- ],
- )
- def test_no_invert_assume_unique(self, xp: ModuleType, n: int):
- x1 = xp.asarray([3, 8, 20])
- x2 = xp.arange(n)
- expected = xp.asarray([True, True, False])
- actual = in1d(x1, x2)
- assert_equal(actual, expected)
-
- def test_device(self, xp: ModuleType, device: Device):
- x1 = xp.asarray([3, 8, 20], device=device)
- x2 = xp.asarray([2, 3, 4], device=device)
- assert get_device(in1d(x1, x2)) == device
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="xp=xp")
- def test_xp(self, xp: ModuleType):
- x1 = xp.asarray([1, 6])
- x2 = xp.asarray([0, 1, 2, 3, 4])
- expected = xp.asarray([True, False])
- actual = in1d(x1, x2, xp=xp)
- assert_equal(actual, expected)
-
-
-class TestAsArrays:
- @pytest.mark.parametrize(
- ("dtype", "b", "defined"),
- [
- # Well-defined cases of dtype promotion from Python scalar to Array
- # bool vs. bool
- ("bool", True, True),
- # int vs. xp.*int*, xp.float*, xp.complex*
- ("int16", 1, True),
- ("uint8", 1, True),
- ("float32", 1, True),
- ("float64", 1, True),
- ("complex64", 1, True),
- ("complex128", 1, True),
- # float vs. xp.float, xp.complex
- ("float32", 1.0, True),
- ("float64", 1.0, True),
- ("complex64", 1.0, True),
- ("complex128", 1.0, True),
- # complex vs. xp.complex
- ("complex64", 1.0j, True),
- ("complex128", 1.0j, True),
- # Undefined cases
- ("bool", 1, False),
- ("int64", 1.0, False),
- ("float64", 1.0j, False),
- ],
- )
- def test_array_vs_scalar(
- self, dtype: str, b: complex, defined: bool, xp: ModuleType
- ):
- a = xp.asarray(1, dtype=getattr(xp, dtype))
-
- xa, xb = asarrays(a, b, xp)
- assert xa.dtype == a.dtype
- if defined:
- assert xb.dtype == a.dtype
- else:
- assert xb.dtype == xp.asarray(b).dtype
-
- xbr, xar = asarrays(b, a, xp)
- assert xar.dtype == xa.dtype
- assert xbr.dtype == xb.dtype
-
- def test_scalar_vs_scalar(self, xp: ModuleType):
- a, b = asarrays(1, 2.2, xp=xp)
- assert a.dtype == xp.asarray(1).dtype # Default dtype
- assert b.dtype == xp.asarray(2.2).dtype # Default dtype; not broadcasted
-
- ALL_TYPES: tuple[str, ...] = (
- "int8",
- "int16",
- "int32",
- "int64",
- "uint8",
- "uint16",
- "uint32",
- "uint64",
- "float32",
- "float64",
- "complex64",
- "complex128",
- "bool",
- )
-
- @pytest.mark.parametrize("a_type", ALL_TYPES)
- @pytest.mark.parametrize("b_type", ALL_TYPES)
- def test_array_vs_array(self, a_type: str, b_type: str, xp: ModuleType):
- """
- Test that when both inputs of asarray are already Array API objects,
- they are returned unchanged.
- """
- a = xp.asarray(1, dtype=getattr(xp, a_type))
- b = xp.asarray(1, dtype=getattr(xp, b_type))
- xa, xb = asarrays(a, b, xp)
- assert xa.dtype == a.dtype
- assert xb.dtype == b.dtype
-
- @pytest.mark.parametrize("dtype", [np.float64, np.complex128])
- def test_numpy_generics(self, dtype: DType):
- """
- Test special case of np.float64 and np.complex128,
- which are subclasses of float and complex.
- """
- a = cast(Array, dtype(0)) # type: ignore[operator] # pyright: ignore[reportCallIssue]
- xa, xb = asarrays(a, 0, xp=np_compat)
- assert xa.dtype == dtype
- assert xb.dtype == dtype
-
-
-@pytest.mark.parametrize(
- "shape", [(), (1,), (5,), (2, 3), (5, 3, 8), (0,), (3, 0), (0, 0, 1)]
-)
-def test_ndindex(shape: tuple[int, ...]):
- assert tuple(ndindex(*shape)) == tuple(np.ndindex(*shape))
-
-
-@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="index by sparse array")
-@pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="boolean indexing")
-def test_eager_shape(xp: ModuleType, library: Backend):
- a = xp.asarray([1, 2, 3])
- # Lazy arrays, like Dask, have an eager shape until you slice them with
- # a lazy boolean mask
- assert eager_shape(a) == a.shape == (3,)
- assert eager_shape(a, axis=0) == a.shape == (3,)
-
- b = a[a > 2]
- if library is Backend.DASK:
- with pytest.raises(TypeError, match="Unsupported lazy shape"):
- _ = eager_shape(b)
- with pytest.raises(TypeError, match="Unsupported lazy shape"):
- _ = eager_shape(b, axis=0)
- # FIXME can't test use case for None in the shape until we add support for
- # other lazy backends
- else:
- assert eager_shape(b) == b.shape == (1,)
-
-
-class TestMetaNamespace:
- @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY, reason="namespace tests")
- def test_basic(self, xp: ModuleType, library: Backend):
- args = None, xp.asarray(0), 1
- expect = np_compat if library is Backend.DASK else xp
- assert meta_namespace(*args) is expect
-
- def test_dask_metas(self, da: ModuleType):
- cp = pytest.importorskip("cupy")
- cp_compat = array_namespace(cp.empty(0))
- args = None, da.from_array(cp.asarray(0)), 1
- assert meta_namespace(*args) is cp_compat
-
- def test_xp(self, xp: ModuleType):
- args = None, xp.asarray(0), 1
- assert meta_namespace(*args, xp=xp) in (xp, np_compat)
-
-
-class TestCapabilities:
- def test_basic(self, xp: ModuleType):
- expect = {"boolean indexing", "data-dependent shapes"}
- if xp.__array_api_version__ >= "2024.12":
- expect.add("max dimensions")
- assert capabilities(xp).keys() == expect
-
- def test_device(self, xp: ModuleType, library: Backend, device: Device):
- expect_keys = {"boolean indexing", "data-dependent shapes"}
- if xp.__array_api_version__ >= "2024.12":
- expect_keys.add("max dimensions")
- assert capabilities(xp, device=device).keys() == expect_keys
-
- if library.like(Backend.TORCH):
- # The output of capabilities is device-specific.
-
- # Test that device=None gets the current default device.
- expect = capabilities(xp, device=device)
- with xp.device(device):
- actual = capabilities(xp)
- assert actual == expect
-
- # Test that we're accepting anything that is accepted by the
- # device= parameter in other functions
- actual = capabilities(xp, device=device.type) # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-
-
-class Wrapper(Generic[T]): # noqa: PLW1641
- """Trivial opaque wrapper. Must be pickleable."""
-
- x: T
- # __slots__ make this object serializable with __reduce_ex__(5),
- # but not with __reduce__
- __slots__: tuple[str, ...] = ("x",)
-
- def __init__(self, x: T):
- self.x = x
-
- # Note: this makes the object not hashable
- @override
- def __eq__(self, other: object) -> bool:
- return isinstance(other, Wrapper) and self.x == other.x
-
-
-class TestPickleFlatten:
- def test_roundtrip(self):
- class NotSerializable:
- @override
- def __reduce__(self) -> tuple[object, ...]:
- raise NotImplementedError()
-
- # Note: NotHashable() instances can be reduced to an
- # unserializable local class
- class NotHashable: # noqa: PLW1641
- @override
- def __eq__(self, other: object) -> bool:
- return isinstance(other, type(self)) and other.__dict__ == self.__dict__
-
- with pytest.raises(TypeError):
- _ = hash(NotHashable())
-
- # Extracted objects need be neither pickleable nor serializable
- class C(NotSerializable, NotHashable):
- x: int
-
- def __init__(self, x: int):
- self.x = x
-
- class D(C):
- pass
-
- c1 = C(1)
- c2 = C(2)
- d3 = D(3)
-
- # An assorted bunch of opaque containers, standard containers,
- # non-serializable objects, and non-hashable objects (but not at the same time)
- obj = Wrapper([1, c1, {2: (c2, {NotSerializable()})}, NotHashable(), d3])
- instances, rest = pickle_flatten(obj, C)
-
- assert instances == [c1, c2, d3]
- obj2 = pickle_unflatten(instances, rest)
- assert obj2 == obj
-
- def test_swap_objects(self):
- class C:
- pass
-
- obj = [1, C(), {2: (C(), {C()})}]
- _, rest = pickle_flatten(obj, C)
- obj2 = pickle_unflatten(["foo", "bar", "baz"], rest)
- assert obj2 == [1, "foo", {2: ("bar", {"baz"})}]
-
- def test_multi_class(self):
- class C:
- pass
-
- class D:
- pass
-
- c, d = C(), D()
- instances, _ = pickle_flatten([c, d], (C, D))
- assert len(instances) == 2
- assert instances[0] is c
- assert instances[1] is d
-
- def test_no_class(self):
- obj = {1: "foo", 2: (3, 4)}
- instances, rest = pickle_flatten(obj, ()) # type: ignore[var-annotated]
- assert instances == []
- obj2 = pickle_unflatten([], rest)
- assert obj2 == obj
-
- def test_flattened_stream(self):
- """
- Test that multiple calls to flatten() can feed into the same stream of instances
- """
- obj1 = Wrapper(1)
- obj2 = [Wrapper(2), Wrapper(3)]
- instances1, rest1 = pickle_flatten(obj1, Wrapper)
- instances2, rest2 = pickle_flatten(obj2, Wrapper)
- it = iter(instances1 + instances2 + [Wrapper(4)])
- assert pickle_unflatten(it, rest1) == obj1
- assert pickle_unflatten(it, rest2) == obj2
- assert list(it) == [Wrapper(4)]
-
- def test_too_short(self):
- obj = [Wrapper(1), Wrapper(2)]
- instances, rest = pickle_flatten(obj, Wrapper)
- with pytest.raises(ValueError, match="Not enough"):
- pickle_unflatten(instances[:1], rest)
-
- def test_recursion(self):
- obj: list[object] = [Wrapper(1)]
- obj.append(obj)
-
- instances, rest = pickle_flatten(obj, Wrapper)
- assert instances == [Wrapper(1)]
-
- obj2 = pickle_unflatten(instances, rest)
- assert len(obj2) == 2
- assert obj2[0] is obj[0]
- assert obj2[1] is obj2
-
-
-class TestJAXAutoJIT:
- def test_basic(self, jnp: ModuleType):
- @jax_autojit
- def f(x: Array, k: object = False) -> Array:
- return x + 1 if k else x - 1
-
- # Basic recognition of static_argnames
- assert_equal(f(jnp.asarray([1, 2])), jnp.asarray([0, 1]))
- assert_equal(f(jnp.asarray([1, 2]), False), jnp.asarray([0, 1]))
- assert_equal(f(jnp.asarray([1, 2]), True), jnp.asarray([2, 3]))
- assert_equal(f(jnp.asarray([1, 2]), 1), jnp.asarray([2, 3]))
-
- # static argument is not an ArrayLike
- assert_equal(f(jnp.asarray([1, 2]), "foo"), jnp.asarray([2, 3]))
-
- # static argument is not hashable, but serializable
- assert_equal(f(jnp.asarray([1, 2]), ["foo"]), jnp.asarray([2, 3]))
-
- def test_wrapper(self, jnp: ModuleType):
- @jax_autojit
- def f(w: Wrapper[Array]) -> Wrapper[Array]:
- return Wrapper(w.x + 1)
-
- inp = Wrapper(jnp.asarray([1, 2]))
- out = f(inp).x
- assert_equal(out, jnp.asarray([2, 3]))
-
- def test_static_hashable(self, jnp: ModuleType):
- """Static argument/return value is hashable, but not serializable"""
-
- class C:
- def __reduce__(self) -> object: # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride,reportImplicitOverride]
- raise Exception()
-
- @jax_autojit
- def f(x: object) -> object:
- return x
-
- inp = C()
- out = f(inp)
- assert out is inp
-
- # Serializable opaque input contains non-serializable object plus array
- winp = Wrapper((C(), jnp.asarray([1, 2])))
- out = f(winp)
- assert isinstance(out, Wrapper)
- assert out.x[0] is winp.x[0]
- assert out.x[1] is not winp.x[1]
- assert_equal(out.x[1], winp.x[1])
-
- def test_arraylikes_are_static(self):
- pytest.importorskip("jax")
-
- @jax_autojit
- def f(x: list[int]) -> list[int]:
- assert isinstance(x, list)
- assert x == [1, 2]
- return [3, 4]
-
- out = f([1, 2])
- assert isinstance(out, list)
- assert out == [3, 4]
-
- def test_iterators(self, jnp: ModuleType):
- @jax_autojit
- def f(x: Array) -> Iterator[Array]:
- return (x + i for i in range(2))
-
- inp = jnp.asarray([1, 2])
- out = f(inp)
- assert isinstance(out, Iterator)
- assert_equal(next(out), jnp.asarray([1, 2]))
- assert_equal(next(out), jnp.asarray([2, 3]))
- with pytest.raises(StopIteration):
- _ = next(out)
diff --git a/tests/test_lazy.py b/tests/test_lazy.py
deleted file mode 100644
index ebd572ff..00000000
--- a/tests/test_lazy.py
+++ /dev/null
@@ -1,454 +0,0 @@
-import contextlib
-from types import ModuleType
-from typing import cast
-
-import numpy as np
-import pytest
-
-import array_api_extra as xpx # Let some tests bypass lazy_xp_function
-from array_api_extra import lazy_apply
-from array_api_extra._lib._backends import Backend
-from array_api_extra._lib._utils import _compat
-from array_api_extra._lib._utils._compat import array_namespace, is_dask_array
-from array_api_extra._lib._utils._helpers import eager_shape
-from array_api_extra._lib._utils._typing import Array, Device
-from array_api_extra.testing import assert_equal, lazy_xp_function
-
-lazy_xp_function(lazy_apply)
-
-as_numpy = pytest.mark.parametrize(
- "as_numpy",
- [
- False,
- pytest.param(
- True,
- marks=[
- pytest.mark.skip_xp_backend(Backend.CUPY, reason="device->host copy"),
- pytest.mark.skip_xp_backend(
- Backend.TORCH_GPU, reason="device->host copy"
- ),
- pytest.mark.skip_xp_backend(Backend.SPARSE, reason="densification"),
- ],
- ),
- ],
-)
-
-
-@as_numpy
-@pytest.mark.parametrize("shape", [(2,), (3, 2)])
-@pytest.mark.parametrize("dtype", ["int32", "float64"])
-def test_lazy_apply_simple(
- xp: ModuleType, library: Backend, shape: tuple[int, ...], dtype: str, as_numpy: bool
-):
- def f(x: Array) -> Array:
- xp2 = array_namespace(x)
- if as_numpy or library in (Backend.NUMPY_READONLY, Backend.DASK):
- assert isinstance(x, np.ndarray)
- else:
- assert xp2 is xp
-
- y = xp2.broadcast_to(xp2.astype(x + 1, getattr(xp2, dtype)), shape)
- return xp2.asarray(y, copy=True) # PyTorch: ensure writeable NumPy array
-
- x = xp.asarray([1, 2], dtype=xp.int16)
- expect = xp.broadcast_to(xp.astype(x + 1, getattr(xp, dtype)), shape)
- actual = lazy_apply(f, x, shape=shape, dtype=getattr(xp, dtype), as_numpy=as_numpy)
- assert_equal(actual, expect)
-
-
-@as_numpy
-def test_lazy_apply_broadcast(xp: ModuleType, as_numpy: bool):
- """Test that default shape and dtype are broadcasted from the inputs."""
-
- def f(x: Array, y: Array) -> Array:
- return x + y
-
- x = xp.asarray([1, 2], dtype=xp.int16)
- y = xp.asarray([[4], [5], [6]], dtype=xp.int32)
- z = lazy_apply(f, x, y, as_numpy=as_numpy)
- assert_equal(z, x + y)
-
-
-@as_numpy
-def test_lazy_apply_multi_output(xp: ModuleType, as_numpy: bool):
- def f(x: Array) -> tuple[Array, Array]:
- xp2 = array_namespace(x)
- y = x + xp2.asarray(2, dtype=xp2.int8) # Sparse: bad dtype propagation
- z = xp2.broadcast_to(xp2.astype(x + 1, xp2.int16), (3, 2))
- z = xp2.asarray(z, copy=True) # PyTorch: ensure writeable NumPy array
- return y, z
-
- x = xp.asarray([1, 2], dtype=xp.int8)
- expect = (
- xp.asarray([3, 4], dtype=xp.int8),
- xp.asarray([[2, 3], [2, 3], [2, 3]], dtype=xp.int16),
- )
- actual = lazy_apply(
- f, x, shape=((2,), (3, 2)), dtype=(xp.int8, xp.int16), as_numpy=as_numpy
- )
- assert isinstance(actual, tuple)
- assert len(actual) == 2
- assert_equal(actual[0], expect[0])
- assert_equal(actual[1], expect[1])
-
-
-@pytest.mark.parametrize(
- "as_numpy",
- [
- False,
- pytest.param(
- True,
- marks=[
- pytest.mark.skip_xp_backend(Backend.CUPY, reason="device->host copy"),
- pytest.mark.skip_xp_backend(
- Backend.TORCH_GPU, reason="device->host copy"
- ),
- pytest.mark.skip_xp_backend(Backend.SPARSE, reason="densification"),
- ],
- ),
- ],
-)
-def test_lazy_apply_multi_output_broadcast_dtype(xp: ModuleType, as_numpy: bool):
- """
- If dtype is omitted and there are multiple shapes, use the same
- dtype for all output arrays, broadcasted from the inputs
- """
-
- def f(x: Array, y: Array) -> tuple[Array, Array]:
- return x + y, x - y
-
- x = xp.asarray([1, 2], dtype=xp.float32)
- y = xp.asarray([3], dtype=xp.float64)
- expect = (
- xp.asarray([4, 5], dtype=xp.float64),
- xp.asarray([-2, -1], dtype=xp.float64),
- )
- actual = lazy_apply(f, x, y, shape=((2,), (2,)), as_numpy=as_numpy)
- assert isinstance(actual, tuple)
- assert len(actual) == 2
- assert_equal(actual[0], expect[0])
- assert_equal(actual[1], expect[1])
-
-
-def test_lazy_apply_core_indices(da: ModuleType):
- """
- Test that a function that performs reductions along axes does so
- globally and not locally to each Dask chunk.
- """
-
- def f(x: Array) -> Array:
- xp = array_namespace(x)
- return xp.sum(x, axis=0) + x
-
- x_np = cast(Array, np.arange(15).reshape(5, 3)) # pyright: ignore[reportInvalidCast]
- expect = da.asarray(f(x_np))
- x_da = da.asarray(x_np).rechunk(3)
-
- # A naive map_blocks fails because it applies f to each chunk separately,
- # but f needs to reduce along axis 0 which is broken into multiple chunks.
- # axis 0 is a "core axis" or "core index" (from xarray.apply_ufunc's
- # "core dimension").
- with pytest.raises(AssertionError):
- assert_equal(da.map_blocks(f, x_da), expect)
-
- assert_equal(lazy_apply(f, x_da), expect)
-
-
-def test_lazy_apply_dont_run_on_meta(da: ModuleType):
- """Test that Dask won't try running func on the meta array,
- as it may have minimum size requirements.
- """
-
- def f(x: Array) -> Array:
- assert x.size
- return x + 1
-
- x = da.arange(10)
- assert not x._meta.size
- y = lazy_apply(f, x)
- assert_equal(y, x + 1)
-
-
-def test_lazy_apply_dask_non_numpy_meta(da: ModuleType):
- """Test Dask wrapping around a meta-namespace other than numpy."""
- # At the moment of writing, of all Array API namespaces CuPy is
- # the only one that Dask supports.
- # For this reason, we can only test as_numpy=False since
- # np.asarray(cp.Array) is blocked by the transfer guard.
-
- cp = pytest.importorskip("cupy")
- cp = array_namespace(cp.empty(0))
- x_cp = cp.asarray([1, 2, 3])
- x_da = da.asarray([1, 2, 3]).map_blocks(cp.asarray)
- assert array_namespace(x_da._meta) is cp
-
- def f(x: Array) -> Array:
- return x + 1
-
- y = lazy_apply(f, x_da)
- assert array_namespace(y._meta) is cp # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
- assert_equal(y.compute(), x_cp + 1) # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-
-
-def test_dask_key(da: ModuleType):
- """Test that the function name is visible on the Dask dashboard and in metrics."""
-
- def helloworld(x: Array) -> Array:
- return x + 1
-
- x = da.asarray([1, 2])
- # Use full namespace to bypass monkey-patching by lazy_xp_function,
- # which calls persist() to materialize exceptions and warnings and in
- # doing so squashes the graph.
- y = xpx.lazy_apply(helloworld, x)
-
- prefixes = set()
- for key in y.__dask_graph__(): # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
- name = key[0] if isinstance(key, tuple) else key
- assert isinstance(name, str)
- prefixes.add(name.split("-")[0])
-
- assert "helloworld" in prefixes
-
-
-def test_lazy_apply_none_shape_in_args(xp: ModuleType, library: Backend):
- x = xp.asarray([1, 1, 2, 2, 2])
-
- # TODO mxp = meta_namespace(x, xp=xp)
- mxp = np if library is Backend.DASK else xp
- int_type = xp.asarray(0).dtype
-
- ctx: (
- contextlib.AbstractContextManager[object]
- | contextlib.AbstractContextManager[None]
- )
- if library.like(Backend.JAX):
- ctx = pytest.raises(ValueError, match="Output shape must be fully known")
- elif library is Backend.ARRAY_API_STRICTEST:
- ctx = pytest.raises(RuntimeError, match="data-dependent shapes")
- else:
- ctx = contextlib.nullcontext()
-
- # Single output
- with ctx:
- values = lazy_apply(mxp.unique_values, x, shape=(None,))
- assert_equal(xp.sort(values), xp.asarray([1, 2]))
-
- with ctx:
- # Multi output
- values, counts = lazy_apply(
- mxp.unique_counts,
- x,
- shape=((None,), (None,)),
- dtype=(x.dtype, int_type),
- )
- assert_equal(values, xp.asarray([1, 2]))
- assert_equal(counts, xp.asarray([2, 3]))
-
-
-def check_lazy_apply_none_shape_broadcast(x: Array) -> Array:
- def f(x: Array) -> Array:
- return x
-
- x = x[x > 1]
- # Use explicit namespace to bypass monkey-patching by lazy_xp_function
- return xpx.lazy_apply(f, x)
-
-
-lazy_xp_function(check_lazy_apply_none_shape_broadcast)
-
-
-@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="index by sparse array")
-@pytest.mark.skip_xp_backend(Backend.JAX, reason="boolean indexing")
-@pytest.mark.skip_xp_backend(Backend.JAX_GPU, reason="boolean indexing")
-@pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="boolean indexing")
-def test_lazy_apply_none_shape_broadcast(xp: ModuleType):
- """Broadcast from input array with unknown shape"""
- x = xp.asarray([1, 2, 2])
- actual = check_lazy_apply_none_shape_broadcast(x)
- assert_equal(actual, xp.asarray([2, 2]))
-
-
-@pytest.mark.parametrize(
- "as_numpy",
- [
- False,
- pytest.param(
- True,
- marks=[
- pytest.mark.skip_xp_backend(
- Backend.ARRAY_API_STRICT, reason="device->host copy"
- ),
- pytest.mark.skip_xp_backend(Backend.CUPY, reason="device->host copy"),
- pytest.mark.skip_xp_backend(
- Backend.TORCH, reason="materialize 'meta' device"
- ),
- pytest.mark.skip_xp_backend(
- Backend.TORCH_GPU, reason="device->host copy"
- ),
- pytest.mark.skip_xp_backend(Backend.SPARSE, reason="densification"),
- ],
- ),
- ],
-)
-def test_lazy_apply_device(xp: ModuleType, as_numpy: bool, device: Device):
- def f(x: Array) -> Array:
- xp2 = array_namespace(x)
- # Deliberately forgetting to add device here to test that the
- # output is transferred to the right device. This is necessary when
- # as_numpy=True anyway.
- return xp2.zeros(x.shape, dtype=x.dtype)
-
- x = xp.asarray([1, 2], device=device)
- y = lazy_apply(f, x, as_numpy=as_numpy)
- assert _compat.device(y) == device
-
-
-def test_lazy_apply_arraylike(xp: ModuleType):
- """Wrapped func returns an array-like"""
- x = xp.asarray([1, 2, 3])
-
- # Single output
- def f(x: Array) -> int:
- shape = eager_shape(x)
- return shape[0]
-
- expect = xp.asarray(3)
- actual = lazy_apply(f, x, shape=(), dtype=expect.dtype)
- assert_equal(actual, expect)
-
- # Multi output
- def g(x: Array) -> tuple[int, list[int]]:
- shape = eager_shape(x)
- return shape[0], list(shape)
-
- actual2 = lazy_apply(g, x, shape=((), (1,)), dtype=(expect.dtype, expect.dtype))
- assert_equal(actual2[0], xp.asarray(3))
- assert_equal(actual2[1], xp.asarray([3]))
-
-
-def test_lazy_apply_scalars_and_nones(xp: ModuleType, library: Backend):
- def f(x: Array, y: None, z: int | Array) -> Array:
- mxp = array_namespace(x, y, z)
- mtyp = type(mxp.asarray(0))
- assert isinstance(x, mtyp)
- assert y is None
- # jax.pure_callback wraps scalar args
- assert isinstance(z, mtyp if library.like(Backend.JAX) else int)
- return x + z
-
- x = xp.asarray([1, 2])
- w = lazy_apply(f, x, None, 3)
- assert_equal(w, x + 3)
-
-
-def check_lazy_apply_kwargs(x: Array, expect_cls: type, as_numpy: bool) -> Array:
- is_dask = is_dask_array(x)
- recursive: list[object] = []
- if not is_dask: # dask.delayed crashes on recursion
- recursive.append(recursive)
-
- def eager(
- x: Array,
- z: dict[int, list[int]],
- msg: str,
- msgs: list[str],
- scalar: int,
- recursive: list[list[object]],
- ) -> Array:
- assert isinstance(x, expect_cls)
- # JAX will crash if x isn't material
- assert int(x) == 0
- # Did we re-wrap the namedtuple correctly, or did it get
- # accidentally changed to a basic tuple?
- assert z == {0: [1, 2]}
- assert msg == "Hello World" # must be hidden from JAX
- assert msgs[0] == "Hello World" # must be hidden from JAX
- assert isinstance(msg, str)
- assert isinstance(msgs[0], str)
- assert scalar == 1 # must be hidden from JAX
- assert isinstance(scalar, int)
- assert isinstance(recursive, list)
- if not is_dask:
- assert recursive[0][0] is recursive[0]
- return x + 1
-
- # Use explicit namespace to bypass monkey-patching by lazy_xp_function
- return xpx.lazy_apply( # pyright: ignore[reportCallIssue]
- eager,
- x,
- z={0: [1, 2]},
- msg="Hello World",
- msgs=["Hello World"],
- # This will be automatically cast to jax.Array if we don't wrap it
- scalar=1,
- recursive=recursive,
- shape=x.shape,
- dtype=x.dtype,
- as_numpy=as_numpy,
- )
-
-
-lazy_xp_function(check_lazy_apply_kwargs)
-
-
-@as_numpy
-def test_lazy_apply_kwargs(xp: ModuleType, library: Backend, as_numpy: bool):
- """When as_numpy=True, search and replace arrays in the (nested) keywords arguments
- with numpy arrays, and leave the rest untouched."""
- x = xp.asarray(0)
- expect_cls = np.ndarray if as_numpy or library is Backend.DASK else type(x)
- actual = check_lazy_apply_kwargs(x, expect_cls, as_numpy)
- assert_equal(actual, x + 1)
-
-
-class CustomError(Exception):
- pass
-
-
-def raises(x: Array) -> Array:
- def eager(_: Array) -> Array:
- msg = "Hello World"
- raise CustomError(msg)
-
- # Use explicit namespace to bypass monkey-patching by lazy_xp_function
- return xpx.lazy_apply(eager, x, shape=x.shape, dtype=x.dtype)
-
-
-# jax.pure_callback does not support raising
-# https://github.com/jax-ml/jax/issues/26102
-lazy_xp_function(raises, jax_jit=False)
-
-
-def test_lazy_apply_raises(xp: ModuleType):
- """
- See Also: test_testing.py::test_lazy_xp_function_eagerly_raises
- """
- x = xp.asarray(0)
-
- with pytest.raises(CustomError, match="Hello World"):
- # Here we are disregarding the return value, which would
- # normally cause the graph not to materialize and the
- # exception not to be raised.
- # However, lazy_xp_function will do it for us on function exit.
- _ = raises(x)
-
-
-def test_invalid_args():
- def f(x: Array) -> Array:
- return x
-
- x = np.asarray(1)
-
- with pytest.raises(ValueError, match="at least one argument array"):
- _ = lazy_apply(f, shape=(1,), dtype=np.int32, xp=np)
- with pytest.raises(ValueError, match="at least one argument array"):
- _ = lazy_apply(f, 1, shape=(1,), dtype=np.int32, xp=np)
- with pytest.raises(ValueError, match="at least one argument array"):
- _ = lazy_apply(f, shape=(1,), dtype=np.int32)
- with pytest.raises(ValueError, match="multiple shapes but only one dtype"):
- _ = lazy_apply(f, x, shape=[(1,), (2,)], dtype=np.int32) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
- with pytest.raises(ValueError, match="single shape but multiple dtypes"):
- _ = lazy_apply(f, x, shape=(1,), dtype=[np.int32, np.int64]) # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
- with pytest.raises(ValueError, match="2 shapes and 1 dtypes"):
- _ = lazy_apply(f, x, shape=[(1,), (2,)], dtype=[np.int32]) # type: ignore[arg-type] # pyright: ignore[reportCallIssue,reportArgumentType]
diff --git a/tests/test_testing.py b/tests/test_testing.py
deleted file mode 100644
index 84ee5ba3..00000000
--- a/tests/test_testing.py
+++ /dev/null
@@ -1,682 +0,0 @@
-import sys
-from collections.abc import Callable, Iterator
-from types import ModuleType
-from typing import Any, cast, final
-
-import numpy as np
-import pytest
-from typing_extensions import override
-
-from array_api_extra._lib._backends import Backend
-from array_api_extra._lib._utils._compat import (
- array_namespace,
- is_dask_namespace,
- is_jax_namespace,
-)
-from array_api_extra._lib._utils._typing import Array, Device
-from array_api_extra.testing import (
- _as_numpy_array,
- assert_close,
- assert_close_nulp,
- assert_equal,
- assert_less,
- lazy_xp_function,
- patch_lazy_xp_functions,
-)
-
-# pyright: reportUnknownParameterType=false,reportMissingParameterType=false
-
-
-class TestAsNumPyArray:
- def test_basic(self, xp: ModuleType):
- x = xp.asarray([1, 2, 3])
- y = _as_numpy_array(x, xp=xp)
- assert_equal(y, np.asarray([1, 2, 3])) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
- @pytest.mark.skip_xp_backend(Backend.TORCH, reason="materialize 'meta' device")
- def test_device(self, xp: ModuleType, device: Device):
- x = xp.asarray([1, 2, 3], device=device)
- y = _as_numpy_array(x, xp=xp)
- assert_equal(y, np.asarray([1, 2, 3])) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
-
-class TestAssertEqualCloseLess:
- def np_err_msg(self, func: object):
- return "not equal" if func is assert_close_nulp else "Mismatched elements"
-
- @pytest.mark.parametrize("func", [assert_equal, assert_close])
- def test_assert_equal_close_basic(self, xp: ModuleType, func: Callable[..., None]):
- func(xp.asarray(0), xp.asarray(0))
- func(xp.asarray([1, 2]), xp.asarray([1, 2]))
-
- with pytest.raises(AssertionError, match="Mismatched elements"):
- func(xp.asarray([1, 2]), xp.asarray([2, 1]))
-
- with pytest.raises(AssertionError, match="hello"):
- func(xp.asarray([1, 2]), xp.asarray([2, 1]), err_msg="hello")
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- def test_shape_dtype(self, xp: ModuleType, func: Callable[..., None]):
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(xp.asarray([0]), xp.asarray([[0]]))
-
- with pytest.raises(AssertionError, match="dtypes do not match"):
- func(xp.asarray(0, dtype=xp.float32), xp.asarray(0, dtype=xp.float64))
-
- @pytest.mark.skip_xp_backend(Backend.NUMPY, reason="test other ns vs. numpy")
- @pytest.mark.skip_xp_backend(
- Backend.NUMPY_READONLY, reason="test other ns vs. numpy"
- )
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- def test_namespace(self, xp: ModuleType, func: Callable[..., None]):
- with pytest.raises(
- AssertionError, match="Namespaces of actual and desired arrays do not match"
- ):
- func(xp.asarray(0), np.asarray(0))
- with pytest.raises(TypeError, match=r"array_namespace requires .* array input"):
- func(xp.asarray(0), 0)
- with pytest.raises(TypeError, match="list is not a supported array type"):
- func(xp.asarray([0]), [0])
- func(xp.asarray(0), xp.asarray(1 if func is assert_less else 0), xp=xp)
- with (
- pytest.raises(
- AssertionError,
- match="Namespace of actual array does not match the `xp` argument",
- ),
- ):
- func(xp.asarray(0), xp.asarray(0), xp=np)
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- def test_check_shape(self, xp: ModuleType, func: Callable[..., None]):
- a = xp.asarray([1] if func is assert_less else [2])
- b = xp.asarray(2)
- c = xp.asarray(0)
- d = xp.asarray([2, 2])
-
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(a, b)
- func(a, b, check_shape=False)
- with pytest.raises(AssertionError, match=self.np_err_msg(func)):
- func(a, c, check_shape=False)
- with pytest.raises(AssertionError, match="sizes do not match"):
- func(a, d, check_shape=False)
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- def test_check_dtype(self, xp: ModuleType, func: Callable[..., None]):
- a = xp.asarray(1 if func is assert_less else 2)
- b = xp.asarray(2, dtype=xp.int16)
- c = xp.asarray(0, dtype=xp.int16)
-
- with pytest.raises(AssertionError, match="dtypes do not match"):
- func(a, b)
- func(a, b, check_dtype=False)
- with pytest.raises(AssertionError, match=self.np_err_msg(func)):
- func(a, c, check_dtype=False)
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- @pytest.mark.xfail_xp_backend(
- Backend.SPARSE, reason="sparse [()] returns np.generic"
- )
- def test_check_scalar(
- self, xp: ModuleType, library: Backend, func: Callable[..., None]
- ):
- a = xp.asarray(1 if func is assert_less else 2)
- b = xp.asarray(2)[()] # Note: only makes a difference on NumPy
- c = xp.asarray(0)
-
- func(a, b)
- if library.like(Backend.NUMPY):
- with pytest.raises(AssertionError, match="array-ness does not match"):
- func(a, b, check_scalar=True)
- else:
- func(a, b, check_scalar=True)
- with pytest.raises(AssertionError, match=self.np_err_msg(func)):
- func(a, c, check_scalar=True)
-
- @pytest.mark.parametrize("dtype", ["int64", "float64"])
- def test_assert_close_tolerance(self, dtype: str, xp: ModuleType):
- a = xp.asarray([100], dtype=getattr(xp, dtype))
- b = xp.asarray([102], dtype=getattr(xp, dtype))
-
- with pytest.raises(AssertionError, match="Mismatched elements"):
- assert_close(a, b)
-
- assert_close(a, b, rtol=0.03)
- with pytest.raises(AssertionError, match="Mismatched elements"):
- assert_close(a, b, rtol=0.01)
-
- assert_close(a, b, atol=3)
- with pytest.raises(AssertionError, match="Mismatched elements"):
- assert_close(a, b, atol=1)
-
- def test_assert_less(self, xp: ModuleType):
- assert_less(xp.asarray(-1), xp.asarray(0))
- assert_less(xp.asarray([1, 2]), xp.asarray([2, 3]))
- with pytest.raises(AssertionError, match="Mismatched elements"):
- assert_less(xp.asarray([1, 1]), xp.asarray([2, 1]))
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="index by sparse array")
- @pytest.mark.skip_xp_backend(Backend.ARRAY_API_STRICTEST, reason="boolean indexing")
- def test_none_shape(self, xp: ModuleType, func: Callable[..., None]):
- """On Dask and other lazy backends, test that a shape with NaN's or None's
- can be compared to a real shape.
- """
- # actual has shape=(None, )
- a = xp.asarray([1] if func is assert_less else [2])
- a = a[a > 0]
-
- func(a, xp.asarray([2]))
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(a, xp.asarray(2))
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(a, xp.asarray([2, 3]))
- with pytest.raises(AssertionError, match=self.np_err_msg(func)):
- func(a, xp.asarray([0]))
-
- # desired has shape=(None, )
- a = xp.asarray([3] if func is assert_less else [2])
- a = a[a > 0]
-
- func(xp.asarray([2]), a)
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(xp.asarray(2), a)
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(xp.asarray([2, 3]), a)
- with pytest.raises(AssertionError, match=self.np_err_msg(func)):
- func(xp.asarray([4]), a)
-
- @pytest.mark.parametrize(
- "func", [assert_equal, assert_close, assert_less, assert_close_nulp]
- )
- def test_device(self, xp: ModuleType, device: Device, func: Callable[..., None]):
- a = xp.asarray([1] if func is assert_less else [2], device=device)
- b = xp.asarray([2], device=device)
- c = xp.asarray([2, 2], device=device)
-
- func(a, b)
- with pytest.raises(AssertionError, match="shapes do not match"):
- func(a, c)
- # This is normally performed by np.testing.assert_array_equal etc.
- # but in case of torch device='meta' we have to do it manually
- with pytest.raises(AssertionError, match="sizes do not match"):
- func(a, c, check_shape=False)
-
- def test_assert_close_nulp(self, xp: ModuleType):
- a = xp.asarray([1.0, 1e-10], dtype=xp.float64)
- b = xp.asarray([1.0 + 2**-52, 1e-10], dtype=xp.float64)
-
- assert_close_nulp(a, a, nulp=0)
-
- assert_close_nulp(a, b, nulp=2)
- assert_close_nulp(a, b, nulp=1)
- with pytest.raises(AssertionError, match="not equal to 0 ULP"):
- assert_close_nulp(a, b, nulp=0)
-
- c = xp.asarray([1.0 + 2 * 2**-52, 1e-10], dtype=xp.float64)
-
- assert_close_nulp(a, c, nulp=3)
- assert_close_nulp(a, c, nulp=2)
- with pytest.raises(AssertionError, match="not equal to 1 ULP"):
- assert_close_nulp(a, c)
-
- d = xp.asarray([1.0, 1e-10 + 5 * np.spacing(1e-10)], dtype=xp.float64)
- assert_close_nulp(a, d, nulp=6)
- assert_close_nulp(a, d, nulp=5)
-
- with pytest.raises(AssertionError, match="not equal to 4 ULP"):
- assert_close_nulp(a, d, nulp=4)
-
-
-def good_lazy(x: Array) -> Array:
- """A function that behaves well in Dask and jax.jit"""
- return x * 2.0
-
-
-def non_materializable(x: Array) -> Array:
- """
- This function materializes the input array, so it will fail when wrapped in jax.jit
- and it will trigger an expensive computation in Dask.
- """
- xp = array_namespace(x)
- # Crashes inside jax.jit
- # On Dask, this triggers two computations of the whole graph
- if xp.any(x < 0.0) or xp.any(x > 10.0):
- msg = "Values must be in the [0, 10] range"
- raise ValueError(msg)
- return x
-
-
-def non_materializable2(x: Array) -> Array:
- return non_materializable(x)
-
-
-def non_materializable3(x: Array) -> Array:
- return non_materializable(x)
-
-
-def non_materializable4(x: Array) -> Array:
- return non_materializable(x)
-
-
-def non_materializable5(x: Array) -> Array:
- return non_materializable(x)
-
-
-lazy_xp_function(good_lazy)
-# Works on JAX and Dask
-lazy_xp_function(non_materializable2, jax_jit=False, allow_dask_compute=2)
-lazy_xp_function(non_materializable3, jax_jit=False, allow_dask_compute=True)
-# Works on JAX, but not Dask
-lazy_xp_function(non_materializable4, jax_jit=False, allow_dask_compute=1)
-# Works neither on Dask nor JAX
-lazy_xp_function(non_materializable5)
-
-
-def test_lazy_xp_function(xp: ModuleType):
- x = xp.asarray([1.0, 2.0])
-
- assert_equal(good_lazy(x), xp.asarray([2.0, 4.0]))
- # Not wrapped
- assert_equal(non_materializable(x), xp.asarray([1.0, 2.0]))
- # Wrapping explicitly disabled
- assert_equal(non_materializable2(x), xp.asarray([1.0, 2.0]))
- assert_equal(non_materializable3(x), xp.asarray([1.0, 2.0]))
-
- if is_jax_namespace(xp):
- assert_equal(non_materializable4(x), xp.asarray([1.0, 2.0]))
- with pytest.raises(
- TypeError, match="Attempted boolean conversion of traced array"
- ):
- _ = non_materializable5(x) # Wrapped
-
- elif is_dask_namespace(xp):
- with pytest.raises(
- AssertionError,
- match=r"dask\.compute.* 2 times, but only up to 1 calls are allowed",
- ):
- _ = non_materializable4(x)
- with pytest.raises(
- AssertionError,
- match=r"dask\.compute.* 1 times, but no calls are allowed",
- ):
- _ = non_materializable5(x)
-
- else:
- assert_equal(non_materializable4(x), xp.asarray([1.0, 2.0]))
- assert_equal(non_materializable5(x), xp.asarray([1.0, 2.0]))
-
-
-def static_params(x: Array, n: int, flag: bool = False) -> Array:
- """Function with static parameters that must not be jitted"""
- if flag and n > 0: # This fails if n or flag are jitted arrays
- return x * 2.0
- return x * 3.0
-
-
-lazy_xp_function(static_params)
-
-
-def test_lazy_xp_function_static_params(xp: ModuleType):
- x = xp.asarray([1.0, 2.0])
- assert_equal(static_params(x, 1), xp.asarray([3.0, 6.0]))
- assert_equal(static_params(x, 1, True), xp.asarray([2.0, 4.0]))
- assert_equal(static_params(x, 1, False), xp.asarray([3.0, 6.0]))
- assert_equal(static_params(x, 0, False), xp.asarray([3.0, 6.0]))
- assert_equal(static_params(x, 1, flag=True), xp.asarray([2.0, 4.0]))
- assert_equal(static_params(x, n=1, flag=True), xp.asarray([2.0, 4.0]))
-
-
-def test_lazy_xp_function_deprecated_static_argnames():
- with pytest.warns(DeprecationWarning, match="static_argnames"):
- lazy_xp_function(static_params, static_argnames=["flag"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
- with pytest.warns(DeprecationWarning, match="static_argnums"):
- lazy_xp_function(static_params, static_argnums=[1]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
-
-
-try:
- # Test an arbitrary Cython ufunc (@cython.vectorize).
- # When SCIPY_ARRAY_API is not set, this is the same as
- # scipy.special.erf.
- from scipy.special._ufuncs import erf # type: ignore[import-untyped]
-
- lazy_xp_function(erf)
-except ImportError:
- erf = None
-
-
-@pytest.mark.skip_xp_backend(Backend.TORCH_GPU, reason="device->host copy")
-@pytest.mark.filterwarnings("ignore:__array_wrap__:DeprecationWarning") # PyTorch
-def test_lazy_xp_function_cython_ufuncs(xp: ModuleType, library: Backend):
- pytest.importorskip("scipy")
- assert erf is not None
- x = xp.asarray([6.0, 7.0])
- if library.like(Backend.ARRAY_API_STRICT, Backend.JAX):
- # array-api-strict arrays are auto-converted to NumPy
- # which results in an assertion error for mismatched namespaces
- # eager JAX arrays are auto-converted to NumPy in eager JAX
- # and fail in jax.jit (which lazy_xp_function tests here)
- with pytest.raises((TypeError, AssertionError)):
- assert_equal(cast(Array, erf(x)), xp.asarray([1.0, 1.0]))
- else:
- # CuPy, Dask and sparse define __array_ufunc__ and dispatch accordingly
- # note that when sparse reduces to scalar it returns a np.generic, which
- # would make assert_equal fail.
- assert_equal(cast(Array, erf(x)), xp.asarray([1.0, 1.0]))
-
-
-class A:
- def __init__(self, x: Array):
- xp = array_namespace(x)
- self._xp: ModuleType = xp
- self.x: Any = np.asarray(x)
-
- def f(self, y: Array) -> Array:
- return self._xp.asarray(np.matmul(self.x, np.asarray(y)))
-
- def g(self, y: Array, z: Array) -> Array:
- return self.f(y) + self.f(z)
-
- def h(self, y: Array) -> bool:
- return bool(self._xp.any(y))
-
-
-class B(A):
- @override
- def __init__(self, x: Array): # pyright: ignore[reportMissingSuperCall]
- xp = array_namespace(x)
- self._xp: ModuleType = xp
- self.x: Any = xp.asarray(x)
-
- @override
- def f(self, y: Array) -> Array:
- return self._xp.matmul(self.x, y)
-
- @staticmethod
- def k(y: Array) -> "B":
- return B(2.0 * y)
-
- @staticmethod
- def j(y: Array) -> "B":
- xp = array_namespace(y)
- y = xp.asarray(y)
- if bool(xp.any(y)):
- return B(y)
- return B(y + 1.0)
-
- @classmethod
- def w(cls, y: Array) -> "B":
- xp = array_namespace(y)
- y = xp.asarray(y)
- if bool(xp.any(y)):
- return B(y)
- return B(y + 1.0)
-
-
-@final
-class eager:
- # this needs to be a staticmethod to appease the type checker
- non_materializable5 = staticmethod(non_materializable5)
-
-
-lazy_xp_function((B, "g"))
-lazy_xp_function((B, "h"))
-lazy_xp_function((B, "k"))
-lazy_xp_function((B, "j"))
-lazy_xp_function((B, "w"))
-
-
-class TestLazyXpFunctionClasses:
- def test_parent_method_not_tagged(self):
- assert hasattr(B.g, "_lazy_xp_function")
- assert not hasattr(A.g, "_lazy_xp_function")
-
- @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="converts to NumPy")
- @pytest.mark.skip_xp_backend(Backend.CUPY, reason="converts to NumPy")
- @pytest.mark.skip_xp_backend(Backend.JAX_GPU, reason="converts to NumPy")
- @pytest.mark.skip_xp_backend(Backend.TORCH_GPU, reason="converts to NumPy")
- def test_lazy_xp_function_classes(self, xp: ModuleType, library: Backend):
- x = xp.asarray([1.1, 2.2, 3.3])
- y = xp.asarray([1.0, 2.0, 3.0])
- foo = A(x)
- bar = B(x)
-
- if library.like(Backend.JAX):
- with pytest.raises(
- TypeError, match="Attempted boolean conversion of traced array"
- ):
- assert bar.h(y)
-
- assert foo.h(y)
-
- def test_static_methods_preserved(self, xp: ModuleType):
- # Tests that static methods stay static methods when
- # lazy_xp_function is applied.
- x = xp.asarray([1.1, 2.2, 3.3])
- foo = B(x)
- bar = foo.k(x)
- assert_equal(bar.x, 2.0 * foo.x)
-
- @pytest.mark.skip_xp_backend(Backend.DASK, reason="calls dask.compute()")
- def test_static_methods_wrapped(self, xp: ModuleType, library: Backend):
- x = xp.asarray([1.1, 2.2, 3.3])
- foo = B(x)
-
- if library.like(Backend.JAX):
- with pytest.raises(
- TypeError, match="Attempted boolean conversion of traced array"
- ):
- assert isinstance(foo.j(x), B)
- else:
- assert isinstance(foo.j(x), B)
-
- @pytest.mark.skip_xp_backend(Backend.DASK, reason="calls dask.compute()")
- def test_class_methods_wrapped(self, xp: ModuleType, library: Backend):
- x = xp.asarray([1.1, 2.2, 3.3])
- if library.like(Backend.JAX):
- with pytest.raises(
- TypeError, match="Attempted boolean conversion of traced array"
- ):
- assert isinstance(B.w(x), B)
- else:
- assert isinstance(B.w(x), B)
-
- def test_circumvention(self, xp: ModuleType):
- x = xp.asarray([1.0, 2.0])
- y = eager.non_materializable5(x)
- assert_equal(y, x)
-
-
-def dask_raises(x: Array) -> Array:
- def _raises(x: Array) -> Array:
- # Test that map_blocks doesn't eagerly call the function;
- # dtype and meta should be sufficient to skip the trial run.
- assert x.shape == (3,)
- msg = "Hello world"
- raise ValueError(msg)
-
- return x.map_blocks(_raises, dtype=x.dtype, meta=x._meta) # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-
-
-lazy_xp_function(dask_raises)
-
-
-def test_lazy_xp_function_eagerly_raises(da: ModuleType):
- """Test that the pattern::
-
- with pytest.raises(Exception):
- func(x)
-
- works with Dask, even though it normally wouldn't as we're disregarding the func
- output so the graph would not be ordinarily materialized.
- lazy_xp_function contains ad-hoc code to materialize and reraise exceptions.
- """
- x = da.arange(3)
- with pytest.raises(ValueError, match="Hello world"):
- _ = dask_raises(x)
-
-
-class Wrapper:
- """Trivial opaque wrapper. Must be pickleable."""
-
- x: Array
-
- def __init__(self, x: Array):
- self.x = x
-
-
-def check_opaque_wrapper(w: Wrapper, xp: ModuleType) -> Wrapper:
- assert isinstance(w, Wrapper)
- assert array_namespace(w.x) == xp
- return Wrapper(w.x + 1)
-
-
-lazy_xp_function(check_opaque_wrapper)
-
-
-def test_lazy_xp_function_opaque_wrappers(xp: ModuleType):
- """
- Test that function input and output can be wrapped into arbitrary
- serializable Python objects, even if jax.jit does not support them.
- """
- x = xp.asarray([1, 2])
- xp2 = array_namespace(x) # Revert NUMPY_READONLY to array_api_compat.numpy
- res = check_opaque_wrapper(Wrapper(x), xp2)
- assert_equal(res.x, xp.asarray([2, 3]))
-
-
-def test_lazy_xp_function_opaque_wrappers_eagerly_raise(da: ModuleType):
- """
- Like `test_lazy_xp_function_eagerly_raises`, but the returned object is
- wrapped in an opaque wrapper.
- """
- x = da.arange(3)
- with pytest.raises(ValueError, match="Hello world"):
- _ = Wrapper(dask_raises(x))
-
-
-def check_recursive(x: list[object]) -> list[object]:
- assert isinstance(x, list)
- assert x[1] is x
- y: list[object] = [cast(Array, x[0]) + 1]
- y.append(y)
- return y
-
-
-lazy_xp_function(check_recursive)
-
-
-def test_lazy_xp_function_recursive(xp: ModuleType):
- """Test that inputs and outputs can be recursive data structures."""
- x: list[object] = [xp.asarray([1, 2])]
- x.append(x)
- y = check_recursive(x)
- assert isinstance(y, list)
- assert_equal(cast(Array, y[0]), xp.asarray([2, 3]))
- assert y[1] is y
-
-
-wrapped = ModuleType("wrapped")
-naked = ModuleType("naked")
-
-
-def f(x: Array) -> Array:
- xp = array_namespace(x)
- # Crash in jax.jit and trigger compute() on Dask
- if not xp.all(x):
- msg = "Values must be non-zero"
- raise ValueError(msg)
- return x
-
-
-wrapped.f = f # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-naked.f = f # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue]
-del f
-
-
-lazy_xp_function(wrapped.f)
-lazy_xp_modules = [wrapped]
-
-
-def test_lazy_xp_modules(xp: ModuleType, library: Backend):
- x = xp.asarray([1.0, 2.0])
- y = naked.f(x)
- assert_equal(y, x)
-
- if library.like(Backend.JAX):
- with pytest.raises(
- TypeError, match="Attempted boolean conversion of traced array"
- ):
- wrapped.f(x)
- elif library.like(Backend.DASK):
- with pytest.raises(AssertionError, match=r"dask\.compute"):
- wrapped.f(x)
- else:
- y = wrapped.f(x)
- assert_equal(y, x)
-
-
-def test_patch_lazy_xp_functions_deprecated_monkeypatch(
- request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch
-):
- xp = pytest.importorskip("dask.array")
-
- x = xp.asarray([1.0, 2.0])
- y = non_materializable5(x)
- assert_equal(y, x)
-
- with pytest.warns(DeprecationWarning, match="`monkeypatch` parameter"):
- _ = patch_lazy_xp_functions(request, monkeypatch, xp=xp)
-
- with pytest.raises(AssertionError, match=r"dask\.compute.* 1 times"):
- _ = non_materializable5(x)
-
- monkeypatch.undo()
- y = non_materializable5(x)
- assert_equal(y, x)
-
-
-def my_iter(x: Array) -> Iterator[Array]:
- yield x[0, :]
- yield x[1, :]
-
-
-lazy_xp_function(my_iter)
-
-
-def test_patch_lazy_xp_functions_iter(xp: ModuleType):
- x = xp.asarray([[1.0, 2.0], [3.0, 4.0]])
- it = my_iter(x)
-
- assert isinstance(it, Iterator)
- assert_equal(next(it), x[0, :])
- assert_equal(next(it), x[1, :])
- with pytest.raises(StopIteration):
- _ = next(it)
-
-
-def test_import_dependencies():
- _ = sys.modules.pop("numpy", None)
- _ = sys.modules.pop("pytest", None)
- _ = sys.modules.pop("array_api_extra", None)
-
- import array_api_extra # pyright: ignore[reportUnusedImport]
- import array_api_extra.testing # noqa: F401 # pyright: ignore[reportUnusedImport]
- from array_api_extra.testing import (
- lazy_xp_function, # noqa: F401 # pyright: ignore[reportUnusedImport]
- )
-
- assert "numpy" not in sys.modules
- assert "pytest" not in sys.modules
diff --git a/tests/test_version.py b/tests/test_version.py
deleted file mode 100644
index b9717a50..00000000
--- a/tests/test_version.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import importlib.metadata
-
-import array_api_extra as xpx
-
-
-def test_version():
- assert importlib.metadata.version("array_api_extra") == xpx.__version__
diff --git a/typos.toml b/typos.toml
deleted file mode 100644
index d7e130a0..00000000
--- a/typos.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[files]
-extend-exclude = [".git/", ".pixi/"]
-ignore-hidden = false
-
-[default.extend-words]
-nd = "nd"
-typ = "typ"
-cardinalis = "cardinalis"
-writeable = "writeable"
diff --git a/vendor_tests/__init__.py b/vendor_tests/__init__.py
deleted file mode 100644
index 9fd27fde..00000000
--- a/vendor_tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Allow for relative imports in `test_vendor.py`."""
diff --git a/vendor_tests/_array_api_compat_vendor.py b/vendor_tests/_array_api_compat_vendor.py
deleted file mode 100644
index 18b1bd13..00000000
--- a/vendor_tests/_array_api_compat_vendor.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""This file is a hook imported by `src/array_api_extra/_lib/_compat.py`."""
-# pyright: reportUnknownParameterType=false, reportMissingParameterType=false
-
-from types import ModuleType
-from typing import Any
-
-from .array_api_compat import * # type: ignore[import-not-found] # noqa: F403
-from .array_api_compat import array_namespace as array_namespace_compat
-
-
-# Let unit tests check with `is` that we are picking up the function from this module
-# and not from the original array_api_compat module.
-def array_namespace(*xs: Any | complex | None, **kwargs) -> ModuleType: # pyrefly: ignore[unannotated-parameter] # numpydoc ignore=GL08
- return array_namespace_compat(*xs, **kwargs)
diff --git a/vendor_tests/meson.build b/vendor_tests/meson.build
deleted file mode 100644
index 234496ff..00000000
--- a/vendor_tests/meson.build
+++ /dev/null
@@ -1,8 +0,0 @@
-py.install_sources([
- '__init__.py',
- '_array_api_compat_vendor.py',
- 'test_vendor.py',
- ],
- subdir: 'array_api_extra/vendor_tests',
- install_tag: 'tests',
-)
diff --git a/vendor_tests/test_vendor.py b/vendor_tests/test_vendor.py
deleted file mode 100644
index bac073a2..00000000
--- a/vendor_tests/test_vendor.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# pyright: reportAttributeAccessIssue=false
-
-from typing import Any, cast
-
-import array_api_strict as xp
-from numpy.testing import assert_array_equal
-
-from vendor_tests.array_api_compat.common._typing import ( # type: ignore[import-not-found]
- Array,
-)
-
-
-def test_vendor_compat():
- from ._array_api_compat_vendor import ( # type: ignore[attr-defined]
- array_namespace,
- device,
- is_array_api_obj,
- is_array_api_strict_namespace,
- is_cupy_array,
- is_cupy_namespace,
- is_dask_array,
- is_dask_namespace,
- is_jax_array,
- is_jax_namespace,
- is_lazy_array,
- is_numpy_array,
- is_numpy_namespace,
- is_pydata_sparse_array,
- is_pydata_sparse_namespace,
- is_torch_array,
- is_torch_namespace,
- is_writeable_array,
- size,
- to_device,
- )
-
- x = xp.asarray([1, 2, 3])
- assert array_namespace(x) is xp
- to_device(x, device(x))
- assert is_array_api_obj(x)
- assert is_array_api_strict_namespace(xp)
- x = cast(Array, x)
- assert not is_cupy_array(x)
- assert not is_cupy_namespace(xp)
- assert not is_dask_array(x)
- assert not is_dask_namespace(xp)
- assert not is_jax_array(x)
- assert not is_jax_namespace(xp)
- assert not is_lazy_array(x)
- assert not is_numpy_array(x)
- assert not is_numpy_namespace(xp)
- assert not is_pydata_sparse_array(x)
- assert not is_pydata_sparse_namespace(xp)
- assert not is_torch_array(x)
- assert not is_torch_namespace(xp)
- assert is_writeable_array(x)
- assert size(x) == 3
-
-
-def test_vendor_extra():
- from .array_api_extra import atleast_nd # type: ignore[import-not-found]
-
- x = xp.asarray(1)
- x = cast(Array, x)
- y = atleast_nd(x, ndim=0)
- assert_array_equal(y, x)
-
-
-def test_vendor_extra_testing():
- from .array_api_extra.testing import ( # type: ignore[import-not-found]
- lazy_xp_function,
- )
-
- def f(x: Any) -> Any:
- return x
-
- lazy_xp_function(f)
-
-
-def test_vendor_extra_uses_vendor_compat():
- from ._array_api_compat_vendor import array_namespace as n1
- from .array_api_extra._lib._utils._compat import ( # type: ignore[import-not-found]
- array_namespace as n2,
- )
-
- assert n1 is n2