anndata 0.12.2__tar.gz → 0.12.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- anndata-0.12.4/.github/dependabot.yml +9 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/benchmark.yml +7 -4
- anndata-0.12.2/.github/workflows/check-pr-milestoned.yml → anndata-0.12.4/.github/workflows/check-pr.yml +5 -1
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/publish.yml +1 -1
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/test-cpu.yml +38 -33
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/test-gpu.yml +14 -17
- {anndata-0.12.2 → anndata-0.12.4}/.pre-commit-config.yaml +2 -2
- {anndata-0.12.2 → anndata-0.12.4}/.readthedocs.yml +1 -1
- {anndata-0.12.2 → anndata-0.12.4}/PKG-INFO +6 -7
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/asv.conf.json +1 -1
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/anndata.py +10 -12
- anndata-0.12.4/benchmarks/benchmarks/backed_hdf5.py +112 -0
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/dataset2d.py +21 -19
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/readwrite.py +17 -51
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/sparse_dataset.py +31 -26
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/utils.py +21 -3
- {anndata-0.12.2 → anndata-0.12.4}/docs/conf.py +2 -1
- anndata-0.12.4/docs/release-notes/0.12.3.md +14 -0
- anndata-0.12.4/docs/release-notes/0.12.4.md +4 -0
- anndata-0.12.4/docs/release-notes/2172.bug.md +1 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/tutorials/zarr-v3.md +0 -5
- {anndata-0.12.2 → anndata-0.12.4}/hatch.toml +7 -3
- {anndata-0.12.2 → anndata-0.12.4}/pyproject.toml +28 -17
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/__init__.py +23 -18
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/aligned_df.py +7 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/anndata.py +8 -7
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/index.py +136 -23
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/merge.py +34 -44
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/sparse_dataset.py +12 -11
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/views.py +1 -1
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/h5ad.py +18 -27
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/lazy_methods.py +1 -1
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/methods.py +49 -65
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/registry.py +17 -20
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/utils.py +2 -7
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/zarr.py +16 -7
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_settings.py +8 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_settings.pyi +1 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/compat/__init__.py +3 -11
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_lazy_arrays.py +5 -2
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/merge.py +86 -50
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
- {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/_pytest.py +2 -6
- {anndata-0.12.2 → anndata-0.12.4}/tests/conftest.py +9 -6
- {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_concat.py +1 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_read.py +4 -3
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_annot.py +24 -1
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_awkward.py +43 -45
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_hdf5.py +167 -27
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_sparse.py +19 -6
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_base.py +4 -4
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_concatenate.py +101 -113
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_concatenate_disk.py +12 -2
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_dask.py +45 -2
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_dask_view_mem.py +3 -1
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_deprecations.py +6 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_extensions.py +3 -3
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_inplace_subset.py +1 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_dispatched.py +20 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_elementwise.py +5 -5
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_partial.py +1 -6
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_warnings.py +5 -18
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_readwrite.py +47 -45
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_views.py +21 -21
- anndata-0.12.2/src/anndata/_version.py +0 -62
- {anndata-0.12.2 → anndata-0.12.4}/.cirun.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.codecov.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.editorconfig +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/close-stale.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/codespell.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/label-stale.yml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.gitignore +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.gitmodules +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.prettierignore +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.prettierrc.yaml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.taplo.toml +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.vscode/launch.json +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/.vscode/settings.json +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/LICENSE +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/README.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/README.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/biome.jsonc +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/ci/constraints.txt +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/ci/scripts/min-deps.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/ci/scripts/towncrier_automation.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/Makefile +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/_key_contributors.rst +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/_static/img/anndata_schema.svg +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/_templates/autosummary/class.rst +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/api.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/benchmark-read-write.ipynb +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/benchmarks.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/concatenation.rst +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/contributing.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/autosummary_skip_inherited.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/no_skip_abc_members.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/patch_myst_cite.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/fileformat-prose.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/index.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/interoperability.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/news.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/references.rst +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.1.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.2.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.3.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.4.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.5.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.6.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.7.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.8.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.9.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.1.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.2.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.3.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.4.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.1.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.2.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.4.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.5.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.6.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.6.x.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.2.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.3.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.4.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.5.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.6.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.7.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.8.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.8.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.0.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.1.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.2.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/index.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/docs/tutorials/index.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/access.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/aligned_mapping.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/extensions.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/file_backing.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/raw.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/storage.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/xarray.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/read.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/write.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_types.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_warnings.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/abc.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/_dispatch_io.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_compat.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_io.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/multi_files/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/pytorch/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/pytorch/_annloader.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/io.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/logging.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/tests/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/tests/helpers.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/types.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/typing.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/anndata/utils.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/__init__.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/_doctest.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/py.typed +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/adata-comments.tsv +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/adata.csv +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/readme.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/readme.md +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/excel.xlsx +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/data/umi_tools.tsv.gz +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/conftest.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_write.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_anncollection.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_dense.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_get_vector.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_gpu.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_helpers.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_backwards_compat.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_conversion.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_utils.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_layers.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_obsmvarm.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_obspvarp.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_raw.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_repr.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_settings.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_structured_arrays.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_transpose.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_uns.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_utils.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_x.py +0 -0
- {anndata-0.12.2 → anndata-0.12.4}/tests/test_xarray.py +0 -0
|
@@ -11,7 +11,10 @@ env:
|
|
|
11
11
|
|
|
12
12
|
defaults:
|
|
13
13
|
run:
|
|
14
|
-
|
|
14
|
+
# Add `-l` to GitHub’s default bash options to activate mamba environments
|
|
15
|
+
# https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#exit-codes-and-error-action-preference
|
|
16
|
+
# https://github.com/mamba-org/setup-micromamba/#readme
|
|
17
|
+
shell: bash -elo pipefail {0}
|
|
15
18
|
|
|
16
19
|
jobs:
|
|
17
20
|
benchmark:
|
|
@@ -29,9 +32,10 @@ jobs:
|
|
|
29
32
|
ASV_DIR: "./benchmarks"
|
|
30
33
|
|
|
31
34
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
35
|
+
- uses: actions/checkout@v5
|
|
33
36
|
with:
|
|
34
37
|
fetch-depth: 0
|
|
38
|
+
# no blob filter so asv can checkout other commits
|
|
35
39
|
|
|
36
40
|
- run: git fetch origin main:main
|
|
37
41
|
if: ${{ github.ref_name != 'main' }}
|
|
@@ -42,11 +46,10 @@ jobs:
|
|
|
42
46
|
environment-name: asv
|
|
43
47
|
cache-environment: true
|
|
44
48
|
# Deps documented in https://asv.readthedocs.io/en/latest/installing.html
|
|
45
|
-
# libmambapy upper bound: https://github.com/airspeed-velocity/asv/issues/1438
|
|
46
49
|
create-args: >-
|
|
47
50
|
python=${{ matrix.python }}
|
|
48
51
|
asv
|
|
49
|
-
|
|
52
|
+
py_rattler
|
|
50
53
|
conda-build
|
|
51
54
|
|
|
52
55
|
- name: Cache datasets
|
|
@@ -24,7 +24,7 @@ env:
|
|
|
24
24
|
|
|
25
25
|
jobs:
|
|
26
26
|
check-milestone:
|
|
27
|
-
name: "Triage: Check
|
|
27
|
+
name: "Triage: Check PR title, milestone, and labels"
|
|
28
28
|
runs-on: ubuntu-latest
|
|
29
29
|
steps:
|
|
30
30
|
- name: Check if merging isn’t blocked
|
|
@@ -35,3 +35,7 @@ jobs:
|
|
|
35
35
|
uses: flying-sheep/check@v1
|
|
36
36
|
with:
|
|
37
37
|
success: ${{ github.event.pull_request.milestone != null || contains(env.LABELS, 'no milestone') }}
|
|
38
|
+
- name: Check if PR title is valid
|
|
39
|
+
uses: amannn/action-semantic-pull-request@v6
|
|
40
|
+
env: # Needs repo options: “Squash and merge” with commit message set to “PR title”
|
|
41
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -10,12 +10,7 @@ on:
|
|
|
10
10
|
env:
|
|
11
11
|
FORCE_COLOR: "1"
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
run:
|
|
15
|
-
shell: bash -el {0}
|
|
16
|
-
|
|
17
|
-
# Cancel the job if new commits are pushed
|
|
18
|
-
# https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
|
|
13
|
+
# Cancel the job if new commits are pushed: https://stackoverflow.com/q/66335225/247482
|
|
19
14
|
concurrency:
|
|
20
15
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
21
16
|
cancel-in-progress: true
|
|
@@ -26,11 +21,11 @@ jobs:
|
|
|
26
21
|
outputs:
|
|
27
22
|
envs: ${{ steps.get-envs.outputs.envs }}
|
|
28
23
|
steps:
|
|
29
|
-
- uses: actions/checkout@
|
|
24
|
+
- uses: actions/checkout@v5
|
|
30
25
|
with:
|
|
31
26
|
filter: blob:none
|
|
32
27
|
fetch-depth: 0
|
|
33
|
-
- uses: astral-sh/setup-uv@
|
|
28
|
+
- uses: astral-sh/setup-uv@v6
|
|
34
29
|
with:
|
|
35
30
|
enable-cache: false
|
|
36
31
|
- id: get-envs
|
|
@@ -41,17 +36,19 @@ jobs:
|
|
|
41
36
|
| { name: .key, python: .value.python, args: (.value."extra-args" // [] | join(" ")) }
|
|
42
37
|
)')
|
|
43
38
|
echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT
|
|
39
|
+
|
|
44
40
|
test:
|
|
45
41
|
needs: get-environments
|
|
46
42
|
runs-on: ubuntu-latest
|
|
47
43
|
strategy:
|
|
48
44
|
matrix:
|
|
49
45
|
env: ${{ fromJSON(needs.get-environments.outputs.envs) }}
|
|
50
|
-
io_mark: ["zarr_io", "not zarr_io"]
|
|
51
|
-
env: # environment
|
|
46
|
+
io_mark: ["zarr_io", "not zarr_io", "dask_distributed"] # dask_distributed should not be run with -n auto as it uses a client with processes
|
|
47
|
+
env: # environment variables for use in codecov’s env_vars tagging
|
|
52
48
|
ENV_NAME: ${{ matrix.env.name }}
|
|
49
|
+
IO_MARK: ${{ matrix.io_mark }}
|
|
53
50
|
steps:
|
|
54
|
-
- uses: actions/checkout@
|
|
51
|
+
- uses: actions/checkout@v5
|
|
55
52
|
with:
|
|
56
53
|
fetch-depth: 0
|
|
57
54
|
filter: blob:none
|
|
@@ -59,43 +56,56 @@ jobs:
|
|
|
59
56
|
- name: Install system dependencies
|
|
60
57
|
run: sudo apt install -y hdf5-tools
|
|
61
58
|
|
|
62
|
-
- name: Set up Python ${{ matrix.env.python }}
|
|
63
|
-
uses: actions/setup-python@v5
|
|
64
|
-
with:
|
|
65
|
-
python-version: ${{ matrix.env.python }}
|
|
66
|
-
|
|
67
59
|
- name: Install UV
|
|
68
|
-
uses: astral-sh/setup-uv@
|
|
60
|
+
uses: astral-sh/setup-uv@v6
|
|
69
61
|
with:
|
|
70
62
|
enable-cache: true
|
|
71
|
-
|
|
63
|
+
python-version: ${{ matrix.env.python }}
|
|
72
64
|
|
|
73
65
|
- name: Install dependencies
|
|
74
|
-
run:
|
|
66
|
+
run: |
|
|
67
|
+
# https://github.com/pallets/click/issues/3066
|
|
68
|
+
uv tool install --with='click!=8.3.0' hatch
|
|
69
|
+
hatch -v env create ${{ matrix.env.name }}
|
|
75
70
|
|
|
76
71
|
- name: Run tests
|
|
77
|
-
|
|
72
|
+
env:
|
|
73
|
+
COVERAGE_PROCESS_START: ${{ github.workspace }}/pyproject.toml
|
|
74
|
+
run: |
|
|
75
|
+
hatch run ${{ matrix.env.name }}:run-cov -v --color=yes ${{ matrix.io_mark != 'dask_distributed' && '-n auto' || '' }} --junitxml=test-data/test-results.xml -m "${{ matrix.io_mark }}" ${{ matrix.env.args }}
|
|
76
|
+
hatch run ${{ matrix.env.name }}:cov-combine
|
|
77
|
+
hatch run ${{ matrix.env.name }}:coverage xml
|
|
78
|
+
|
|
79
|
+
- name: Upload test results
|
|
80
|
+
if: ${{ !cancelled() }}
|
|
81
|
+
uses: codecov/test-results-action@v1
|
|
82
|
+
with:
|
|
83
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
84
|
+
env_vars: ENV_NAME,IO_MARK
|
|
85
|
+
fail_ci_if_error: true
|
|
86
|
+
file: test-data/test-results.xml
|
|
78
87
|
|
|
79
88
|
- name: Upload coverage data
|
|
80
89
|
uses: codecov/codecov-action@v5
|
|
81
90
|
with:
|
|
82
91
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
83
|
-
env_vars: ENV_NAME
|
|
92
|
+
env_vars: ENV_NAME,IO_MARK
|
|
84
93
|
fail_ci_if_error: true
|
|
85
94
|
files: test-data/coverage.xml
|
|
86
95
|
|
|
87
96
|
build:
|
|
88
|
-
runs-on: ubuntu-
|
|
97
|
+
runs-on: ubuntu-24.04
|
|
89
98
|
steps:
|
|
90
|
-
- uses: actions/checkout@
|
|
99
|
+
- uses: actions/checkout@v5
|
|
91
100
|
with:
|
|
92
101
|
fetch-depth: 0
|
|
93
102
|
filter: blob:none
|
|
94
103
|
|
|
95
|
-
- name: Set up Python
|
|
104
|
+
- name: Set up Python
|
|
96
105
|
uses: actions/setup-python@v5
|
|
97
106
|
with:
|
|
98
|
-
python-version: '3.
|
|
107
|
+
python-version: '3.x'
|
|
108
|
+
cache: pip
|
|
99
109
|
|
|
100
110
|
- name: Install build tools and requirements
|
|
101
111
|
run: |
|
|
@@ -110,11 +120,6 @@ jobs:
|
|
|
110
120
|
python -m build --sdist --wheel .
|
|
111
121
|
twine check dist/*
|
|
112
122
|
|
|
113
|
-
- name: Check runtime version
|
|
114
|
-
run: |
|
|
115
|
-
pip install dist/*.whl
|
|
116
|
-
python -c 'import anndata; print(anndata.__version__)'
|
|
117
|
-
|
|
118
123
|
check:
|
|
119
124
|
if: always()
|
|
120
125
|
needs:
|
|
@@ -123,6 +128,6 @@ jobs:
|
|
|
123
128
|
- build
|
|
124
129
|
runs-on: ubuntu-latest
|
|
125
130
|
steps:
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
- uses: re-actors/alls-green@release/v1
|
|
132
|
+
with:
|
|
133
|
+
jobs: ${{ toJSON(needs) }}
|
|
@@ -13,10 +13,6 @@ env:
|
|
|
13
13
|
PYTEST_ADDOPTS: "-v --color=yes"
|
|
14
14
|
FORCE_COLOR: "1"
|
|
15
15
|
|
|
16
|
-
defaults:
|
|
17
|
-
run:
|
|
18
|
-
shell: bash -el {0}
|
|
19
|
-
|
|
20
16
|
# Cancel the job if new commits are pushed
|
|
21
17
|
# https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
|
|
22
18
|
concurrency:
|
|
@@ -48,7 +44,7 @@ jobs:
|
|
|
48
44
|
timeout-minutes: 30
|
|
49
45
|
|
|
50
46
|
steps:
|
|
51
|
-
- uses: actions/checkout@v4
|
|
47
|
+
- uses: actions/checkout@v4 # TODO: upgrade once cirun image supports node 24
|
|
52
48
|
with:
|
|
53
49
|
fetch-depth: 0
|
|
54
50
|
filter: blob:none
|
|
@@ -66,28 +62,29 @@ jobs:
|
|
|
66
62
|
max_version=$(echo "$classifiers" | sort -V | tail -1)
|
|
67
63
|
echo "max_python_version=$max_version" >> $GITHUB_ENV
|
|
68
64
|
|
|
69
|
-
- name: Install Python
|
|
70
|
-
uses: actions/setup-python@v5
|
|
71
|
-
with:
|
|
72
|
-
# https://github.com/cupy/cupy/issues/8651 cupy does not support python3.13 yet
|
|
73
|
-
python-version: "3.12"
|
|
74
|
-
|
|
75
65
|
- name: Install UV
|
|
76
|
-
uses: astral-sh/setup-uv@
|
|
66
|
+
uses: astral-sh/setup-uv@v6 # TODO: upgrade once cirun image supports node 24
|
|
77
67
|
with:
|
|
78
68
|
enable-cache: true
|
|
79
|
-
|
|
69
|
+
python-version: ${{ env.max_python_version }}
|
|
80
70
|
|
|
81
71
|
- name: Install AnnData
|
|
82
|
-
run:
|
|
72
|
+
run: |
|
|
73
|
+
uv venv
|
|
74
|
+
uv pip install -e ".[dev,test,cu12]" -c ci/constraints.txt
|
|
83
75
|
|
|
84
76
|
- name: Env list
|
|
85
|
-
run: pip list
|
|
77
|
+
run: uv pip list
|
|
86
78
|
|
|
87
79
|
- name: Run test
|
|
88
|
-
|
|
80
|
+
env:
|
|
81
|
+
COVERAGE_PROCESS_START: ${{ github.workspace }}/pyproject.toml
|
|
82
|
+
run: |
|
|
83
|
+
uv run coverage run -m pytest -m gpu -n auto
|
|
84
|
+
uv run coverage combine
|
|
85
|
+
uv run coverage xml
|
|
89
86
|
|
|
90
|
-
- uses: codecov/codecov-action@
|
|
87
|
+
- uses: codecov/codecov-action@v5
|
|
91
88
|
with:
|
|
92
89
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
93
90
|
fail_ci_if_error: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: anndata
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.4
|
|
4
4
|
Summary: Annotated data.
|
|
5
5
|
Project-URL: Documentation, https://anndata.readthedocs.io/
|
|
6
6
|
Project-URL: Source, https://github.com/scverse/anndata
|
|
@@ -38,15 +38,14 @@ Requires-Dist: cupy-cuda11x; extra == 'cu11'
|
|
|
38
38
|
Provides-Extra: cu12
|
|
39
39
|
Requires-Dist: cupy-cuda12x; extra == 'cu12'
|
|
40
40
|
Provides-Extra: dask
|
|
41
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
41
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'dask'
|
|
42
42
|
Provides-Extra: dev
|
|
43
|
-
Requires-Dist: hatch-vcs; extra == 'dev'
|
|
44
43
|
Requires-Dist: towncrier>=24.8.0; extra == 'dev'
|
|
45
44
|
Provides-Extra: dev-doc
|
|
46
45
|
Requires-Dist: towncrier>=24.8.0; extra == 'dev-doc'
|
|
47
46
|
Provides-Extra: doc
|
|
48
47
|
Requires-Dist: awkward>=2.3; extra == 'doc'
|
|
49
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
48
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'doc'
|
|
50
49
|
Requires-Dist: ipython; extra == 'doc'
|
|
51
50
|
Requires-Dist: myst-nb; extra == 'doc'
|
|
52
51
|
Requires-Dist: myst-parser; extra == 'doc'
|
|
@@ -64,14 +63,14 @@ Provides-Extra: gpu
|
|
|
64
63
|
Requires-Dist: cupy; extra == 'gpu'
|
|
65
64
|
Provides-Extra: lazy
|
|
66
65
|
Requires-Dist: aiohttp; extra == 'lazy'
|
|
67
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
66
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'lazy'
|
|
68
67
|
Requires-Dist: requests; extra == 'lazy'
|
|
69
68
|
Requires-Dist: xarray>=2025.06.1; extra == 'lazy'
|
|
70
69
|
Provides-Extra: test
|
|
71
70
|
Requires-Dist: aiohttp; extra == 'test'
|
|
72
71
|
Requires-Dist: awkward>=2.3.2; extra == 'test'
|
|
73
72
|
Requires-Dist: boltons; extra == 'test'
|
|
74
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
73
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'test'
|
|
75
74
|
Requires-Dist: dask[distributed]; extra == 'test'
|
|
76
75
|
Requires-Dist: filelock; extra == 'test'
|
|
77
76
|
Requires-Dist: httpx<1.0; extra == 'test'
|
|
@@ -93,7 +92,7 @@ Requires-Dist: xarray>=2025.06.1; extra == 'test'
|
|
|
93
92
|
Provides-Extra: test-min
|
|
94
93
|
Requires-Dist: awkward>=2.3.2; extra == 'test-min'
|
|
95
94
|
Requires-Dist: boltons; extra == 'test-min'
|
|
96
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
95
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'test-min'
|
|
97
96
|
Requires-Dist: dask[distributed]; extra == 'test-min'
|
|
98
97
|
Requires-Dist: filelock; extra == 'test-min'
|
|
99
98
|
Requires-Dist: httpx<1.0; extra == 'test-min'
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
// If missing or the empty string, the tool will be automatically
|
|
37
37
|
// determined by looking for tools on the PATH environment
|
|
38
38
|
// variable.
|
|
39
|
-
"environment_type": "
|
|
39
|
+
"environment_type": "rattler",
|
|
40
40
|
// timeout in seconds for installing any dependencies in environment
|
|
41
41
|
// defaults to 10 min
|
|
42
42
|
//"install_timeout": 600,
|
|
@@ -13,18 +13,16 @@ class GarbargeCollectionSuite:
|
|
|
13
13
|
# custom because `memory_profiler` is a line-by-line profiler (also: https://github.com/pythonprofilers/memory_profiler/issues/402)
|
|
14
14
|
def track_peakmem_garbage_collection(self, *_):
|
|
15
15
|
def display_top(snapshot, key_type="lineno"):
|
|
16
|
-
snapshot = snapshot.filter_traces(
|
|
17
|
-
(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
)
|
|
27
|
-
)
|
|
16
|
+
snapshot = snapshot.filter_traces((
|
|
17
|
+
tracemalloc.Filter(
|
|
18
|
+
inclusive=False,
|
|
19
|
+
filename_pattern="<frozen importlib._bootstrap>",
|
|
20
|
+
),
|
|
21
|
+
tracemalloc.Filter(
|
|
22
|
+
inclusive=False,
|
|
23
|
+
filename_pattern="<unknown>",
|
|
24
|
+
),
|
|
25
|
+
))
|
|
28
26
|
top_stats = snapshot.statistics(key_type)
|
|
29
27
|
total = sum(stat.size for stat in top_stats)
|
|
30
28
|
return total
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
import pandas as pd
|
|
5
|
+
from scipy import sparse
|
|
6
|
+
|
|
7
|
+
import anndata as ad
|
|
8
|
+
|
|
9
|
+
file_paths = {"sparse": "adata_sparse.h5ad"}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BackedHDF5Indexing:
|
|
13
|
+
param_names = ("arr_type",)
|
|
14
|
+
params = ("sparse",)
|
|
15
|
+
|
|
16
|
+
def setup_cache(self):
|
|
17
|
+
X_sparse = sparse.random(
|
|
18
|
+
10000,
|
|
19
|
+
50000,
|
|
20
|
+
density=0.01,
|
|
21
|
+
format="csr",
|
|
22
|
+
random_state=np.random.default_rng(42),
|
|
23
|
+
)
|
|
24
|
+
for X, arr_type in [
|
|
25
|
+
(X_sparse, "sparse"),
|
|
26
|
+
]:
|
|
27
|
+
n_obs, n_var = X.shape
|
|
28
|
+
|
|
29
|
+
# Create obs and var dataframes
|
|
30
|
+
obs = pd.DataFrame(
|
|
31
|
+
{
|
|
32
|
+
"cell_type": pd.Categorical(
|
|
33
|
+
np.random.choice(["TypeA", "TypeB", "TypeC"], n_obs)
|
|
34
|
+
),
|
|
35
|
+
"total_counts": np.random.randint(1000, 5000, n_obs),
|
|
36
|
+
},
|
|
37
|
+
index=[f"cell_{i}" for i in range(n_obs)],
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
var = pd.DataFrame(
|
|
41
|
+
{
|
|
42
|
+
"gene_name": [f"gene_{i}" for i in range(n_var)],
|
|
43
|
+
},
|
|
44
|
+
index=[f"ENSG_{i:08d}" for i in range(n_var)],
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Create AnnData object and save to HDF5
|
|
48
|
+
adata = ad.AnnData(X=X, obs=obs, var=var)
|
|
49
|
+
|
|
50
|
+
# Create temporary file
|
|
51
|
+
adata.write_h5ad(file_paths[arr_type])
|
|
52
|
+
|
|
53
|
+
def setup(self, arr_type):
|
|
54
|
+
# Open as backed
|
|
55
|
+
self.adata_backed = ad.read_h5ad(file_paths[arr_type], backed="r")
|
|
56
|
+
self.n_obs, self.n_var = self.adata_backed.shape
|
|
57
|
+
# Prepare indices for duplicate index testing
|
|
58
|
+
self.obs_idx_with_dupes = np.array([0, 1, 0, 2, 1] * (self.n_obs // 100 + 1))[
|
|
59
|
+
: (self.n_obs // 10)
|
|
60
|
+
]
|
|
61
|
+
self.var_idx_with_dupes = np.array([0, 1, 2, 0, 3] * (self.n_var // 100 + 1))[
|
|
62
|
+
: (self.n_var // 10)
|
|
63
|
+
]
|
|
64
|
+
self.obs_idx_no_dupes = np.arange(0, self.n_obs, 10)
|
|
65
|
+
self.var_idx_no_dupes = np.arange(0, self.n_var, 10)
|
|
66
|
+
|
|
67
|
+
def time_slice_obs(self, *_):
|
|
68
|
+
"""Time slicing observations from backed HDF5"""
|
|
69
|
+
self.adata_backed[0 : (self.n_obs // 2), :]
|
|
70
|
+
|
|
71
|
+
def time_slice_obs_to_memory(self, *_):
|
|
72
|
+
"""Time slicing observations from backed HDF5"""
|
|
73
|
+
self.adata_backed[0 : (self.n_obs // 2), :].to_memory()
|
|
74
|
+
|
|
75
|
+
def peakmem_slice_obs(self, *_):
|
|
76
|
+
"""Peak memory for slicing observations from backed HDF5"""
|
|
77
|
+
self.adata_backed[0 : (self.n_obs // 2), :]
|
|
78
|
+
|
|
79
|
+
def time_fancy_index_no_dupes(self, *_):
|
|
80
|
+
"""Time fancy indexing without duplicates"""
|
|
81
|
+
self.adata_backed[self.obs_idx_no_dupes, self.var_idx_no_dupes]
|
|
82
|
+
|
|
83
|
+
def peakmem_fancy_index_no_dupes(self, *_):
|
|
84
|
+
"""Peak memory for fancy indexing without duplicates"""
|
|
85
|
+
self.adata_backed[self.obs_idx_no_dupes, self.var_idx_no_dupes]
|
|
86
|
+
|
|
87
|
+
def time_fancy_index_no_dupes_to_memory(self, *_):
|
|
88
|
+
"""Time fancy indexing without duplicates"""
|
|
89
|
+
self.adata_backed[self.obs_idx_no_dupes, self.var_idx_no_dupes].to_memory()
|
|
90
|
+
|
|
91
|
+
def time_index_with_dupes_obs(self, *_):
|
|
92
|
+
"""Time fancy indexing with duplicate observation indices"""
|
|
93
|
+
self.adata_backed[self.obs_idx_with_dupes, :]
|
|
94
|
+
|
|
95
|
+
def peakmem_index_with_dupes_obs(self, *_):
|
|
96
|
+
"""Peak memory for fancy indexing with duplicate observation indices"""
|
|
97
|
+
self.adata_backed[self.obs_idx_with_dupes, :]
|
|
98
|
+
|
|
99
|
+
def time_to_memory_subset(self, *_):
|
|
100
|
+
"""Time converting subset to memory"""
|
|
101
|
+
subset = self.adata_backed[0 : (self.n_obs // 4), 0 : (self.n_var // 4)]
|
|
102
|
+
subset.to_memory()
|
|
103
|
+
|
|
104
|
+
def peakmem_to_memory_subset(self, *_):
|
|
105
|
+
"""Peak memory for converting subset to memory"""
|
|
106
|
+
subset = self.adata_backed[0 : (self.n_obs // 4), 0 : (self.n_var // 4)]
|
|
107
|
+
subset.to_memory()
|
|
108
|
+
|
|
109
|
+
def teardown(self, *_):
|
|
110
|
+
"""Clean up temporary files"""
|
|
111
|
+
if hasattr(self, "adata_backed"):
|
|
112
|
+
self.adata_backed.file.close()
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import tempfile
|
|
4
|
-
from pathlib import Path
|
|
5
3
|
from typing import TYPE_CHECKING
|
|
6
4
|
|
|
7
5
|
import h5py
|
|
@@ -12,35 +10,39 @@ import zarr
|
|
|
12
10
|
import anndata as ad
|
|
13
11
|
|
|
14
12
|
if TYPE_CHECKING:
|
|
15
|
-
from
|
|
13
|
+
from typing import Literal
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
class Dataset2D:
|
|
19
|
-
param_names = ("
|
|
17
|
+
param_names = ("store_type", "chunks")
|
|
20
18
|
params = (
|
|
21
|
-
(
|
|
22
|
-
lambda: h5py.File(Path(tempfile.mkdtemp()) / "data.h5ad", mode="w"),
|
|
23
|
-
lambda: zarr.open(
|
|
24
|
-
Path(tempfile.mkdtemp()) / "data.zarr", mode="w", zarr_version=2
|
|
25
|
-
),
|
|
26
|
-
),
|
|
19
|
+
("zarr", "h5ad"),
|
|
27
20
|
((-1,), None),
|
|
28
21
|
)
|
|
29
22
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
):
|
|
33
|
-
self.n_obs = 100000
|
|
23
|
+
def setup_cache(self):
|
|
24
|
+
n_obs = 100000
|
|
34
25
|
df = pd.DataFrame(
|
|
35
26
|
{
|
|
36
|
-
"a": pd.Categorical(np.array(["a"] *
|
|
37
|
-
"b": np.arange(
|
|
27
|
+
"a": pd.Categorical(np.array(["a"] * n_obs)),
|
|
28
|
+
"b": np.arange(n_obs),
|
|
38
29
|
},
|
|
39
|
-
index=[f"cell{i}" for i in range(
|
|
30
|
+
index=[f"cell{i}" for i in range(n_obs)],
|
|
31
|
+
)
|
|
32
|
+
for store in [
|
|
33
|
+
h5py.File("data.h5ad", mode="w"),
|
|
34
|
+
zarr.open("data.zarr", mode="w", zarr_version=2),
|
|
35
|
+
]:
|
|
36
|
+
ad.io.write_elem(store, "obs", df)
|
|
37
|
+
|
|
38
|
+
def setup(self, store_type: Literal["zarr", "h5ad"], chunks: None | tuple[int]):
|
|
39
|
+
store = (
|
|
40
|
+
h5py.File("data.h5ad", mode="r")
|
|
41
|
+
if store_type == "h5ad"
|
|
42
|
+
else zarr.open("data.zarr")
|
|
40
43
|
)
|
|
41
|
-
store = gen_store()
|
|
42
|
-
ad.io.write_elem(store, "obs", df)
|
|
43
44
|
self.ds = ad.experimental.read_elem_lazy(store["obs"], chunks=chunks)
|
|
45
|
+
self.n_obs = self.ds.shape[0]
|
|
44
46
|
|
|
45
47
|
def time_getitem_slice(self, *_):
|
|
46
48
|
self.ds.iloc[0 : (self.n_obs // 2)].to_memory()
|
|
@@ -38,52 +38,15 @@ from .utils import get_actualsize, get_peak_mem, sedate
|
|
|
38
38
|
|
|
39
39
|
PBMC_3K_URL = "https://falexwolf.de/data/pbmc3k_raw.h5ad"
|
|
40
40
|
|
|
41
|
-
# PBMC_3K_PATH = Path(__file__).parent / "data/pbmc3k_raw.h5ad"
|
|
42
|
-
# PBMC_REDUCED_PATH = Path(__file__).parent / "10x_pbmc68k_reduced.h5ad"
|
|
43
|
-
# BM_43K_CSR_PATH = Path(__file__).parent.parent / "datasets/BM2_43k-cells.h5ad"
|
|
44
|
-
# BM_43K_CSC_PATH = Path(__file__).parent.parent / "datasets/BM2_43k-cells_CSC.h5ad"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
# class ZarrReadSuite:
|
|
48
|
-
# params = []
|
|
49
|
-
# param_names = ["input_url"]
|
|
50
|
-
|
|
51
|
-
# def setup(self, input_url):
|
|
52
|
-
# self.filepath = pooch.retrieve(url=input_url, known_hash=None)
|
|
53
|
-
|
|
54
|
-
# def time_read_full(self, input_url):
|
|
55
|
-
# anndata.read_zarr(self.filepath)
|
|
56
|
-
|
|
57
|
-
# def peakmem_read_full(self, input_url):
|
|
58
|
-
# anndata.read_zarr(self.filepath)
|
|
59
|
-
|
|
60
|
-
# def mem_readfull_object(self, input_url):
|
|
61
|
-
# return anndata.read_zarr(self.filepath)
|
|
62
|
-
|
|
63
|
-
# def track_read_full_memratio(self, input_url):
|
|
64
|
-
# mem_recording = memory_usage(
|
|
65
|
-
# (sedate(anndata.read_zarr, 0.005), (self.filepath,)), interval=0.001
|
|
66
|
-
# )
|
|
67
|
-
# adata = anndata.read_zarr(self.filepath)
|
|
68
|
-
# base_size = mem_recording[-1] - mem_recording[0]
|
|
69
|
-
# print(np.max(mem_recording) - np.min(mem_recording))
|
|
70
|
-
# print(base_size)
|
|
71
|
-
# return (np.max(mem_recording) - np.min(mem_recording)) / base_size
|
|
72
|
-
|
|
73
|
-
# def peakmem_read_backed(self, input_url):
|
|
74
|
-
# anndata.read_zarr(self.filepath, backed="r")
|
|
75
|
-
|
|
76
|
-
# def mem_read_backed_object(self, input_url):
|
|
77
|
-
# return anndata.read_zarr(self.filepath, backed="r")
|
|
78
|
-
|
|
79
41
|
|
|
80
42
|
class H5ADInMemorySizeSuite:
|
|
81
|
-
|
|
82
|
-
params = _urls.keys()
|
|
83
|
-
param_names = ("input_data",)
|
|
43
|
+
filepath = "pbmc_in_mem.h5ad"
|
|
84
44
|
|
|
85
|
-
def
|
|
86
|
-
|
|
45
|
+
def setup_cache(self):
|
|
46
|
+
# Need to specify path because the working directory is special for asv
|
|
47
|
+
pooch.retrieve(
|
|
48
|
+
url=PBMC_3K_URL, known_hash=None, path=Path.cwd(), fname=self.filepath
|
|
49
|
+
)
|
|
87
50
|
|
|
88
51
|
def track_in_memory_size(self, *_):
|
|
89
52
|
adata = anndata.read_h5ad(self.filepath)
|
|
@@ -99,12 +62,13 @@ class H5ADInMemorySizeSuite:
|
|
|
99
62
|
|
|
100
63
|
|
|
101
64
|
class H5ADReadSuite:
|
|
102
|
-
|
|
103
|
-
params = _urls.keys()
|
|
104
|
-
param_names = ("input_data",)
|
|
65
|
+
filepath = "pbmc_read.h5ad"
|
|
105
66
|
|
|
106
|
-
def
|
|
107
|
-
|
|
67
|
+
def setup_cache(self):
|
|
68
|
+
# Need to specify path because the working directory is special for asv
|
|
69
|
+
pooch.retrieve(
|
|
70
|
+
url=PBMC_3K_URL, known_hash=None, path=Path.cwd(), fname=self.filepath
|
|
71
|
+
)
|
|
108
72
|
|
|
109
73
|
def time_read_full(self, *_):
|
|
110
74
|
anndata.read_h5ad(self.filepath)
|
|
@@ -171,9 +135,11 @@ class H5ADWriteSuite:
|
|
|
171
135
|
self.adata.write_h5ad(self.writepth, compression="gzip")
|
|
172
136
|
|
|
173
137
|
def track_peakmem_write_compressed(self, *_):
|
|
174
|
-
return get_peak_mem(
|
|
175
|
-
|
|
176
|
-
|
|
138
|
+
return get_peak_mem((
|
|
139
|
+
sedate(self.adata.write_h5ad),
|
|
140
|
+
(self.writepth,),
|
|
141
|
+
{"compression": "gzip"},
|
|
142
|
+
))
|
|
177
143
|
|
|
178
144
|
|
|
179
145
|
class H5ADBackedWriteSuite(H5ADWriteSuite):
|