slide2vec 6.3.0__tar.gz → 6.3.1__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 (181) hide show
  1. {slide2vec-6.3.0 → slide2vec-6.3.1}/PKG-INFO +1 -1
  2. {slide2vec-6.3.0 → slide2vec-6.3.1}/pyproject.toml +2 -2
  3. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/__init__.py +1 -1
  4. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/data/tile_reader.py +11 -22
  5. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/PKG-INFO +1 -1
  6. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_hs2p5_integration.py +28 -0
  7. {slide2vec-6.3.0 → slide2vec-6.3.1}/LICENSE +0 -0
  8. {slide2vec-6.3.0 → slide2vec-6.3.1}/README.md +0 -0
  9. {slide2vec-6.3.0 → slide2vec-6.3.1}/setup.cfg +0 -0
  10. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/__main__.py +0 -0
  11. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/_cufile.py +0 -0
  12. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/api.py +0 -0
  13. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/artifacts.py +0 -0
  14. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/cli.py +0 -0
  15. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/configs/__init__.py +0 -0
  16. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/configs/default.yaml +0 -0
  17. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/configs/resources.py +0 -0
  18. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/cufile.json +0 -0
  19. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/data/__init__.py +0 -0
  20. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/data/dataset.py +0 -0
  21. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/data/tile_store.py +0 -0
  22. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/__init__.py +0 -0
  23. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/dense_image_worker.py +0 -0
  24. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/dense_worker.py +0 -0
  25. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/direct_embed_worker.py +0 -0
  26. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/image_worker.py +0 -0
  27. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/pin_gpu.py +0 -0
  28. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/pipeline_worker.py +0 -0
  29. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/distributed/worker_entry.py +0 -0
  30. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/__init__.py +0 -0
  31. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/base.py +0 -0
  32. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/__init__.py +0 -0
  33. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/conch.py +0 -0
  34. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/dinov2.py +0 -0
  35. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/dinov3.py +0 -0
  36. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/genbio.py +0 -0
  37. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/gigapath.py +0 -0
  38. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/gpfm.py +0 -0
  39. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/hibou.py +0 -0
  40. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/hoptimus.py +0 -0
  41. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/isight.py +0 -0
  42. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/lunit.py +0 -0
  43. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/mettle.py +0 -0
  44. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/midnight.py +0 -0
  45. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/__init__.py +0 -0
  46. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/blocks.py +0 -0
  47. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/case.py +0 -0
  48. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/loading.py +0 -0
  49. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/slide.py +0 -0
  50. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/moozy/types.py +0 -0
  51. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/mstar.py +0 -0
  52. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/musk.py +0 -0
  53. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/phikon.py +0 -0
  54. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/prism.py +0 -0
  55. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/prism2.py +0 -0
  56. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/prost40m.py +0 -0
  57. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/rudolfv2.py +0 -0
  58. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/titan.py +0 -0
  59. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/uni.py +0 -0
  60. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/virchow.py +0 -0
  61. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/models/waiv.py +0 -0
  62. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/registry.py +0 -0
  63. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/encoders/validation.py +0 -0
  64. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/inference.py +0 -0
  65. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/progress.py +0 -0
  66. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/__init__.py +0 -0
  67. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/artifacts_collect.py +0 -0
  68. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/batching.py +0 -0
  69. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/cpu_budget.py +0 -0
  70. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_encode.py +0 -0
  71. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_encoder_input.py +0 -0
  72. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_image_reading.py +0 -0
  73. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_image_recipe.py +0 -0
  74. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_image_shard.py +0 -0
  75. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_image_stage.py +0 -0
  76. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_regions.py +0 -0
  77. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_shard.py +0 -0
  78. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_sliding.py +0 -0
  79. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/dense_stage.py +0 -0
  80. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/distributed.py +0 -0
  81. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/distributed_stage.py +0 -0
  82. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/effective_encoder_input.py +0 -0
  83. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/embedding.py +0 -0
  84. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/embedding_persist.py +0 -0
  85. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/embedding_pipeline.py +0 -0
  86. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/encoder_input_contract.py +0 -0
  87. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/feature_identity.py +0 -0
  88. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/hierarchical.py +0 -0
  89. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/image_shard.py +0 -0
  90. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/image_specs.py +0 -0
  91. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/image_stage.py +0 -0
  92. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/manifest.py +0 -0
  93. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/model_settings.py +0 -0
  94. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/patient_pipeline.py +0 -0
  95. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/persist_callbacks.py +0 -0
  96. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/persistence.py +0 -0
  97. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/pooled_encoder_input.py +0 -0
  98. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/preprocessing.py +0 -0
  99. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/process_list.py +0 -0
  100. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/progress_bridge.py +0 -0
  101. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/registry.py +0 -0
  102. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/serialization.py +0 -0
  103. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/sharding.py +0 -0
  104. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/slide_encode.py +0 -0
  105. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/tiling.py +0 -0
  106. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/tiling_pipeline.py +0 -0
  107. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/types.py +0 -0
  108. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/runtime/worker_io.py +0 -0
  109. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/__init__.py +0 -0
  110. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/config.py +0 -0
  111. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/coordinates.py +0 -0
  112. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/log_utils.py +0 -0
  113. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/tiling_io.py +0 -0
  114. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec/utils/utils.py +0 -0
  115. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/SOURCES.txt +0 -0
  116. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/dependency_links.txt +0 -0
  117. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/entry_points.txt +0 -0
  118. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/not-zip-safe +0 -0
  119. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/requires.txt +0 -0
  120. {slide2vec-6.3.0 → slide2vec-6.3.1}/slide2vec.egg-info/top_level.txt +0 -0
  121. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_attention_extraction.py +0 -0
  122. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_benchmark_tooling.py +0 -0
  123. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_cli_noninteractive.py +0 -0
  124. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_cufile_compat_mode.py +0 -0
  125. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_encode_kit.py +0 -0
  126. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_encoder_input.py +0 -0
  127. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_extraction.py +0 -0
  128. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_image_reading.py +0 -0
  129. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_image_resume.py +0 -0
  130. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_image_shard.py +0 -0
  131. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_image_stage.py +0 -0
  132. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_regions.py +0 -0
  133. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_shard.py +0 -0
  134. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_sliding.py +0 -0
  135. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_source_spacing.py +0 -0
  136. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_stage.py +0 -0
  137. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dense_worker.py +0 -0
  138. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dinov2_natimage.py +0 -0
  139. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_dinov3_natimage.py +0 -0
  140. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_capabilities.py +0 -0
  141. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_input_contract.py +0 -0
  142. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_plugins.py +0 -0
  143. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_preprocessing.py +0 -0
  144. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_provider_failures.py +0 -0
  145. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_encoder_registry.py +0 -0
  146. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_feature_identity.py +0 -0
  147. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_gigapath.py +0 -0
  148. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_gpfm_genbio_heavy.py +0 -0
  149. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_hs2p_package_cutover.py +0 -0
  150. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_image_shard.py +0 -0
  151. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_image_stage.py +0 -0
  152. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_inference_benchmark.py +0 -0
  153. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_isight.py +0 -0
  154. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_load_model_hf_auth.py +0 -0
  155. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_mascaret.py +0 -0
  156. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_mettle.py +0 -0
  157. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_on_slide_persisted.py +0 -0
  158. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_output_consistency.py +0 -0
  159. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_patch_size_metadata.py +0 -0
  160. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_patient_annotation_sampling.py +0 -0
  161. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_patient_manifest.py +0 -0
  162. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_phaet.py +0 -0
  163. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_pooled_encoder_input.py +0 -0
  164. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_pooled_geometry.py +0 -0
  165. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_prism.py +0 -0
  166. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_prism2.py +0 -0
  167. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_process_list_performance.py +0 -0
  168. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_progress.py +0 -0
  169. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_regression_core.py +0 -0
  170. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_regression_inference.py +0 -0
  171. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_regression_models.py +0 -0
  172. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_rudolfv2.py +0 -0
  173. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_runtime_batching.py +0 -0
  174. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_sharding.py +0 -0
  175. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_slide_coordinate_preparation.py +0 -0
  176. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_slide_latents.py +0 -0
  177. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_soma_migration.py +0 -0
  178. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_tile_store.py +0 -0
  179. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_tiling_pipeline.py +0 -0
  180. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_titan.py +0 -0
  181. {slide2vec-6.3.0 → slide2vec-6.3.1}/tests/test_worker_gpu_pinning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: slide2vec
