diff --git a/skills/cell-type-annotation/pixi.lock b/skills/cell-type-annotation/pixi.lock index 9a306e0..56af703 100644 --- a/skills/cell-type-annotation/pixi.lock +++ b/skills/cell-type-annotation/pixi.lock @@ -472,6 +472,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/faiss-1.10.0-cpu_mkl_py312_hd7bdcb3_100.conda @@ -562,6 +565,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/aa/d8/0abcfb8629cc529e12df60e8bd73717c2588588f0744415158bde9d94ebf/circlify-0.15.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/70/0fbc2d5f23233a9c570a1aa26068b678c1f3b5ffa5fa7bca09270fb40a17/compressed_lists-0.4.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/97/e3c6e58ece26a053419ba0a18444b5443cfc64451bbf37f84e8143b8bdca/cuda_bindings-12.9.7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl @@ -570,12 +574,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/c1/9d/05e753afbaac3f92691059b3ba875589c98a425d69e5808cec32b31b580c/cuda_python-12.9.7-py3-none-any.whl - pypi: https://pypi.nvidia.com/cuda-toolkit/cuda_toolkit-12.1.1-py2.py3-none-any.whl - pypi: https://pypi.nvidia.com/cudf-cu12/cudf_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/cugraph-cu12/cugraph_cu12-26.6.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/cuml-cu12/cuml_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f6/6e/dc03c1ddc940f33b3d32803898e2fdae5c9538a2127a25f499494c84b183/cupy_cuda12x-14.1.1-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://pypi.nvidia.com/cuvs-cu12/cuvs_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://pypi.nvidia.com/dask-cuda/dask_cuda-26.6.0-py3-none-manylinux_2_28_aarch64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/dask-cudf-cu12/dask_cudf_cu12-26.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/4e/49b7ddbce455df546048368c7daa0c98fbbf72f94641e3b97e0c4ac622d7/decoupler-2.1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/c4/fccc9d23d665ebb05d406ad723c96a4316c513ca70096274414ac49487f1/delayedarray-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/dc/6d709bcf8fed7611d8a510aeed23b0436cf6db5b61e63c8eb8451eb0d4d8/distributed-2026.1.1-py3-none-any.whl + - pypi: https://pypi.nvidia.com/distributed-ucxx-cu12/distributed_ucxx_cu12-0.50.1-py3-none-manylinux_2_28_aarch64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/8e/250fab1cafeea43f4eb11f1d64cd6313f639965ff62cb0d9da3883655781/docrep-0.3.2.tar.gz - pypi: https://files.pythonhosted.org/packages/5e/d3/2c9b77082127d8fffc5e98711a953ad7cf61bca3887f1edc7260f7f30847/dolomite_base-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e1/58/e1042733a27d77cfd537a4dfaa9e9e6593f40a5c0143d71ea9e26f365411/dolomite_matrix-0.4.1-py3-none-any.whl @@ -607,6 +618,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/da/dd2867c25adbb41563720f14b5fc895c98bf88be682a3faff4f7b3118d2a/igraph-1.0.0-cp39-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a1/d3/20a61a248feb1249cd81f83ce731f0bdf5170ed96a08a298f7081cda9e90/interface_meta-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/e2/96bb51142e421ea1b9882eb94abec836d4ceedc0660b33fe0788ecc28a6c/iranges-0.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/89/82/5ab5211079a151b6f661529369c0c8e98ec64cabf5c0cf22a0a05af124d8/jax-0.10.2-py3-none-any.whl @@ -625,15 +637,20 @@ environments: - pypi: https://files.pythonhosted.org/packages/74/be/dc99b431346b2d2372bbe3ea7272c2b8957dd46b6ccebd0426d66dbfc9a8/legendkit-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/be/dba31e662c2ee028e20dd0308c1bc6e398dd7a1786fdd0821722537b4124/leidenalg-0.12.0-cp38-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/libcudf-cu12/libcudf_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/libcugraph-cu12/libcugraph_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/libcuml-cu12/libcuml_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/libcuvs-cu12/libcuvs_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/libkvikio-cu12/libkvikio_cu12-26.6.0-py3-none-manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/libnvforest-cu12/libnvforest_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/libraft-cu12/libraft_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/librmm-cu12/librmm_cu12-26.6.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/libucx-cu12/libucx_cu12-1.19.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/libucxx-cu12/libucxx_cu12-0.50.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/c5/fca7144236b6fa3279d0fb3172b32576c5ad8b84a63b9432ad6592d24847/lightning-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/25/f4/ead6e0e37209b07c9baa3e984ccdb0348ca370b77cea3aaea8ddbb097e00/lightning_utilities-0.15.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/f8/0d32243c6b8e5dbee9097cf0c95bbdf8681ba4463c927c2e3445f3775814/lineax-0.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl @@ -670,6 +687,7 @@ environments: - pypi: https://pypi.nvidia.com/nvidia-cusolver-cu12/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl - pypi: https://pypi.nvidia.com/nvidia-cusparse-cu12/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl - pypi: https://pypi.nvidia.com/nvidia-libnvcomp-cu12/nvidia_libnvcomp_cu12-5.2.0.13-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/45/caa600acfab94560807a20a64b5830d2cd3c3202b7f1328644d70b7d6bd8/nvidia_ml_py-13.610.43-py3-none-any.whl - pypi: https://pypi.nvidia.com/nvidia-nccl-cu12/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl - pypi: https://pypi.nvidia.com/nvidia-nvjitlink-cu12/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://pypi.nvidia.com/nvidia-nvtx-cu12/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl @@ -681,6 +699,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ac/87/0ae1baf8271a7a68bcc5b91103892b201cd723ac3dd67bc6ef3e5fc4747e/orbax_checkpoint-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/78/0f66915250058498915b3944ac7eccb0da5ce1f5984664fbb6a448cf73db/ott_jax-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/9d/6abe7c30edf97d2ddfabbf64523df61e2b80090bf4e038c7effc79286481/pertpy-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -694,6 +713,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/2e/c3/94ade4906a2f88bc935772f59c934013b4205e773bcb4239db114a6da136/pyarrow_hotfix-0.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/ff/94bc1aea7cba8bd6559469732408d6699c71077a495068141fcf9eb1f0dc/pydeseq2-0.5.4-py3-none-any.whl - pypi: https://pypi.nvidia.com/pylibcudf-cu12/pylibcudf_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/pylibcugraph-cu12/pylibcugraph_cu12-26.6.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://pypi.nvidia.com/pylibraft-cu12/pylibraft_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b2/e6/94145d714402fd5ade00b5661f2d0ab981219e07f7db9bfa16786cdb9c04/pynndescent-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/1a/e82ad06861982b139e20a903b12edb654ac912c1f8669fb2efb9b2193ff0/pyomo-6.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl @@ -704,7 +724,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/8b/4d/5740c27110b83634d8491c3b5facf0111b3e554c3164f4fb953be9bddaf6/pytorch_lightning-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/14/405b2970057801ef708b623934caba424f0b31c188fb1f71b7d95183dfa2/pyucell-0.5.0-py3-none-any.whl + - pypi: https://pypi.nvidia.com/raft-dask-cu12/raft_dask_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://pypi.nvidia.com/rapids-dask-dependency/rapids_dask_dependency-26.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/b6/139d9df6d0f7bd289a9a6286cecfff999e41c36865515d7fdb56b7b32a14/rapids_logger-0.2.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/0c/c9e7809c81fa89b23678e20a3a57d4cb3025cac85af3bd7ac6469cb6145e/rapids_singlecell-0.15.2.tar.gz - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl @@ -712,6 +735,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a5/0b/f68a968b49876eae0f2a515387093cebb2eb9451380a96741cc20efac0d0/s3fs-2026.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/e4/b648ac3267001e1582e0b6ffc22b16dada83e206d783115992e83a07773f/scanpy-1.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/a2/70401a107d6d7466d64b466927e6b96fcefa99d57494b972608e2f8be50f/scikit_image-0.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6a/7e/f003fd232ec3c3e29ae565e38536dbdef417c76f7c29a67203e05b800f44/scikit_misc-0.5.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2d/15/58de0cbef6399cd56a9122a7208c3affb9266940462816c1597815fd11d1/scimilarity-0.4.1-py3-none-any.whl @@ -728,6 +752,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/8c/07/1df47d3a7f5d06b615092783137b81ac81dc3201c82c6def1832cd51834d/singler-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/32/f99009be2e40d2098daae9be8374dde5d976d8af145024758737af0024ab/somacore-1.0.29-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/a9/804ac7423f5dda316d3a982f3ab071c971fb877f8961dad9f6a97d12d2ee/sparse-0.18.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/bc/85f244036553ca1e9850a851244150cbb2c20bdd0080fa766343ad544992/sparsecca-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -740,17 +765,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/18/7c/b7b24e10e5cb0213c85204d53fcd60d0568d986ea0001a00a815e14e01e1/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/24/99/4772b8e00a136f3e01236de33b0efda31ee7077203ba5967fcc76da94d65/texttable-1.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/d2/2f6866933e7ca179324ae57256a8962cbca580d5aeee114f07f10f062bd6/tiledb-0.36.1-cp312-cp312-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/da/38/6c2da0f5513238aa7cb99a5aa5965ecd90ccc66301174eacfe06deef43ee/tiledb_cloud-0.14.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b8/56/0f472537930840bbb632f2404265a5c10fed81d1caea90c90f429daaf9d9/tiledb_vector_search-0.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/65/72/13f2dd039e4242528ff779f9f5f58a8c44f490f2327476092e034244bd74/tiledbsoma-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f3/82/68ccd49add4d21937f087871350905ffc709f32c92bf95334e7abf442147/torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c3/a2/c7f6ebf546f8f644edf0f999aa98ece106986a77a7b922316bf6414ff825/torchmetrics-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d8/8e/bb97bb0c71802080bfc8952937d174e49cfc50de5c951dd47b2496f0dcdb/tqdm-4.68.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a8/a2/ac3aad5c77f85f47890dd929b2690c2ba3794ebcbb5384c19aa28d222066/treelite-4.7.0-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/2b/36e984399089c026a6499ac8f7401d38487cf0183839a4aa78140d373771/treescope-0.1.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl + - pypi: https://pypi.nvidia.com/ucxx-cu12/ucxx_cu12-0.50.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1b/98/f63318ccbe75c810011fe9233884c5d348d94d90005de1b79e5f93bef9c0/umap_learn-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -761,6 +790,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/19/d4/225027a913621a879b429a043674aa35220e6ce67785acad4f7bd0c4ff33/xarray_einstats-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5e/d8/9ffd8c237b3559945bb52103cf0eed64ea098f7b7f573f8d2962ef27b4b2/zarr-2.18.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda @@ -1638,6 +1668,11 @@ packages: requires_dist: - colorama ; sys_platform == 'win32' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + name: cloudpickle + version: 3.1.2 + sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/f7/70/0fbc2d5f23233a9c570a1aa26068b678c1f3b5ffa5fa7bca09270fb40a17/compressed_lists-0.4.5-py3-none-any.whl name: compressed-lists version: 0.4.5 @@ -1734,6 +1769,28 @@ packages: - cuda-bindings[all]==12.* ; extra == 'cu12' - cuda-bindings[all]==13.* ; extra == 'cu13' requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + sha256: 3d74819f261d77a410e8f8ddbd973446c312ec76605d60619d9b85113eca9632 + md5: 3fc21c99786b908fd7f32ea279fc9780 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 13.3.29 h376f20c_0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 24659 + timestamp: 1779898425780 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + sha256: a86028f94acf37b17ca2280734ae9dcc407cdf68a9c400102d323a3b15e52f0b + md5: 10949c6dfe9157fedb19170bd6e0b835 + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 206064 + timestamp: 1779898416941 - pypi: https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl name: cuda-pathfinder version: 1.5.5 @@ -1789,6 +1846,16 @@ packages: - nvidia-cuda-opencl-cu12==12.1.105.* ; (sys_platform == 'linux' and extra == 'opencl') or (sys_platform == 'win32' and extra == 'opencl') - nvidia-cuda-profiler-api-cu12==12.1.105.* ; (sys_platform == 'linux' and extra == 'profiler') or (sys_platform == 'win32' and extra == 'profiler') - nvidia-cuda-sanitizer-api-cu12==12.1.105.* ; (sys_platform == 'linux' and extra == 'sanitizer') or (sys_platform == 'win32' and extra == 'sanitizer') +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + sha256: bd8ee668f416bdd0f6548b2413550ae83d3834665a5be869a2daf99233ec526e + md5: 0fd72afdcc74560b80eb74b78767c454 + constrains: + - __cuda >=13 + - cudatoolkit 13.3|13.3.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + size: 22083 + timestamp: 1779891651771 - pypi: https://pypi.nvidia.com/cudf-cu12/cudf_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: cudf-cu12 version: 26.6.0 @@ -1838,6 +1905,39 @@ packages: - openpyxl ; extra == 'cudf-pandas-tests' - pytest-rerunfailures!=16.0.0 ; extra == 'cudf-pandas-tests' requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/cugraph-cu12/cugraph_cu12-26.6.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: cugraph-cu12 + version: 26.6.0 + sha256: 7202fec6918b4e31110e1e3d4e050c9bd4d6724ef65a893264034514cb6e2b30 + requires_dist: + - cuda-python>=12.9.2,<13.0 + - cudf-cu12==26.6.* + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 + - dask-cuda==26.6.* + - dask-cudf-cu12==26.6.* + - fsspec[http]>=0.6.0 + - libcugraph-cu12==26.6.* + - numba>=0.60.0,<0.65.0 + - numpy>=1.23,<3.0 + - pylibcudf-cu12==26.6.* + - pylibcugraph-cu12==26.6.* + - pylibraft-cu12==26.6.* + - raft-dask-cu12==26.6.* + - rapids-dask-dependency==26.6.* + - rmm-cu12==26.6.* + - ucxx-cu12==0.50.* + - certifi ; extra == 'test' + - networkx>=2.5.1 ; extra == 'test' + - numpy>=1.23,<3.0 ; extra == 'test' + - packaging ; extra == 'test' + - pandas ; extra == 'test' + - pytest ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-xdist ; extra == 'test' + - scikit-learn>=0.23.1 ; extra == 'test' + - scipy ; extra == 'test' + requires_python: '>=3.11' - pypi: https://pypi.nvidia.com/cuml-cu12/cuml_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: cuml-cu12 version: 26.6.0 @@ -1905,6 +2005,20 @@ packages: - mpmath ; extra == 'test' - cuda-toolkit[cublas,cudart,cufft,curand,cusolver,cusparse,nvrtc]==12.* ; extra == 'ctk' requires_python: '>=3.10' +- pypi: https://pypi.nvidia.com/cuvs-cu12/cuvs_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: cuvs-cu12 + version: 26.6.0 + sha256: 594fcc609e75474e1ce59e8353e25eedca58adb0bd6b2ca048523d24322baaba + requires_dist: + - cuda-python>=12.9.2,<13.0 + - libcuvs-cu12==26.6.* + - numpy>=1.23,<3.0 + - pylibraft-cu12==26.6.* + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - scikit-learn>=1.5 ; extra == 'test' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl name: cycler version: 0.12.1 @@ -1918,6 +2032,90 @@ packages: - pytest-cov ; extra == 'tests' - pytest-xdist ; extra == 'tests' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + name: dask + version: 2026.1.1 + sha256: 146b0ef2918eb581e06139183a88801b4a8c52d7c37758a91f8c3b75c54b0e15 + requires_dist: + - 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_full_version < '3.12' + - numpy>=1.24 ; extra == 'array' + - dask[array] ; extra == 'dataframe' + - pandas>=2.0 ; extra == 'dataframe' + - pyarrow>=14.0.1 ; extra == 'dataframe' + - distributed>=2026.1.1,<2026.1.2 ; extra == 'distributed' + - bokeh>=3.1.0 ; extra == 'diagnostics' + - jinja2>=2.10.3 ; extra == 'diagnostics' + - dask[array,dataframe,diagnostics,distributed] ; extra == 'complete' + - pyarrow>=14.0.1 ; extra == 'complete' + - lz4>=4.3.2 ; extra == 'complete' + - pandas[test] ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-rerunfailures ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - pre-commit ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://pypi.nvidia.com/dask-cuda/dask_cuda-26.6.0-py3-none-manylinux_2_28_aarch64.manylinux_2_28_x86_64.whl + name: dask-cuda + version: 26.6.0 + sha256: 38e2219a29f6afbb8a11f8367d9d14e1f9b328a572586ac65e09383a30eee7e6 + requires_dist: + - click>=8.1 + - cuda-core>=0.3.2 + - numpy>=1.23,<3.0 + - nvidia-ml-py>=12 + - pandas>=1.3 + - rapids-dask-dependency==26.6.* + - zict>=2.0.0 + - numpydoc>=1.1.0 ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-click>=2.7.1 ; extra == 'docs' + - sphinx-rtd-theme>=0.5.1 ; extra == 'docs' + - cuda-core[cu12]>=0.3.2 ; extra == 'cu12' + - cuda-core[cu13]>=0.3.2 ; extra == 'cu13' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-rerunfailures!=16.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - cudf-cu12==26.6.* ; extra == 'test-cu12' + - dask-cudf-cu12==26.6.* ; extra == 'test-cu12' + - distributed-ucxx-cu12==0.50.* ; extra == 'test-cu12' + - kvikio-cu12==26.6.* ; extra == 'test-cu12' + - cudf-cu13==26.6.* ; extra == 'test-cu13' + - dask-cudf-cu13==26.6.* ; extra == 'test-cu13' + - distributed-ucxx-cu13==0.50.* ; extra == 'test-cu13' + - kvikio-cu13==26.6.* ; extra == 'test-cu13' + requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/dask-cudf-cu12/dask_cudf_cu12-26.6.0-py3-none-any.whl + name: dask-cudf-cu12 + version: 26.6.0 + sha256: 39d968810027b016cfa1f04e7ba3235cc14ac2e0b026dec4c48fb804bc1e6029 + requires_dist: + - cudf-cu12==26.6.* + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 + - fsspec>=0.6.0 + - numpy>=1.26,<3.0 + - nvidia-ml-py>=12 + - pandas>=2.0,<2.4.0 + - rapids-dask-dependency==26.6.* + - aiobotocore>=2.2.0,<3 ; extra == 'test' + - boto3>=1.21.21 ; extra == 'test' + - botocore>=1.24.21 ; extra == 'test' + - dask-cuda==26.6.* ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-xdist ; extra == 'test' + - s3fs>=2022.3.0 ; extra == 'test' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/e0/4e/49b7ddbce455df546048368c7daa0c98fbbf72f94641e3b97e0c4ac622d7/decoupler-2.1.6-py3-none-any.whl name: decoupler version: 2.1.6 @@ -1972,6 +2170,46 @@ packages: - pkg:pypi/distlib?source=compressed-mapping size: 303705 timestamp: 1781320269259 +- pypi: https://files.pythonhosted.org/packages/b9/dc/6d709bcf8fed7611d8a510aeed23b0436cf6db5b61e63c8eb8451eb0d4d8/distributed-2026.1.1-py3-none-any.whl + name: distributed + version: 2026.1.1 + sha256: 506759b1ed88e45e12ba65e2a429de9911862db55d27dd8bb293c6268430374e + requires_dist: + - click>=8.0 + - cloudpickle>=3.0.0 + - dask>=2026.1.1,<2026.1.2 + - jinja2>=2.10.3 + - locket>=1.0.0 + - msgpack>=1.0.2 + - packaging>=20.0 + - psutil>=5.8.0 + - pyyaml>=5.4.1 + - sortedcontainers>=2.0.5 + - tblib>=1.6.0,!=3.2.0,!=3.2.1 + - toolz>=0.12.0 + - tornado>=6.2.0 + - urllib3>=1.26.5 + - zict>=3.0.0 + requires_python: '>=3.10' +- pypi: https://pypi.nvidia.com/distributed-ucxx-cu12/distributed_ucxx_cu12-0.50.1-py3-none-manylinux_2_28_aarch64.manylinux_2_28_x86_64.whl + name: distributed-ucxx-cu12 + version: 0.50.1 + sha256: 622fba3cbb53c639c12ff734bd13102ad9325e5d2b7281a77782467b421c9ab4 + requires_dist: + - cuda-core>=0.3.2 + - pyyaml>=6 + - rapids-dask-dependency==26.6.* + - ucxx-cu12==0.50.* + - sphinx ; extra == 'docs' + - sphinx-click>=2.7.1 ; extra == 'docs' + - sphinx-rtd-theme>=0.5.1 ; extra == 'docs' + - cudf-cu12==26.6.* ; extra == 'test' + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 ; extra == 'test' + - numba-cuda[cu12]>=0.22.1,<0.29.0 ; extra == 'test' + - numpy>=1.23,<3.0 ; extra == 'test' + - pytest ; extra == 'test' + - pytest-rerunfailures!=16.0.0 ; extra == 'test' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/44/8e/250fab1cafeea43f4eb11f1d64cd6313f639965ff62cb0d9da3883655781/docrep-0.3.2.tar.gz name: docrep version: 0.3.2 @@ -2986,6 +3224,68 @@ packages: - sphinx-gallery>=0.14.0 ; extra == 'doc' - pydoctor>=23.4.0 ; extra == 'doc' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl + name: imageio + version: 2.37.3 + sha256: 46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0 + requires_dist: + - numpy + - pillow>=8.3.2 + - imageio-ffmpeg ; extra == 'ffmpeg' + - psutil ; extra == 'ffmpeg' + - fsspec[http] ; extra == 'freeimage' + - pillow-heif ; extra == 'pillow-heif' + - tifffile ; extra == 'tifffile' + - av ; extra == 'pyav' + - astropy ; extra == 'fits' + - rawpy ; extra == 'rawpy' + - numpy>2 ; extra == 'rawpy' + - gdal ; extra == 'gdal' + - itk ; extra == 'itk' + - black ; extra == 'linting' + - flake8 ; extra == 'linting' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - fsspec[github] ; extra == 'test' + - sphinx<6 ; extra == 'docs' + - numpydoc ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - fsspec[github] ; extra == 'dev' + - black ; extra == 'dev' + - flake8 ; extra == 'dev' + - av ; extra == 'all-plugins' + - astropy ; extra == 'all-plugins' + - fsspec[http] ; extra == 'all-plugins' + - imageio-ffmpeg ; extra == 'all-plugins' + - numpy>2 ; extra == 'all-plugins' + - pillow-heif ; extra == 'all-plugins' + - psutil ; extra == 'all-plugins' + - rawpy ; extra == 'all-plugins' + - tifffile ; extra == 'all-plugins' + - fsspec[http] ; extra == 'all-plugins-pypy' + - imageio-ffmpeg ; extra == 'all-plugins-pypy' + - pillow-heif ; extra == 'all-plugins-pypy' + - psutil ; extra == 'all-plugins-pypy' + - tifffile ; extra == 'all-plugins-pypy' + - astropy ; extra == 'full' + - av ; extra == 'full' + - black ; extra == 'full' + - flake8 ; extra == 'full' + - fsspec[github,http] ; extra == 'full' + - imageio-ffmpeg ; extra == 'full' + - numpydoc ; extra == 'full' + - numpy>2 ; extra == 'full' + - pillow-heif ; extra == 'full' + - psutil ; extra == 'full' + - pydata-sphinx-theme ; extra == 'full' + - pytest ; extra == 'full' + - pytest-cov ; extra == 'full' + - rawpy ; extra == 'full' + - sphinx<6 ; extra == 'full' + - tifffile ; extra == 'full' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 md5: ffc17e785d64e12fc311af9184221839 @@ -3335,6 +3635,17 @@ packages: - nvidia-libnvcomp-cu12==5.2.0.13 - rapids-logger==0.2.* requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/libcugraph-cu12/libcugraph_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: libcugraph-cu12 + version: 26.6.0 + sha256: 860bcb33f70f1485f410c1d291760c3dd2bb78cf8664b2b2ef6842715a18fa21 + requires_dist: + - cuda-toolkit[cublas,curand,cusolver,cusparse,nvrtc]==12.* + - libcuvs-cu12==26.6.* + - libraft-cu12==26.6.* + - librmm-cu12==26.6.* + - nvidia-nvjitlink-cu12>=12.9,<13 + requires_python: '>=3.11' - pypi: https://pypi.nvidia.com/libcuml-cu12/libcuml_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: libcuml-cu12 version: 26.6.0 @@ -3347,6 +3658,17 @@ packages: - nvidia-nvjitlink-cu12>=12.9,<13 - rapids-logger==0.2.* requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/libcuvs-cu12/libcuvs_cu12-26.6.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: libcuvs-cu12 + version: 26.6.0 + sha256: 2a853e70a2577a86dca0ad6a1605702dc5d8a02857f117d344a36229bbbfaf25 + requires_dist: + - cuda-toolkit[cublas,curand,cusolver,cusparse,nvrtc]==12.* + - libraft-cu12==26.6.* + - librmm-cu12==26.6.* + - nvidia-nccl-cu12>=2.19 + - nvidia-nvjitlink-cu12>=12.9,<13 + requires_python: '>=3.11' - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef md5: 89f76a2a21a3ec3ec983b5eb237c4113 @@ -3687,6 +4009,18 @@ packages: purls: [] size: 5852044 timestamp: 1778269036376 +- pypi: https://pypi.nvidia.com/libucx-cu12/libucx_cu12-1.19.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: libucx-cu12 + version: 1.19.0 + sha256: 64b9448f23c7bb29be30d21bac5742f7297845d0f0c159e6302670b35e71251f + requires_python: '>=3.9' +- pypi: https://pypi.nvidia.com/libucxx-cu12/libucxx_cu12-0.50.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: libucxx-cu12 + version: 0.50.0 + sha256: 270773eb7ac5fb59857a3f6dd48e3042ff4ace37ae7a2e3dd730d6436c51deef + requires_dist: + - librmm-cu12==26.6.* + - libucx-cu12>=1.18.0,<1.20 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f md5: 01bb81d12c957de066ea7362007df642 @@ -4023,6 +4357,11 @@ packages: version: 0.47.0 sha256: 306a265f408c259067257a732c8e159284334018b4083a9e35f67d19792b164f requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + name: locket + version: 1.0.0 + sha256: b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' - pypi: https://files.pythonhosted.org/packages/b7/c0/4bc973defd1270b89ccaae04cef0d5fa3ea85b59b108ad2c08aeea9afb76/makefun-1.16.0-py2.py3-none-any.whl name: makefun version: 1.16.0 @@ -4655,6 +4994,10 @@ packages: name: nvidia-libnvcomp-cu12 version: 5.2.0.13 sha256: 53fa199e91a0f3530ce713760da23287c204cbcfddb89a11f2c1bb49e24e3c57 +- pypi: https://files.pythonhosted.org/packages/23/45/caa600acfab94560807a20a64b5830d2cd3c3202b7f1328644d70b7d6bd8/nvidia_ml_py-13.610.43-py3-none-any.whl + name: nvidia-ml-py + version: 13.610.43 + sha256: f13c72698edef492f985cc225f14faafe68ae065a2e407f45bdf6f4b9b43fde8 - pypi: https://pypi.nvidia.com/nvidia-nccl-cu12/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl name: nvidia-nccl-cu12 version: 2.20.5 @@ -5052,6 +5395,18 @@ packages: - xlsxwriter>=3.0.5 ; extra == 'all' - zstandard>=0.19.0 ; extra == 'all' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + name: partd + version: 1.4.2 + sha256: 978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f + requires_dist: + - locket + - toolz + - numpy>=1.20.0 ; extra == 'complete' + - pandas>=1.3 ; extra == 'complete' + - pyzmq ; extra == 'complete' + - blosc ; extra == 'complete' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl name: patsy version: 1.0.2 @@ -5473,6 +5828,25 @@ packages: - pyarrow>=19.0.0,<24 ; extra == 'pyarrow' - numpy>=1.26,<3.0 ; extra == 'numpy' requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/pylibcugraph-cu12/pylibcugraph_cu12-26.6.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pylibcugraph-cu12 + version: 26.6.0 + sha256: 52cfd762199c0d77aa5def29d34982ed370017fd6e7221d51eb7fe21981f4b27 + requires_dist: + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 + - libcugraph-cu12==26.6.* + - numpy>=1.23,<3.0 + - pylibraft-cu12==26.6.* + - rmm-cu12==26.6.* + - cudf-cu12==26.6.* ; extra == 'test' + - numpy>=1.23,<3.0 ; extra == 'test' + - pandas ; extra == 'test' + - pytest ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-xdist ; extra == 'test' + - scipy ; extra == 'test' + requires_python: '>=3.11' - pypi: https://pypi.nvidia.com/pylibraft-cu12/pylibraft_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pylibraft-cu12 version: 26.6.0 @@ -5934,11 +6308,88 @@ packages: - pkg:pypi/pyyaml?source=hash-mapping size: 187278 timestamp: 1770223990452 +- pypi: https://pypi.nvidia.com/raft-dask-cu12/raft_dask_cu12-26.6.0-cp311-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: raft-dask-cu12 + version: 26.6.0 + sha256: 8342300082c6e3adf527c60e1940c52ee58a9790d898e57a9a16509e02fc19e3 + requires_dist: + - dask-cuda==26.6.* + - distributed-ucxx-cu12==0.50.* + - libraft-cu12==26.6.* + - nvidia-nccl-cu12>=2.19 + - pylibraft-cu12==26.6.* + - rapids-dask-dependency==26.6.* + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + requires_python: '>=3.11' +- pypi: https://pypi.nvidia.com/rapids-dask-dependency/rapids_dask_dependency-26.6.0-py3-none-any.whl + name: rapids-dask-dependency + version: 26.6.0 + sha256: a1ccdf84ba4a2dce12d3e2b121703229c505c6c0e2130b34e108767af3bb8109 + requires_dist: + - dask>=2026.1.1,<2026.1.2 + - distributed>=2026.1.1,<2026.1.2 + - pytest ; extra == 'test' - pypi: https://files.pythonhosted.org/packages/69/b6/139d9df6d0f7bd289a9a6286cecfff999e41c36865515d7fdb56b7b32a14/rapids_logger-0.2.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: rapids-logger version: 0.2.3 sha256: 7fe67ef4049c5d8ba6154746325dcf7cc0f327f0efa8f2611fc8f64e67510f60 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f1/0c/c9e7809c81fa89b23678e20a3a57d4cb3025cac85af3bd7ac6469cb6145e/rapids_singlecell-0.15.2.tar.gz + name: rapids-singlecell + version: 0.15.2 + sha256: 6d43e113180c0e83e1dee37013db4cb97ff4660b7dc7e2652e7d999d5f208208 + requires_dist: + - anndata>=0.10.0 + - scanpy>=1.10.0 + - numpy>=1.17.0 + - scipy>=1.4 + - pandas + - natsort + - scikit-misc>=0.1.3 + - scikit-learn + - matplotlib>=3.4 + - tqdm + - statsmodels>=0.12.0 + - scikit-image + - docrep + - cupy-cuda13x ; extra == 'rapids-cu13' + - cudf-cu13>=25.10 ; extra == 'rapids-cu13' + - cuml-cu13>=25.10 ; extra == 'rapids-cu13' + - cugraph-cu13>=25.10 ; extra == 'rapids-cu13' + - cuvs-cu13>=25.10 ; extra == 'rapids-cu13' + - cupy-cuda12x ; extra == 'rapids-cu12' + - cudf-cu12>=25.10 ; extra == 'rapids-cu12' + - cuml-cu12>=25.10 ; extra == 'rapids-cu12' + - cugraph-cu12>=25.10 ; extra == 'rapids-cu12' + - cuvs-cu12>=25.10 ; extra == 'rapids-cu12' + - sphinx>=4.5.0 ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - nbsphinx>=0.8.12 ; extra == 'doc' + - myst-nb ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-tabs ; extra == 'doc' + - sphinxext-opengraph ; extra == 'doc' + - sphinxcontrib-bibtex ; extra == 'doc' + - scanpydoc[typehints,theme]>=0.9.4 ; extra == 'doc' + - dask ; extra == 'doc' + - pytest ; extra == 'doc' + - pytest ; extra == 'test-minimal' + - pytest-cov ; extra == 'test-minimal' + - pytest-timeout ; extra == 'test-minimal' + - pytest-rerunfailures ; extra == 'test-minimal' + - anyio ; extra == 'test-minimal' + - pooch ; extra == 'test-minimal' + - profimp ; extra == 'test-minimal' + - scanpy>=1.10.0 ; extra == 'test-minimal' + - bbknn ; extra == 'test-minimal' + - decoupler ; extra == 'test-minimal' + - fast-array-utils ; extra == 'test-minimal' + - rapids-singlecell[test-minimal] ; extra == 'test' + - igraph ; extra == 'test' + - hatch-vcs ; extra == 'dev' + - pre-commit ; extra == 'dev' + requires_python: '>=3.12,<3.15' - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -6106,6 +6557,71 @@ packages: - scikit-image>=0.23.1 ; extra == 'scrublet' - scikit-misc>=0.5.1 ; extra == 'skmisc' requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/f4/a2/70401a107d6d7466d64b466927e6b96fcefa99d57494b972608e2f8be50f/scikit_image-0.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: scikit-image + version: 0.26.0 + sha256: 7df650e79031634ac90b11e64a9eedaf5a5e06fcd09bcd03a34be01745744466 + requires_dist: + - numpy>=1.24 + - scipy>=1.11.4 + - networkx>=3.0 + - pillow>=10.1 + - imageio>=2.33,!=2.35.0 + - tifffile>=2022.8.12 + - packaging>=21 + - lazy-loader>=0.4 + - meson-python>=0.16 ; extra == 'build' + - ninja>=1.11.1.1 ; extra == 'build' + - cython>=3.0.8,!=3.2.0b1 ; extra == 'build' + - pythran>=0.16 ; extra == 'build' + - numpy>=2.0 ; extra == 'build' + - spin==0.13 ; extra == 'build' + - build>=1.2.1 ; extra == 'build' + - pooch>=1.6.0 ; extra == 'data' + - pre-commit ; extra == 'developer' + - ipython ; extra == 'developer' + - docstub==0.3.0.post0 ; extra == 'developer' + - scikit-image[asv] ; extra == 'developer' + - asv ; sys_platform != 'emscripten' and extra == 'asv' + - sphinx>=8.0 ; extra == 'docs' + - sphinx-gallery[parallel]>=0.18 ; extra == 'docs' + - numpydoc>=1.7 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - matplotlib>=3.7 ; extra == 'docs' + - dask[array]>=2023.2.0 ; extra == 'docs' + - pandas>=2.0 ; extra == 'docs' + - seaborn>=0.11 ; extra == 'docs' + - pooch>=1.6 ; extra == 'docs' + - tifffile>=2022.8.12 ; extra == 'docs' + - myst-parser ; extra == 'docs' + - intersphinx-registry>=0.2411.14 ; extra == 'docs' + - ipywidgets ; extra == 'docs' + - ipykernel ; extra == 'docs' + - plotly>=5.20 ; extra == 'docs' + - kaleido==0.2.1 ; extra == 'docs' + - scikit-learn>=1.2 ; extra == 'docs' + - sphinx-design>=0.5 ; extra == 'docs' + - pydata-sphinx-theme>=0.16 ; extra == 'docs' + - pywavelets>=1.6 ; extra == 'docs' + - pytest-doctestplus>=1.6.0 ; extra == 'docs' + - simpleitk ; sys_platform != 'emscripten' and extra == 'optional' + - scikit-learn>=1.2 ; extra == 'optional' + - pyamg>=5.2 ; python_full_version < '3.14' and sys_platform != 'emscripten' and extra == 'optional' + - scikit-image[optional-free-threaded] ; extra == 'optional' + - astropy>=6.0 ; extra == 'optional-free-threaded' + - dask[array]>=2023.2.0 ; extra == 'optional-free-threaded' + - matplotlib>=3.7 ; extra == 'optional-free-threaded' + - pooch>=1.6.0 ; sys_platform != 'emscripten' and extra == 'optional-free-threaded' + - pywavelets>=1.6 ; extra == 'optional-free-threaded' + - numpydoc>=1.7 ; extra == 'test' + - pooch>=1.6.0 ; sys_platform != 'emscripten' and extra == 'test' + - pytest>=8.3 ; extra == 'test' + - pytest-cov>=2.11.0 ; extra == 'test' + - pytest-pretty ; extra == 'test' + - pytest-localserver ; extra == 'test' + - pytest-faulthandler ; extra == 'test' + - pytest-doctestplus>=1.6.0 ; extra == 'test' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: scikit-learn version: 1.9.0 @@ -6964,6 +7480,10 @@ packages: - ruff ; extra == 'dev' - pandas-stubs ; extra == 'dev' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + name: sortedcontainers + version: 2.4.0 + sha256: a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 - pypi: https://files.pythonhosted.org/packages/20/a9/804ac7423f5dda316d3a982f3ab071c971fb877f8961dad9f6a97d12d2ee/sparse-0.18.0-py2.py3-none-any.whl name: sparse version: 0.18.0 @@ -7185,6 +7705,42 @@ packages: version: 3.6.0 sha256: 43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl + name: tifffile + version: 2026.6.1 + sha256: 0d7382d2769b855b81ce358528e2b40c16d48aa39031746efa81215205332a8d + requires_dist: + - numpy>=2.1 + - imagecodecs>=2026.5.10 ; extra == 'codecs' + - lxml ; extra == 'xml' + - zarr>=3.2.0 ; extra == 'zarr' + - fsspec ; extra == 'zarr' + - kerchunk ; extra == 'zarr' + - matplotlib ; extra == 'plot' + - imagecodecs>=2026.5.10 ; extra == 'all' + - matplotlib ; extra == 'all' + - lxml ; extra == 'all' + - zarr>=3.2.0 ; extra == 'all' + - xarray ; extra == 'all' + - fsspec ; extra == 'all' + - kerchunk ; extra == 'all' + - cmapfile ; extra == 'test' + - czifile ; extra == 'test' + - dask ; extra == 'test' + - fsspec ; extra == 'test' + - imagecodecs ; extra == 'test' + - kerchunk ; extra == 'test' + - lfdfiles ; extra == 'test' + - lxml ; extra == 'test' + - ndtiff ; extra == 'test' + - oiffile ; extra == 'test' + - psdtags ; extra == 'test' + - pytest ; extra == 'test' + - requests ; extra == 'test' + - roifile ; extra == 'test' + - xarray ; extra == 'test' + - zarr>=3.2.0 ; extra == 'test' + requires_python: '>=3.12' - pypi: https://files.pythonhosted.org/packages/92/d2/2f6866933e7ca179324ae57256a8962cbca580d5aeee114f07f10f062bd6/tiledb-0.36.1-cp312-cp312-manylinux_2_28_x86_64.whl name: tiledb version: 0.36.1 @@ -7402,6 +7958,11 @@ packages: - pkg:pypi/tomli?source=hash-mapping size: 21561 timestamp: 1774492402955 +- pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + name: toolz + version: 1.1.0 + sha256: 15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f3/82/68ccd49add4d21937f087871350905ffc709f32c92bf95334e7abf442147/torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl name: torch version: 2.3.1 @@ -7580,6 +8141,11 @@ packages: - kornia>=0.6.7 ; extra == 'dev' - statsmodels>0.13.5 ; extra == 'dev' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: tornado + version: 6.5.7 + sha256: 8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/d8/8e/bb97bb0c71802080bfc8952937d174e49cfc50de5c951dd47b2496f0dcdb/tqdm-4.68.3-py3-none-any.whl name: tqdm version: 4.68.3 @@ -7691,6 +8257,26 @@ packages: purls: [] size: 119135 timestamp: 1767016325805 +- pypi: https://pypi.nvidia.com/ucxx-cu12/ucxx_cu12-0.50.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: ucxx-cu12 + version: 0.50.0 + sha256: 7d7640a7ec98850813d95daf084718ffe71b4f88bf954af84188f23525bcd1ba + requires_dist: + - cuda-core>=0.3.2 + - libucxx-cu12==0.50.* + - numpy>=1.23,<3.0 + - nvidia-ml-py>=12 + - rmm-cu12==26.6.* + - cloudpickle ; extra == 'test' + - cudf-cu12==26.6.* ; extra == 'test' + - cupy-cuda12x>=13.6.0,!=14.0.0,!=14.1.0 ; extra == 'test' + - numba-cuda[cu12]>=0.22.1,<0.29.0 ; extra == 'test' + - pytest ; extra == 'test' + - pytest-asyncio>=1.0.0 ; extra == 'test' + - pytest-rerunfailures!=16.0.0 ; extra == 'test' + - pytest-xdist ; extra == 'test' + - rapids-dask-dependency==26.6.* ; extra == 'test' + requires_python: '>=3.11' - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 md5: 55fd03988b1b1bc6faabbfb5b481ecd7 @@ -8016,6 +8602,11 @@ packages: - fsspec>=2023.10.0 ; extra == 'remote' - obstore>=0.5.1 ; extra == 'remote' requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl + name: zict + version: 3.0.0 + sha256: 5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae + requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 md5: ba3dcdc8584155c97c648ae9c044b7a3 diff --git a/skills/cell-type-annotation/pixi.toml b/skills/cell-type-annotation/pixi.toml index 04a42a4..76ec279 100644 --- a/skills/cell-type-annotation/pixi.toml +++ b/skills/cell-type-annotation/pixi.toml @@ -100,6 +100,22 @@ extra-index-urls = ["https://pypi.nvidia.com"] # — no override, no source build, no build-host `-march=native` fragility. [feature.gpu.target.linux-64.dependencies] hnswlib = ">=0.8" +# rapids-singlecell's compiled DE kernels (rapids_singlecell._cuda._aggr_cuda, used by the GPU +# `rank_genes_groups`) are built against CUDA 13 and link `libcudart.so.13`, but the rest of the +# GPU stack is CUDA 12 (cuml-cu12 / cupy-cuda12x / torch-cu12, which load libcudart.so.12). Without +# a CUDA-13 runtime present the kernel .so fails to load, rapids-singlecell sets it to None, and the +# GPU DE path silently falls back to scanpy (verified on Euler). Ship the CUDA-13 cudart runtime from +# conda-forge so libcudart.so.13 lands in $ENV/lib alongside .so.12 — the two majors coexist (the +# driver supports both) and the kernel loads. This is the actual enabler of issue #38's GPU path. +cuda-cudart = "13.*" + +# Put the env's own lib dir on the dynamic-loader path for the gpu env so the CUDA-13 DE kernel +# above finds `libcudart.so.13` in $ENV/lib. pixi/`pixi run` does NOT add `$CONDA_PREFIX/lib` to +# LD_LIBRARY_PATH by default, so without this the kernel .so can't resolve libcudart.so.13 and the +# GPU DE path silently falls back to scanpy. Scoped to the gpu environment only; the CPU `default` +# env never sets this. +[feature.gpu.activation.env] +LD_LIBRARY_PATH = "$CONDA_PREFIX/lib:$LD_LIBRARY_PATH" [feature.gpu.target.linux-64.pypi-dependencies] # Reference-model option (scANVI/scArches + scvi-hub). torch+OpenMP coexist fine with the @@ -108,6 +124,17 @@ scvi-tools = "*" # CellMapper's `rapids` GPU k-NN backend calls cuML directly (validated on an RTX 4090). cuml-cu12 = "*" cudf-cu12 = "*" +# GPU marker DE: `cta markers compute` routes `rank_genes_groups` to rapids-singlecell on a GPU +# profile (atlas-scale ranking in seconds vs ~minutes on scanpy/CPU). Drop-in — same wilcoxon +# method, same `uns['rank_genes_groups']` output the CPU path writes; scanpy stays the CPU default. +# The `rapids-cu12` extra pulls the FULL RAPIDS stack it imports at load (cudf/cuml/cugraph/cuvs); +# the bare cuml-cu12/cudf-cu12 above (for CellMapper's kNN) are not enough — verified on Euler that +# `import rapids_singlecell` needs cuvs too. +rapids-singlecell = { version = "*", extras = ["rapids-cu12"] } +# rapids-singlecell 0.15.2 also imports `dask.array` at module load (rapids_singlecell/_compat.py) +# but only declares `dask` under its `doc`/`test` extras, not core — so the import ALSO needs dask +# present. Pull it in explicitly so the GPU DE path loads instead of silently falling back to scanpy. +dask = "*" # Optional large-memory zero-shot annotator (additional cross-check only). Its hnswlib dep is # pinned to the portable conda-forge build above (see comment) to avoid the AVX-512 wheel SIGILL. scimilarity = "*" diff --git a/skills/cell-type-annotation/reference/compute_environments.md b/skills/cell-type-annotation/reference/compute_environments.md index 5bc03b1..44ba89e 100644 --- a/skills/cell-type-annotation/reference/compute_environments.md +++ b/skills/cell-type-annotation/reference/compute_environments.md @@ -114,8 +114,19 @@ CPU host that merely has the client tools installed. `cta detect-env` flags it; The per-tool step / GPU-requirement / profile mapping has **one home**: `reference/tool_registry.md`. Read it to decide what to run where. In short: most of the -pipeline is CPU (`none`); only the reference-mapping cross-check and (optionally) -large-query scoring touch a GPU. `cta crosscheck scimilarity` is CPU too and needs only moderate +pipeline is CPU (`none`); the reference-mapping cross-check, (optionally) large-query scoring, +and the **full-object marker DE** touch a GPU. The scanpy↔rapids-singlecell split is **profile- +routed with no knob** through one central mechanism (`cta/gpu.py`): scanpy on CPU, +`rapids-singlecell` on a GPU profile, with automatic CPU fallback on any GPU failure. Adding a +future GPU-accelerable step is a two-callable `gpu.run(adata, cpu=…, gpu=…, label=…, equivalent=…)` +call, not a re-implementation of the check/transfer/fallback. Today only **marker DE** +(`cta markers compute`, plus the `markers score` overlap-DE fallback) is routed — atlas-scale, +full-object, and bit-identical CPU/GPU (ranking in seconds vs ~minutes). Steps that run on a +small subset (e.g. `cta cluster subcluster`) deliberately stay on CPU: no real speedup at that +size, and GPU Leiden would diverge from scanpy's igraph for no gain. The mechanism's +`equivalent=False` flag is reserved for any future routed op whose GPU result differs (clustering/ +UMAP), so the divergence is logged. On a `scheduler` profile the atlas marker job is submitted to +a GPU node just like the reference-model steps. `cta crosscheck scimilarity` is CPU too and needs only moderate RAM (~16–27 GB), so it runs on any reasonably-sized machine — it is HUMAN-only, not GPU- or large-memory-gated. The profile decides *how* the `preferred`/`required` rows execute — inline on `local_gpu`, handed off on `scheduler` (next section). @@ -160,12 +171,15 @@ the scripts encode the matching best practices so a SLURM run stays clean and fa - GPU results are **not bit-identical** to CPU, and deep models (scVI/scANVI) are **stochastic** — seed them (`scvi.settings.seed = 0`; the scripts do) but still report predictions as a **hypothesis**, never a verdict. -- GPU k-NN (`cta crosscheck reference-map --knn-method rapids`) and any optional GPU clustering/UMAP - (e.g. rapids-singlecell, not a default extra) are not bit-identical to their CPU - equivalents. This skill annotates **pre-existing** clusters and does not re-cluster the - main object, so this mostly doesn't bite — but if a GPU-accelerated step ever feeds - clustering, treat the clusters as the same kind of input the skill validates, not as - ground truth. +- The GPU-routed steps (`cta/gpu.py`) are not bit-identical to their CPU equivalents, but the + ones routed today are **result-equivalent for annotation**: marker DE (`cta markers compute`) + and GPU k-NN (`cta crosscheck reference-map --knn-method rapids`) differ only by minor float/tie + noise that doesn't change rankings. Marker DE writes the same `uns` schema either way and + degrades to scanpy on any GPU failure (`equivalent=True`). Clustering/UMAP are NOT routed (they + use different GPU backends and would diverge); the mechanism's `equivalent=False` flag exists so + that if such an op is ever routed, the divergence is logged and the clusters are treated as + input to validate, not as truth. This skill annotates **pre-existing** clusters and does not + re-cluster the main object, so this mostly doesn't bite. ## The invariant that does not change with the hardware diff --git a/skills/cell-type-annotation/reference/tool_registry.md b/skills/cell-type-annotation/reference/tool_registry.md index 0f7d307..bc026d9 100644 --- a/skills/cell-type-annotation/reference/tool_registry.md +++ b/skills/cell-type-annotation/reference/tool_registry.md @@ -29,7 +29,7 @@ A separate **RAM** note flags steps whose real cost is memory, not GPU. | Canonicalize (1e) | `cta data canonicalize` | none | all | **Standard Stage-1 step** (not optional): write the one canonical sidecar every step reads — symbol var_names (+ kept Ensembl map), counts in `layers['counts']` (from a layer or `.raw`), log-norm `X`, slim embeddings/obs. Also applies the **upfront absolute gene filter** (`sc.pp.filter_genes(min_cells=GENE_FILTER_MIN_CELLS=5)`) so every downstream step sees one clean, consistent gene set. Replaces the old slim-cache step. | | QC metrics (1e) | `cta data qc` | none | all | compute (when absent) standard QC into the sidecar obs: `n_genes_by_counts`/`total_counts`/`pct_counts_mt` + cell-cycle `S_score`/`G2M_score`/`phase` (Tirosh lists, case-insensitive). Detection only — no doublet detection, normalization, or filtering. | | Seed markers (3.1, opt.) | `cta markers assemble` | none | all | seed `markers_.json` from a CellTypist model / reference DE. A `--reference` is aligned to query symbols first (`--ref-symbol-col`/`--ref-symbol-map`) so its DE marker names panel-gate. | -| Score — bottom-up (3.3) | `cta markers compute` | none | all | `rank_genes_groups` (wilcoxon, scanpy defaults) → `markers_.csv`; `filter_rank_genes_groups` specificity → `markers_filtered_.csv` (CPU). GPU acceleration would need rapids-singlecell (full RAPIDS+dask, not in the default extras) — niche, since the main object isn't re-preprocessed. | +| Score — bottom-up (3.3) | `cta markers compute` | optional | all | `rank_genes_groups` (wilcoxon, scanpy defaults) → `markers_.csv`; `filter_rank_genes_groups` specificity → `markers_filtered_.csv`. **Compute-profile-routed, no knob:** CPU profile → scanpy; GPU profile → `rapids_singlecell.tl.rank_genes_groups` (same wilcoxon + same `uns` output, atlas-scale ranking in seconds vs ~minutes). Auto-detected via `torch.cuda`; degrades to scanpy on any GPU failure. | | Score — top-down (3.3) | `cta markers profile` | none | all | score the curated panel across clusters → pct/mean + dotplot. | | Score — signatures (3.3) | `cta markers score` | none | all | decoupler `aucell` + pyUCell + DE-overlap → `crosscheck`. | | Cross-check — in-object (3.4) | `cta crosscheck obs-pred` | none | all | summarize an existing `obs` prediction column. Preferred when one fits. | @@ -41,7 +41,7 @@ A separate **RAM** note flags steps whose real cost is memory, not GPU. | Provision SCimilarity model (before scimilarity) | `cta reference fetch-scimilarity` | none | all (HUMAN-only) | download + extract the model bundle for `cta crosscheck scimilarity`. Annotation-only by default (~9 GB on disk; ~30 GB resumable download, skips the 32 GB cellsearch). Needs network. | | Fetch reference (3.4 fallback) | `cta reference fetch-census` | none | all (larger slices on large-mem) | capped, tissue-matched CELLxGENE Census slice → feeds `cta crosscheck reference-map`. Needs network. | | Investigate before Unknown (3.7) | `cta cluster profile` | none | all | QC medians + categorical crosstabs + optional spatial. | -| Sub-cluster (3.7) | `cta cluster subcluster` | none | all | Leiden on the anchor embedding + per-sub summary. | +| Sub-cluster (3.7) | `cta cluster subcluster` | none | all | neighbors + Leiden on the anchor embedding + per-sub summary. CPU (scanpy igraph) — runs on a small subset, so not GPU-routed. | | Confidence calibration (3.7) | `cta cluster confidence` | none | all | marker-logFC-margin + agreement proxy (advisory; from `markers_filtered_.csv`). | | Evidence cards (3.6) | `cta report scaffold-cards` | none | all | render cards from the labels CSV; `--evidence` embeds the numbers. | | Report + gate (3.9) | `cta report build` | none | all | per-level HTML; `--strict` = level-completeness gate. | diff --git a/skills/cell-type-annotation/src/cta/compute_markers.py b/skills/cell-type-annotation/src/cta/compute_markers.py index f3f80a7..8faadfb 100644 --- a/skills/cell-type-annotation/src/cta/compute_markers.py +++ b/skills/cell-type-annotation/src/cta/compute_markers.py @@ -4,12 +4,18 @@ + a `filter_rank_genes_groups` specificity pass, written as tidy marker tables to /tables/. The descriptive marker evidence that feeds annotation. NOT condition DE (Job B = pseudobulk + PyDESeq2; see reference/differential_expression.md). + +The Wilcoxon ranking is compute-profile-routed (no user knob): on a CUDA GPU it runs via +rapids-singlecell (atlas-scale: seconds vs ~minutes), otherwise via scanpy on CPU — same +method and same `uns['rank_genes_groups']` output, so the specificity pass and every +downstream reader are identical on both paths. """ from __future__ import annotations import typer +from cta import gpu from cta.io import ( ADATA_OPT, CLUSTER_KEY_OPT, @@ -52,20 +58,26 @@ def cli( adata_obj.obs[cluster_key] = adata_obj.obs[cluster_key].astype("category") grps = split_csv(groups) or "all" - eprint(">> rank_genes_groups (wilcoxon, pts=True)") - # scanpy assembles its results frame one column per group, so with many clusters pandas - # raises 'DataFrame is highly fragmented' once per cluster. It is internal to scanpy - # (scanpy/tools/_rank_genes_groups.py) and has no effect on the output — silence exactly - # that message for this one call, leaving every other warning visible. - with suppressed_warnings(FRAGMENTED_FRAME_WARNING): - sc.tl.rank_genes_groups( - adata_obj, - groupby=cluster_key, - groups=grps, - method="wilcoxon", - pts=True, - use_raw=False, + # Compute-profile routing via the central cta.gpu mechanism (no user knob): rapids-singlecell + # on a CUDA GPU (atlas-scale: seconds vs ~minutes), else scanpy on CPU, with automatic CPU + # fallback. Same wilcoxon method + `uns['rank_genes_groups']` either way, so everything + # downstream (extraction, #36's filter_rank_genes_groups, reports) is identical. + def _rgg_cpu(a): + # scanpy assembles its results frame one column per group, so with many clusters pandas + # raises 'DataFrame is highly fragmented' once per cluster. It is internal to scanpy + # (scanpy/tools/_rank_genes_groups.py) and has no effect on the output — silence exactly + # that message for this one call, leaving every other warning visible. + with suppressed_warnings(FRAGMENTED_FRAME_WARNING): + sc.tl.rank_genes_groups( + a, groupby=cluster_key, groups=grps, method="wilcoxon", pts=True, use_raw=False + ) + + def _rgg_gpu(a, rsc): + rsc.tl.rank_genes_groups( + a, groupby=cluster_key, groups=grps, method="wilcoxon", pts=True, use_raw=False ) + + gpu.run(adata_obj, cpu=_rgg_cpu, gpu=_rgg_gpu, label="rank_genes_groups (wilcoxon, pts=True)") frames = [] grp_list = adata_obj.obs[cluster_key].cat.categories if grps == "all" else grps for g in grp_list: diff --git a/skills/cell-type-annotation/src/cta/gpu.py b/skills/cell-type-annotation/src/cta/gpu.py new file mode 100644 index 0000000..db9fba8 --- /dev/null +++ b/skills/cell-type-annotation/src/cta/gpu.py @@ -0,0 +1,88 @@ +"""Central scanpy <-> rapids-singlecell routing for the compute-profile split. + +Every scVerse step that has a rapids-singlecell GPU equivalent (marker DE, sub-cluster Leiden, +…) routes through `run()` here instead of re-implementing the env check + host<->device transfer ++ CPU fallback. One place to reason about "CPU or GPU", so adding a future GPU-accelerable step +is a two-callable call, not a copy of the plumbing. + +Routing rule (no user knob): use the GPU iff a CUDA GPU is reachable in this process AND +rapids-singlecell imports; otherwise scanpy on CPU. The GPU path moves the object's matrices to +the device for the op and ALWAYS restores them to host afterwards (so downstream CPU code and any +fallback see numpy/scipy), and falls back to CPU on ANY failure — the GPU is an accelerator, never +a correctness dependency. + +Result equivalence is per-op and the caller declares it. `rank_genes_groups` is bit-identical +CPU/GPU (only float/tie noise); Leiden/UMAP use different backends and genuinely DIVERGE — pass +`equivalent=False` for those so the chosen engine is logged (the run records which one produced +the divergent output). See reference/compute_environments.md. +""" + +from __future__ import annotations + +from collections.abc import Callable + +from cta.io import eprint, resolve_accelerator + +_GPU_CACHE: bool | None = None + + +def gpu_available() -> bool: + """True iff a CUDA GPU is reachable in this process AND rapids-singlecell imports. + + The single source of truth for the CPU/GPU split. Cached per process — the answer can't + change mid-run. Importing rapids-singlecell is the real gate: `resolve_accelerator` only + sees torch, but rapids-singlecell may be absent (CPU env) or fail to load (e.g. a + CUDA-mismatched compiled kernel), and either way we must use scanpy. + """ + global _GPU_CACHE + if _GPU_CACHE is None: + ok = False + if resolve_accelerator("auto") == "cuda": + try: + import rapids_singlecell # noqa: F401 + + ok = True + except Exception: # noqa: BLE001 — any import/load failure -> use CPU + ok = False + _GPU_CACHE = ok + return _GPU_CACHE + + +def run( + adata, + *, + cpu: Callable, + gpu: Callable, + label: str, + equivalent: bool = True, +) -> str: + """Run `gpu(adata, rsc)` on a CUDA GPU, else `cpu(adata)`; return the engine used ('gpu'/'cpu'). + + On a GPU profile, moves `adata`'s matrices to the device (rapids-singlecell `anndata_to_GPU`), + runs `gpu`, then ALWAYS restores them to host (`anndata_to_CPU`) — even on failure — so the rest + of the step and any fallback see CPU arrays. Any exception in the GPU path logs and falls back + to `cpu`. `equivalent=False` marks ops whose GPU result differs from CPU (clustering/UMAP); it + only annotates the log line. Both callables mutate `adata` in place; `gpu` additionally receives + the imported `rapids_singlecell` module so it needn't import it itself. + """ + if gpu_available(): + try: + import rapids_singlecell as rsc + + note = "" if equivalent else " (result differs from CPU — distinct GPU backend)" + eprint(f">> {label} [GPU / rapids-singlecell]{note}") + rsc.get.anndata_to_GPU(adata) + try: + gpu(adata, rsc) + return "gpu" + finally: + # Restore X to host even on failure, so the CPU path / downstream see numpy/scipy. + try: + rsc.get.anndata_to_CPU(adata) + except Exception: # noqa: BLE001 + pass + except Exception as e: # noqa: BLE001 — any GPU failure falls back to scanpy CPU + eprint(f" GPU {label} failed ({type(e).__name__}: {e}) — falling back to scanpy CPU") + eprint(f">> {label} [CPU / scanpy]") + cpu(adata) + return "cpu" diff --git a/skills/cell-type-annotation/src/cta/score_signatures.py b/skills/cell-type-annotation/src/cta/score_signatures.py index f469ce9..4726abd 100644 --- a/skills/cell-type-annotation/src/cta/score_signatures.py +++ b/skills/cell-type-annotation/src/cta/score_signatures.py @@ -38,6 +38,7 @@ import pandas as pd import typer +from cta import gpu from cta.constants import MIN_ON_PANEL_MARKERS from cta.io import ( ADATA_OPT, @@ -150,9 +151,17 @@ def cli( else: eprint(" overlap: markers table not found — computing rank_genes_groups") # Default-param Wilcoxon, matching `cta markers compute` (no tie_correct) so this - # fallback can't silently disagree with the canonical markers table. - sc.tl.rank_genes_groups( - adata_obj, groupby=cluster_key, method="wilcoxon", use_raw=False + # fallback can't silently disagree with the canonical markers table. Routed through the + # central cta.gpu mechanism (rapids-singlecell on GPU, scanpy on CPU, auto-fallback). + gpu.run( + adata_obj, + cpu=lambda a: sc.tl.rank_genes_groups( + a, groupby=cluster_key, method="wilcoxon", use_raw=False + ), + gpu=lambda a, rsc: rsc.tl.rank_genes_groups( + a, groupby=cluster_key, method="wilcoxon", use_raw=False + ), + label="rank_genes_groups (overlap fallback)", ) for g in clusters: ranked[str(g)] = ( diff --git a/skills/cell-type-annotation/src/cta/subcluster.py b/skills/cell-type-annotation/src/cta/subcluster.py index 69ff1df..5feba51 100644 --- a/skills/cell-type-annotation/src/cta/subcluster.py +++ b/skills/cell-type-annotation/src/cta/subcluster.py @@ -94,6 +94,9 @@ def cli( f"on '{embedding_key}' @ resolution {resolution}" ) + # Sub-clustering runs on a SMALL subset (one/few clusters), so it stays on CPU — GPU offers no + # real speedup at this size and cuGraph Leiden would diverge from scanpy's igraph for no gain. + # (GPU routing via cta.gpu is reserved for the full-object heavy steps, e.g. marker DE.) sc.pp.neighbors(sub, use_rep=embedding_key, n_neighbors=n_neighbors) # igraph flavor = CPU-friendly, deterministic; never requires GPU/leidenalg quirks sc.tl.leiden(