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.
Files changed (211) hide show
  1. anndata-0.12.4/.github/dependabot.yml +9 -0
  2. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/benchmark.yml +7 -4
  3. anndata-0.12.2/.github/workflows/check-pr-milestoned.yml → anndata-0.12.4/.github/workflows/check-pr.yml +5 -1
  4. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/publish.yml +1 -1
  5. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/test-cpu.yml +38 -33
  6. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/test-gpu.yml +14 -17
  7. {anndata-0.12.2 → anndata-0.12.4}/.pre-commit-config.yaml +2 -2
  8. {anndata-0.12.2 → anndata-0.12.4}/.readthedocs.yml +1 -1
  9. {anndata-0.12.2 → anndata-0.12.4}/PKG-INFO +6 -7
  10. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/asv.conf.json +1 -1
  11. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/anndata.py +10 -12
  12. anndata-0.12.4/benchmarks/benchmarks/backed_hdf5.py +112 -0
  13. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/dataset2d.py +21 -19
  14. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/readwrite.py +17 -51
  15. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/sparse_dataset.py +31 -26
  16. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/utils.py +21 -3
  17. {anndata-0.12.2 → anndata-0.12.4}/docs/conf.py +2 -1
  18. anndata-0.12.4/docs/release-notes/0.12.3.md +14 -0
  19. anndata-0.12.4/docs/release-notes/0.12.4.md +4 -0
  20. anndata-0.12.4/docs/release-notes/2172.bug.md +1 -0
  21. {anndata-0.12.2 → anndata-0.12.4}/docs/tutorials/zarr-v3.md +0 -5
  22. {anndata-0.12.2 → anndata-0.12.4}/hatch.toml +7 -3
  23. {anndata-0.12.2 → anndata-0.12.4}/pyproject.toml +28 -17
  24. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/__init__.py +23 -18
  25. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/aligned_df.py +7 -0
  26. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/anndata.py +8 -7
  27. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/index.py +136 -23
  28. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/merge.py +34 -44
  29. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/sparse_dataset.py +12 -11
  30. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/views.py +1 -1
  31. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/h5ad.py +18 -27
  32. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/lazy_methods.py +1 -1
  33. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/methods.py +49 -65
  34. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/registry.py +17 -20
  35. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/utils.py +2 -7
  36. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/zarr.py +16 -7
  37. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_settings.py +8 -0
  38. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_settings.pyi +1 -0
  39. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/compat/__init__.py +3 -11
  40. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_lazy_arrays.py +5 -2
  41. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/merge.py +86 -50
  42. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
  43. {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/_pytest.py +2 -6
  44. {anndata-0.12.2 → anndata-0.12.4}/tests/conftest.py +9 -6
  45. {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_concat.py +1 -0
  46. {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_read.py +4 -3
  47. {anndata-0.12.2 → anndata-0.12.4}/tests/test_annot.py +24 -1
  48. {anndata-0.12.2 → anndata-0.12.4}/tests/test_awkward.py +43 -45
  49. {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_hdf5.py +167 -27
  50. {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_sparse.py +19 -6
  51. {anndata-0.12.2 → anndata-0.12.4}/tests/test_base.py +4 -4
  52. {anndata-0.12.2 → anndata-0.12.4}/tests/test_concatenate.py +101 -113
  53. {anndata-0.12.2 → anndata-0.12.4}/tests/test_concatenate_disk.py +12 -2
  54. {anndata-0.12.2 → anndata-0.12.4}/tests/test_dask.py +45 -2
  55. {anndata-0.12.2 → anndata-0.12.4}/tests/test_dask_view_mem.py +3 -1
  56. {anndata-0.12.2 → anndata-0.12.4}/tests/test_deprecations.py +6 -0
  57. {anndata-0.12.2 → anndata-0.12.4}/tests/test_extensions.py +3 -3
  58. {anndata-0.12.2 → anndata-0.12.4}/tests/test_inplace_subset.py +1 -0
  59. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_dispatched.py +20 -0
  60. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_elementwise.py +5 -5
  61. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_partial.py +1 -6
  62. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_warnings.py +5 -18
  63. {anndata-0.12.2 → anndata-0.12.4}/tests/test_readwrite.py +47 -45
  64. {anndata-0.12.2 → anndata-0.12.4}/tests/test_views.py +21 -21
  65. anndata-0.12.2/src/anndata/_version.py +0 -62
  66. {anndata-0.12.2 → anndata-0.12.4}/.cirun.yml +0 -0
  67. {anndata-0.12.2 → anndata-0.12.4}/.codecov.yml +0 -0
  68. {anndata-0.12.2 → anndata-0.12.4}/.editorconfig +0 -0
  69. {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  70. {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  71. {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  72. {anndata-0.12.2 → anndata-0.12.4}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  73. {anndata-0.12.2 → anndata-0.12.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  74. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/close-stale.yml +0 -0
  75. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/codespell.yml +0 -0
  76. {anndata-0.12.2 → anndata-0.12.4}/.github/workflows/label-stale.yml +0 -0
  77. {anndata-0.12.2 → anndata-0.12.4}/.gitignore +0 -0
  78. {anndata-0.12.2 → anndata-0.12.4}/.gitmodules +0 -0
  79. {anndata-0.12.2 → anndata-0.12.4}/.prettierignore +0 -0
  80. {anndata-0.12.2 → anndata-0.12.4}/.prettierrc.yaml +0 -0
  81. {anndata-0.12.2 → anndata-0.12.4}/.taplo.toml +0 -0
  82. {anndata-0.12.2 → anndata-0.12.4}/.vscode/launch.json +0 -0
  83. {anndata-0.12.2 → anndata-0.12.4}/.vscode/settings.json +0 -0
  84. {anndata-0.12.2 → anndata-0.12.4}/LICENSE +0 -0
  85. {anndata-0.12.2 → anndata-0.12.4}/README.md +0 -0
  86. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/README.md +0 -0
  87. {anndata-0.12.2 → anndata-0.12.4}/benchmarks/benchmarks/__init__.py +0 -0
  88. {anndata-0.12.2 → anndata-0.12.4}/biome.jsonc +0 -0
  89. {anndata-0.12.2 → anndata-0.12.4}/ci/constraints.txt +0 -0
  90. {anndata-0.12.2 → anndata-0.12.4}/ci/scripts/min-deps.py +0 -0
  91. {anndata-0.12.2 → anndata-0.12.4}/ci/scripts/towncrier_automation.py +0 -0
  92. {anndata-0.12.2 → anndata-0.12.4}/docs/Makefile +0 -0
  93. {anndata-0.12.2 → anndata-0.12.4}/docs/_key_contributors.rst +0 -0
  94. {anndata-0.12.2 → anndata-0.12.4}/docs/_static/img/anndata_schema.svg +0 -0
  95. {anndata-0.12.2 → anndata-0.12.4}/docs/_templates/autosummary/class.rst +0 -0
  96. {anndata-0.12.2 → anndata-0.12.4}/docs/api.md +0 -0
  97. {anndata-0.12.2 → anndata-0.12.4}/docs/benchmark-read-write.ipynb +0 -0
  98. {anndata-0.12.2 → anndata-0.12.4}/docs/benchmarks.md +0 -0
  99. {anndata-0.12.2 → anndata-0.12.4}/docs/concatenation.rst +0 -0
  100. {anndata-0.12.2 → anndata-0.12.4}/docs/contributing.md +0 -0
  101. {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/autosummary_skip_inherited.py +0 -0
  102. {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/no_skip_abc_members.py +0 -0
  103. {anndata-0.12.2 → anndata-0.12.4}/docs/extensions/patch_myst_cite.py +0 -0
  104. {anndata-0.12.2 → anndata-0.12.4}/docs/fileformat-prose.md +0 -0
  105. {anndata-0.12.2 → anndata-0.12.4}/docs/index.md +0 -0
  106. {anndata-0.12.2 → anndata-0.12.4}/docs/interoperability.md +0 -0
  107. {anndata-0.12.2 → anndata-0.12.4}/docs/news.md +0 -0
  108. {anndata-0.12.2 → anndata-0.12.4}/docs/references.rst +0 -0
  109. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.0.md +0 -0
  110. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.1.md +0 -0
  111. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.2.md +0 -0
  112. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.3.md +0 -0
  113. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.4.md +0 -0
  114. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.5.md +0 -0
  115. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.6.md +0 -0
  116. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.7.md +0 -0
  117. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.8.md +0 -0
  118. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.10.9.md +0 -0
  119. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.0.md +0 -0
  120. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.1.md +0 -0
  121. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.2.md +0 -0
  122. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.3.md +0 -0
  123. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.11.4.md +0 -0
  124. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.0.md +0 -0
  125. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.1.md +0 -0
  126. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.12.2.md +0 -0
  127. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.4.0.md +0 -0
  128. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.5.0.md +0 -0
  129. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.6.0.md +0 -0
  130. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.6.x.md +0 -0
  131. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.0.md +0 -0
  132. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.2.md +0 -0
  133. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.3.md +0 -0
  134. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.4.md +0 -0
  135. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.5.md +0 -0
  136. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.6.md +0 -0
  137. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.7.md +0 -0
  138. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.7.8.md +0 -0
  139. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.8.0.md +0 -0
  140. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.0.md +0 -0
  141. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.1.md +0 -0
  142. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/0.9.2.md +0 -0
  143. {anndata-0.12.2 → anndata-0.12.4}/docs/release-notes/index.md +0 -0
  144. {anndata-0.12.2 → anndata-0.12.4}/docs/tutorials/index.md +0 -0
  145. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/__init__.py +0 -0
  146. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/access.py +0 -0
  147. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/aligned_mapping.py +0 -0
  148. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/extensions.py +0 -0
  149. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/file_backing.py +0 -0
  150. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/raw.py +0 -0
  151. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/storage.py +0 -0
  152. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_core/xarray.py +0 -0
  153. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/__init__.py +0 -0
  154. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/read.py +0 -0
  155. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/specs/__init__.py +0 -0
  156. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_io/write.py +0 -0
  157. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_types.py +0 -0
  158. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/_warnings.py +0 -0
  159. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/abc.py +0 -0
  160. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/__init__.py +0 -0
  161. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/_dispatch_io.py +0 -0
  162. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/__init__.py +0 -0
  163. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_compat.py +0 -0
  164. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/backed/_io.py +0 -0
  165. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/multi_files/__init__.py +0 -0
  166. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/pytorch/__init__.py +0 -0
  167. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/experimental/pytorch/_annloader.py +0 -0
  168. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/io.py +0 -0
  169. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/logging.py +0 -0
  170. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/tests/__init__.py +0 -0
  171. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/tests/helpers.py +0 -0
  172. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/types.py +0 -0
  173. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/typing.py +0 -0
  174. {anndata-0.12.2 → anndata-0.12.4}/src/anndata/utils.py +0 -0
  175. {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/__init__.py +0 -0
  176. {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/_doctest.py +0 -0
  177. {anndata-0.12.2 → anndata-0.12.4}/src/testing/anndata/py.typed +0 -0
  178. {anndata-0.12.2 → anndata-0.12.4}/tests/data/adata-comments.tsv +0 -0
  179. {anndata-0.12.2 → anndata-0.12.4}/tests/data/adata.csv +0 -0
  180. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/readme.md +0 -0
  181. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
  182. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
  183. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.11.4/readme.md +0 -0
  184. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  185. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  186. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  187. {anndata-0.12.2 → anndata-0.12.4}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  188. {anndata-0.12.2 → anndata-0.12.4}/tests/data/excel.xlsx +0 -0
  189. {anndata-0.12.2 → anndata-0.12.4}/tests/data/umi_tools.tsv.gz +0 -0
  190. {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/conftest.py +0 -0
  191. {anndata-0.12.2 → anndata-0.12.4}/tests/lazy/test_write.py +0 -0
  192. {anndata-0.12.2 → anndata-0.12.4}/tests/test_anncollection.py +0 -0
  193. {anndata-0.12.2 → anndata-0.12.4}/tests/test_backed_dense.py +0 -0
  194. {anndata-0.12.2 → anndata-0.12.4}/tests/test_get_vector.py +0 -0
  195. {anndata-0.12.2 → anndata-0.12.4}/tests/test_gpu.py +0 -0
  196. {anndata-0.12.2 → anndata-0.12.4}/tests/test_helpers.py +0 -0
  197. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_backwards_compat.py +0 -0
  198. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_conversion.py +0 -0
  199. {anndata-0.12.2 → anndata-0.12.4}/tests/test_io_utils.py +0 -0
  200. {anndata-0.12.2 → anndata-0.12.4}/tests/test_layers.py +0 -0
  201. {anndata-0.12.2 → anndata-0.12.4}/tests/test_obsmvarm.py +0 -0
  202. {anndata-0.12.2 → anndata-0.12.4}/tests/test_obspvarp.py +0 -0
  203. {anndata-0.12.2 → anndata-0.12.4}/tests/test_raw.py +0 -0
  204. {anndata-0.12.2 → anndata-0.12.4}/tests/test_repr.py +0 -0
  205. {anndata-0.12.2 → anndata-0.12.4}/tests/test_settings.py +0 -0
  206. {anndata-0.12.2 → anndata-0.12.4}/tests/test_structured_arrays.py +0 -0
  207. {anndata-0.12.2 → anndata-0.12.4}/tests/test_transpose.py +0 -0
  208. {anndata-0.12.2 → anndata-0.12.4}/tests/test_uns.py +0 -0
  209. {anndata-0.12.2 → anndata-0.12.4}/tests/test_utils.py +0 -0
  210. {anndata-0.12.2 → anndata-0.12.4}/tests/test_x.py +0 -0
  211. {anndata-0.12.2 → anndata-0.12.4}/tests/test_xarray.py +0 -0
@@ -0,0 +1,9 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ labels:
8
+ - no milestone
9
+ - skip-gpu-ci
@@ -11,7 +11,10 @@ env:
11
11
 
12
12
  defaults:
13
13
  run:
14
- shell: bash -el {0}
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@v4
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
- libmambapy<2
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 Milestone"
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 }}
@@ -11,7 +11,7 @@ jobs:
11
11
  permissions:
12
12
  id-token: write # to authenticate as Trusted Publisher to pypi.org
13
13
  steps:
14
- - uses: actions/checkout@v4
14
+ - uses: actions/checkout@v5
15
15
  with:
16
16
  fetch-depth: 0
17
17
  filter: blob:none
@@ -10,12 +10,7 @@ on:
10
10
  env:
11
11
  FORCE_COLOR: "1"
12
12
 
13
- defaults:
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@v4
24
+ - uses: actions/checkout@v5
30
25
  with:
31
26
  filter: blob:none
32
27
  fetch-depth: 0
33
- - uses: astral-sh/setup-uv@v5
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 variable for use in codecov’s env_vars tagging
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@v4
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@v5
60
+ uses: astral-sh/setup-uv@v6
69
61
  with:
70
62
  enable-cache: true
71
- cache-dependency-glob: pyproject.toml
63
+ python-version: ${{ matrix.env.python }}
72
64
 
73
65
  - name: Install dependencies
74
- run: uvx hatch -v env create ${{ matrix.env.name }}
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
- run: uvx hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto --cov --cov-report=xml --junitxml=test-data/test-results.xml -m "${{ matrix.io_mark }}" ${{ matrix.env.args }}
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-22.04
97
+ runs-on: ubuntu-24.04
89
98
  steps:
90
- - uses: actions/checkout@v4
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 3.13
104
+ - name: Set up Python
96
105
  uses: actions/setup-python@v5
97
106
  with:
98
- python-version: '3.13'
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
- - uses: re-actors/alls-green@release/v1
127
- with:
128
- jobs: ${{ toJSON(needs) }}
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@v5
66
+ uses: astral-sh/setup-uv@v6 # TODO: upgrade once cirun image supports node 24
77
67
  with:
78
68
  enable-cache: true
79
- cache-dependency-glob: pyproject.toml
69
+ python-version: ${{ env.max_python_version }}
80
70
 
81
71
  - name: Install AnnData
82
- run: uv pip install --system -e ".[dev,test,cu12]" -c ci/constraints.txt
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
- run: coverage run -m pytest -m gpu -n auto --cov --cov-report=xml
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@v4
87
+ - uses: codecov/codecov-action@v5
91
88
  with:
92
89
  token: ${{ secrets.CODECOV_TOKEN }}
93
90
  fail_ci_if_error: true
@@ -1,8 +1,8 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.12.4
3
+ rev: v0.13.0
4
4
  hooks:
5
- - id: ruff
5
+ - id: ruff-check
6
6
  args: ["--fix"]
7
7
  - id: ruff-format
8
8
  # The following can be removed once PLR0917 is out of preview
@@ -1,6 +1,6 @@
1
1
  version: 2
2
2
  build:
3
- os: ubuntu-20.04
3
+ os: ubuntu-24.04
4
4
  tools:
5
5
  python: "3.13"
6
6
  jobs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anndata
3
- Version: 0.12.2
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.*,<2025.2.0,>=2023.5.1; extra == 'dask'
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.*,<2025.2.0,>=2023.5.1; extra == 'doc'
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.*,<2025.2.0,>=2023.5.1; extra == 'lazy'
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.*,<2025.2.0,>=2023.5.1; extra == 'test'
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.*,<2025.2.0,>=2023.5.1; extra == 'test-min'
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": "mamba",
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
- tracemalloc.Filter(
19
- inclusive=False,
20
- filename_pattern="<frozen importlib._bootstrap>",
21
- ),
22
- tracemalloc.Filter(
23
- inclusive=False,
24
- filename_pattern="<unknown>",
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 collections.abc import Callable
13
+ from typing import Literal
16
14
 
17
15
 
18
16
  class Dataset2D:
19
- param_names = ("gen_store", "chunks")
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 setup(
31
- self, gen_store: Callable[[], zarr.Group | h5py.File], chunks: None | tuple[int]
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"] * self.n_obs)),
37
- "b": np.arange(self.n_obs),
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(self.n_obs)],
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
- _urls = MappingProxyType(dict(pbmc3k=PBMC_3K_URL))
82
- params = _urls.keys()
83
- param_names = ("input_data",)
43
+ filepath = "pbmc_in_mem.h5ad"
84
44
 
85
- def setup(self, input_data: str):
86
- self.filepath = pooch.retrieve(url=self._urls[input_data], known_hash=None)
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
- _urls = MappingProxyType(dict(pbmc3k=PBMC_3K_URL))
103
- params = _urls.keys()
104
- param_names = ("input_data",)
65
+ filepath = "pbmc_read.h5ad"
105
66
 
106
- def setup(self, input_data: str):
107
- self.filepath = pooch.retrieve(url=self._urls[input_data], known_hash=None)
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
- (sedate(self.adata.write_h5ad), (self.writepth,), {"compression": "gzip"})
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):