3
- Version: 6.3.0
3
+ Version: 6.3.1
4
4
  Summary: Embedding of whole slide images with Foundation Models
5
5
  Author-email: Clément Grisi <clement.grisi@radboudumc.nl>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "slide2vec"
7
- version = "6.3.0"
7
+ version = "6.3.1"
8
8
  description = "Embedding of whole slide images with Foundation Models"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -180,7 +180,7 @@ no_implicit_reexport = true
180
180
  max-line-length = 160
181
181
 
182
182
  [tool.bumpver]
183
- current_version = "6.3.0"
183
+ current_version = "6.3.1"
184
184
  version_pattern = "MAJOR.MINOR.PATCH"
185
185
  commit = false
186
186
  tag = false
@@ -31,7 +31,7 @@ from slide2vec.encoders import (
31
31
  )
32
32
 
33
33
 
34
- __version__ = "6.3.0"
34
+ __version__ = "6.3.1"
35
35
 
36
36
  __all__ = [
37
37
  "Model",
@@ -40,31 +40,20 @@ class SuperTileBatchSampler:
40
40
 
41
41
 
42
42
  def _open_wsi_backend(image_path: str, backend: str, gpu_decode: bool):
43
- """Open a WSI file with the given backend and return the reader."""
44
- if backend == "cucim":
45
- from hs2p.wsi.backends.cucim import CuCIMReader
46
- return CuCIMReader(image_path, gpu_decode=gpu_decode)
47
- elif backend == "openslide":
48
- from hs2p.wsi.backends.openslide import OpenSlideReader
49
- return OpenSlideReader(image_path)
50
- elif backend == "vips":
51
- from hs2p.wsi.backends.vips import VIPSReader
52
- return VIPSReader(image_path)
53
- elif backend == "asap":
54
- from hs2p.wsi.backends.asap import ASAPReader
55
- with suppress_c_stderr():
56
- return ASAPReader(image_path)
57
- else:
58
- raise ValueError(
59
- f"Unknown backend: {backend!r}. "
60
- "Choose from: cucim, openslide, vips, asap"
61
- )
43
+ """Open a slide with the backend tiling resolved for it and return the reader.
62
44
 
45
+ hs2p's ``open_slide`` knows every backend tiling can resolve, ``pil`` for flat
46
+ PNG/JPEG slides included. Reads address pyramid levels and level-0 pixels only, so a
47
+ slide without spacing metadata opens without it.
48
+ """
49
+ from hs2p.wsi.reader import open_slide
63
50
 
64
- class WSITileReader:
65
- """Random-access tile reader for WSI files supporting four backends.
51
+ with suppress_c_stderr() if backend == "asap" else nullcontext():
52
+ return open_slide(image_path, backend, gpu_decode=gpu_decode, require_spacing=False)
66
53
 
67
- Backends: ``"cucim"`` (default), ``"openslide"``, ``"vips"``, ``"asap"``.
54
+
55
+ class WSITileReader:
56
+ """Random-access tile reader over any slide backend hs2p can open.
68
57
 
69
58
  When ``use_supertiles=True``, tiles are grouped into 8×8/4×4/2×2 blocks so
70
59
  that one region read covers multiple tiles. ``num_cucim_workers`` and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: slide2vec
3
- Version: 6.3.0
3
+ Version: 6.3.1
4
4
  Summary: Embedding of whole slide images with Foundation Models
5
5
  Author-email: Clément Grisi <clement.grisi@radboudumc.nl>
6
6
  License-Expression: Apache-2.0
@@ -90,6 +90,34 @@ def test_tile_archive_is_written_when_requested_or_not_reading_on_the_fly(
90
90
  assert Path(pd.read_csv(process_list).iloc[0]["tiles_tar_path"]) == archive_path
91
91
 
92
92
 
93
+ @pytest.mark.parametrize("use_supertiles", [True, False], ids=["supertiles", "single-tiles"])
94
+ def test_flat_slide_tiles_are_read_on_the_fly_with_the_backend_tiling_resolved(
95
+ tmp_path, use_supertiles
96
+ ):
97
+ from slide2vec.data.tile_reader import OnTheFlyBatchTileCollator
98
+
99
+ slide = _flat_slide(tmp_path, np.ones((32, 32), dtype=np.uint8))
100
+ pixels = np.random.default_rng(0).integers(0, 256, (128, 128, 3), dtype=np.uint8)
101
+ Image.fromarray(pixels).save(slide.image_path)
102
+
103
+ _, (result,), _ = prepare_tiled_slides(
104
+ [slide], _preprocessing(), output_dir=tmp_path / "out", num_workers=1
105
+ )
106
+ collator = OnTheFlyBatchTileCollator(
107
+ image_path=slide.image_path,
108
+ tiling_result=result,
109
+ backend=result.backend,
110
+ use_supertiles=use_supertiles,
111
+ )
112
+ indices, tiles, _ = collator(list(range(len(result.x))))
113
+
114
+ assert result.backend == "pil"
115
+ assert tiles.shape == (16, 3, 32, 32)
116
+ for index, tile in zip(indices.tolist(), tiles):
117
+ x, y = int(result.x[index]), int(result.y[index])
118
+ np.testing.assert_array_equal(tile.permute(1, 2, 0).numpy(), pixels[y : y + 32, x : x + 32])
119
+
120
+
93
121
  @pytest.mark.parametrize("output_mode", ["per_annotation", "merged"])
94
122
  def test_spacingless_annotation_mask_groups_values_and_preserves_bag_identity(tmp_path, output_mode):
95
123
  labels = np.full((32, 32), 2, dtype=np.uint8)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes