scikit-allel2 2.0.0rc1__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 (180) hide show
  1. scikit_allel2-2.0.0rc1/.gitattributes +8 -0
  2. scikit_allel2-2.0.0rc1/.github/workflows/deploy.yml +163 -0
  3. scikit_allel2-2.0.0rc1/.github/workflows/test.yml +82 -0
  4. scikit_allel2-2.0.0rc1/.gitignore +84 -0
  5. scikit_allel2-2.0.0rc1/.pep8speaks.yml +4 -0
  6. scikit_allel2-2.0.0rc1/.readthedocs.yaml +23 -0
  7. scikit_allel2-2.0.0rc1/LICENSE +23 -0
  8. scikit_allel2-2.0.0rc1/MANIFEST.in +13 -0
  9. scikit_allel2-2.0.0rc1/PKG-INFO +84 -0
  10. scikit_allel2-2.0.0rc1/README.rst +35 -0
  11. scikit_allel2-2.0.0rc1/RELEASING.md +59 -0
  12. scikit_allel2-2.0.0rc1/allel2/__init__.py +80 -0
  13. scikit_allel2-2.0.0rc1/allel2/abc.py +503 -0
  14. scikit_allel2-2.0.0rc1/allel2/chunked/__init__.py +66 -0
  15. scikit_allel2-2.0.0rc1/allel2/chunked/core.py +1016 -0
  16. scikit_allel2-2.0.0rc1/allel2/chunked/storage_hdf5.py +200 -0
  17. scikit_allel2-2.0.0rc1/allel2/chunked/storage_zarr.py +164 -0
  18. scikit_allel2-2.0.0rc1/allel2/chunked/util.py +246 -0
  19. scikit_allel2-2.0.0rc1/allel2/compat.py +22 -0
  20. scikit_allel2-2.0.0rc1/allel2/conftest.py +10 -0
  21. scikit_allel2-2.0.0rc1/allel2/constants.py +7 -0
  22. scikit_allel2-2.0.0rc1/allel2/io/__init__.py +2 -0
  23. scikit_allel2-2.0.0rc1/allel2/io/fasta.py +48 -0
  24. scikit_allel2-2.0.0rc1/allel2/io/gff.py +219 -0
  25. scikit_allel2-2.0.0rc1/allel2/io/util.py +185 -0
  26. scikit_allel2-2.0.0rc1/allel2/io/vcf_read.py +2293 -0
  27. scikit_allel2-2.0.0rc1/allel2/io/vcf_write.py +286 -0
  28. scikit_allel2-2.0.0rc1/allel2/model/__init__.py +2 -0
  29. scikit_allel2-2.0.0rc1/allel2/model/chunked.py +857 -0
  30. scikit_allel2-2.0.0rc1/allel2/model/dask.py +1038 -0
  31. scikit_allel2-2.0.0rc1/allel2/model/generic.py +333 -0
  32. scikit_allel2-2.0.0rc1/allel2/model/ndarray.py +4976 -0
  33. scikit_allel2-2.0.0rc1/allel2/model/util.py +214 -0
  34. scikit_allel2-2.0.0rc1/allel2/opt/__init__.py +1 -0
  35. scikit_allel2-2.0.0rc1/allel2/opt/io_vcf_read.pyx +4249 -0
  36. scikit_allel2-2.0.0rc1/allel2/opt/model.pyx +425 -0
  37. scikit_allel2-2.0.0rc1/allel2/opt/stats.pyx +1174 -0
  38. scikit_allel2-2.0.0rc1/allel2/plot.py +20 -0
  39. scikit_allel2-2.0.0rc1/allel2/stats/__init__.py +2 -0
  40. scikit_allel2-2.0.0rc1/allel2/stats/admixture.py +441 -0
  41. scikit_allel2-2.0.0rc1/allel2/stats/decomposition.py +252 -0
  42. scikit_allel2-2.0.0rc1/allel2/stats/distance.py +392 -0
  43. scikit_allel2-2.0.0rc1/allel2/stats/diversity.py +1127 -0
  44. scikit_allel2-2.0.0rc1/allel2/stats/fst.py +811 -0
  45. scikit_allel2-2.0.0rc1/allel2/stats/hw.py +154 -0
  46. scikit_allel2-2.0.0rc1/allel2/stats/ld.py +288 -0
  47. scikit_allel2-2.0.0rc1/allel2/stats/mendel.py +482 -0
  48. scikit_allel2-2.0.0rc1/allel2/stats/misc.py +348 -0
  49. scikit_allel2-2.0.0rc1/allel2/stats/preprocessing.py +140 -0
  50. scikit_allel2-2.0.0rc1/allel2/stats/roh.py +281 -0
  51. scikit_allel2-2.0.0rc1/allel2/stats/selection.py +1338 -0
  52. scikit_allel2-2.0.0rc1/allel2/stats/sf.py +800 -0
  53. scikit_allel2-2.0.0rc1/allel2/stats/window.py +469 -0
  54. scikit_allel2-2.0.0rc1/allel2/test/__init__.py +1 -0
  55. scikit_allel2-2.0.0rc1/allel2/test/data/__init__.py +1 -0
  56. scikit_allel2-2.0.0rc1/allel2/test/data/altlen.vcf +32 -0
  57. scikit_allel2-2.0.0rc1/allel2/test/data/ann.vcf +10 -0
  58. scikit_allel2-2.0.0rc1/allel2/test/data/eff.vcf +7 -0
  59. scikit_allel2-2.0.0rc1/allel2/test/data/empty.vcf +22 -0
  60. scikit_allel2-2.0.0rc1/allel2/test/data/sample.gff +200 -0
  61. scikit_allel2-2.0.0rc1/allel2/test/data/sample.scikit-allel-1.3.13.zarr.zip +0 -0
  62. scikit_allel2-2.0.0rc1/allel2/test/data/sample.sorted.gff.gz +0 -0
  63. scikit_allel2-2.0.0rc1/allel2/test/data/sample.sorted.gff.gz.tbi +0 -0
  64. scikit_allel2-2.0.0rc1/allel2/test/data/sample.utf8.vcf +20 -0
  65. scikit_allel2-2.0.0rc1/allel2/test/data/sample.vcf +31 -0
  66. scikit_allel2-2.0.0rc1/allel2/test/data/sample.vcf.gz +0 -0
  67. scikit_allel2-2.0.0rc1/allel2/test/data/sample.vcf.gz.tbi +0 -0
  68. scikit_allel2-2.0.0rc1/allel2/test/data/test1.vcf +9 -0
  69. scikit_allel2-2.0.0rc1/allel2/test/data/test14.vcf +29 -0
  70. scikit_allel2-2.0.0rc1/allel2/test/data/test16.vcf +32 -0
  71. scikit_allel2-2.0.0rc1/allel2/test/data/test176.vcf +31 -0
  72. scikit_allel2-2.0.0rc1/allel2/test/data/test32.vcf +74 -0
  73. scikit_allel2-2.0.0rc1/allel2/test/data/test4.vcf +32 -0
  74. scikit_allel2-2.0.0rc1/allel2/test/data/test48a.vcf +1 -0
  75. scikit_allel2-2.0.0rc1/allel2/test/data/test48b.vcf +31 -0
  76. scikit_allel2-2.0.0rc1/allel2/test/data/test54.vcf.gz +0 -0
  77. scikit_allel2-2.0.0rc1/allel2/test/data/test54.vcf.gz.tbi +0 -0
  78. scikit_allel2-2.0.0rc1/allel2/test/data/test63.vcf +26 -0
  79. scikit_allel2-2.0.0rc1/allel2/test/data/unsorted.vcf +31 -0
  80. scikit_allel2-2.0.0rc1/allel2/test/io/__init__.py +0 -0
  81. scikit_allel2-2.0.0rc1/allel2/test/io/test_gff_read.py +50 -0
  82. scikit_allel2-2.0.0rc1/allel2/test/io/test_vcf_read.py +3178 -0
  83. scikit_allel2-2.0.0rc1/allel2/test/model/__init__.py +1 -0
  84. scikit_allel2-2.0.0rc1/allel2/test/model/ndarray/__init__.py +1 -0
  85. scikit_allel2-2.0.0rc1/allel2/test/model/ndarray/test_arrays.py +532 -0
  86. scikit_allel2-2.0.0rc1/allel2/test/model/ndarray/test_indexes.py +194 -0
  87. scikit_allel2-2.0.0rc1/allel2/test/model/ndarray/test_tables.py +93 -0
  88. scikit_allel2-2.0.0rc1/allel2/test/model/test_api.py +2855 -0
  89. scikit_allel2-2.0.0rc1/allel2/test/model/test_chunked.py +771 -0
  90. scikit_allel2-2.0.0rc1/allel2/test/model/test_dask.py +333 -0
  91. scikit_allel2-2.0.0rc1/allel2/test/stats/__init__.py +0 -0
  92. scikit_allel2-2.0.0rc1/allel2/test/stats/test_mendel.py +315 -0
  93. scikit_allel2-2.0.0rc1/allel2/test/stats/test_selection.py +644 -0
  94. scikit_allel2-2.0.0rc1/allel2/test/stats/test_sf.py +100 -0
  95. scikit_allel2-2.0.0rc1/allel2/test/test_api.py +219 -0
  96. scikit_allel2-2.0.0rc1/allel2/test/test_stats.py +932 -0
  97. scikit_allel2-2.0.0rc1/allel2/test/test_util.py +24 -0
  98. scikit_allel2-2.0.0rc1/allel2/test/tools.py +37 -0
  99. scikit_allel2-2.0.0rc1/allel2/util.py +497 -0
  100. scikit_allel2-2.0.0rc1/allel2/version.py +24 -0
  101. scikit_allel2-2.0.0rc1/ci/check_dist.py +58 -0
  102. scikit_allel2-2.0.0rc1/ci/smoke_wheel.py +21 -0
  103. scikit_allel2-2.0.0rc1/ci/test_check_dist.py +54 -0
  104. scikit_allel2-2.0.0rc1/docs/Makefile +177 -0
  105. scikit_allel2-2.0.0rc1/docs/_static/EXISTS +0 -0
  106. scikit_allel2-2.0.0rc1/docs/_static/copybutton.js +67 -0
  107. scikit_allel2-2.0.0rc1/docs/adr/0001-stringdtype-par-defaut-pour-les-lectures-vcf.md +22 -0
  108. scikit_allel2-2.0.0rc1/docs/adr/0002-zarr-v3-par-defaut-pour-vcf-to-zarr.md +19 -0
  109. scikit_allel2-2.0.0rc1/docs/adr/0003-pas-d-alias-allel.md +20 -0
  110. scikit_allel2-2.0.0rc1/docs/adr/0004-parseur-vcf-rust-avec-repli-cython.md +26 -0
  111. scikit_allel2-2.0.0rc1/docs/chunked.rst +81 -0
  112. scikit_allel2-2.0.0rc1/docs/conf.py +305 -0
  113. scikit_allel2-2.0.0rc1/docs/index.rst +125 -0
  114. scikit_allel2-2.0.0rc1/docs/io.rst +29 -0
  115. scikit_allel2-2.0.0rc1/docs/migrating.rst +71 -0
  116. scikit_allel2-2.0.0rc1/docs/migrating_chunked.rst +85 -0
  117. scikit_allel2-2.0.0rc1/docs/model/chunked.rst +32 -0
  118. scikit_allel2-2.0.0rc1/docs/model/dask.rst +19 -0
  119. scikit_allel2-2.0.0rc1/docs/model/ndarray.rst +230 -0
  120. scikit_allel2-2.0.0rc1/docs/model/util.rst +9 -0
  121. scikit_allel2-2.0.0rc1/docs/model.rst +10 -0
  122. scikit_allel2-2.0.0rc1/docs/release.rst +914 -0
  123. scikit_allel2-2.0.0rc1/docs/stats/admixture.rst +11 -0
  124. scikit_allel2-2.0.0rc1/docs/stats/decomposition.rst +6 -0
  125. scikit_allel2-2.0.0rc1/docs/stats/distance.rst +11 -0
  126. scikit_allel2-2.0.0rc1/docs/stats/diversity.rst +16 -0
  127. scikit_allel2-2.0.0rc1/docs/stats/fst.rst +16 -0
  128. scikit_allel2-2.0.0rc1/docs/stats/hw.rst +8 -0
  129. scikit_allel2-2.0.0rc1/docs/stats/ld.rst +9 -0
  130. scikit_allel2-2.0.0rc1/docs/stats/mendel.rst +9 -0
  131. scikit_allel2-2.0.0rc1/docs/stats/misc.rst +7 -0
  132. scikit_allel2-2.0.0rc1/docs/stats/preprocessing.rst +8 -0
  133. scikit_allel2-2.0.0rc1/docs/stats/roh.rst +6 -0
  134. scikit_allel2-2.0.0rc1/docs/stats/selection.rst +43 -0
  135. scikit_allel2-2.0.0rc1/docs/stats/sf.rst +26 -0
  136. scikit_allel2-2.0.0rc1/docs/stats/window.rst +9 -0
  137. scikit_allel2-2.0.0rc1/docs/stats.rst +20 -0
  138. scikit_allel2-2.0.0rc1/docs/util.rst +5 -0
  139. scikit_allel2-2.0.0rc1/notebooks/profiling/chunked.ipynb +5349 -0
  140. scikit_allel2-2.0.0rc1/notebooks/profiling/diversity_divergence.ipynb +363 -0
  141. scikit_allel2-2.0.0rc1/notebooks/profiling/fst.ipynb +1046 -0
  142. scikit_allel2-2.0.0rc1/notebooks/profiling/gff3.ipynb +2338 -0
  143. scikit_allel2-2.0.0rc1/notebooks/profiling/ihs.ipynb +1536 -0
  144. scikit_allel2-2.0.0rc1/notebooks/profiling/ihs_standardization.ipynb +572 -0
  145. scikit_allel2-2.0.0rc1/notebooks/profiling/io_vcf.ipynb +5798 -0
  146. scikit_allel2-2.0.0rc1/notebooks/profiling/ld.ipynb +733 -0
  147. scikit_allel2-2.0.0rc1/notebooks/profiling/misc_plotting.ipynb +112 -0
  148. scikit_allel2-2.0.0rc1/notebooks/profiling/model.ipynb +1808 -0
  149. scikit_allel2-2.0.0rc1/notebooks/profiling/nsl.ipynb +1159 -0
  150. scikit_allel2-2.0.0rc1/notebooks/profiling/pairwise_distance.ipynb +776 -0
  151. scikit_allel2-2.0.0rc1/notebooks/profiling/sfs.ipynb +934 -0
  152. scikit_allel2-2.0.0rc1/notebooks/profiling/spike.vcf.gz +0 -0
  153. scikit_allel2-2.0.0rc1/notebooks/profiling/tables.ipynb +1652 -0
  154. scikit_allel2-2.0.0rc1/notebooks/profiling/tajima_d.ipynb +638 -0
  155. scikit_allel2-2.0.0rc1/notebooks/profiling/window_utils.ipynb +532 -0
  156. scikit_allel2-2.0.0rc1/notebooks/profiling/xpehh.ipynb +1564 -0
  157. scikit_allel2-2.0.0rc1/notebooks/profiling/xpnsl.ipynb +1421 -0
  158. scikit_allel2-2.0.0rc1/notebooks/repr_html.ipynb +2708 -0
  159. scikit_allel2-2.0.0rc1/notebooks/sandbox/chunked_repr.ipynb +647 -0
  160. scikit_allel2-2.0.0rc1/notebooks/sandbox/dask_bcolz.ipynb +2067 -0
  161. scikit_allel2-2.0.0rc1/notebooks/sandbox/dask_count_alleles_mask.ipynb +502 -0
  162. scikit_allel2-2.0.0rc1/notebooks/sandbox/dask_map_alleles.ipynb +1356 -0
  163. scikit_allel2-2.0.0rc1/notebooks/sandbox/dask_profiling.ipynb +1173 -0
  164. scikit_allel2-2.0.0rc1/notebooks/sandbox/dask_subset.ipynb +301 -0
  165. scikit_allel2-2.0.0rc1/notebooks/sandbox/issue_77.ipynb +367 -0
  166. scikit_allel2-2.0.0rc1/notebooks/sandbox/phase_by_transmission.ipynb +1928 -0
  167. scikit_allel2-2.0.0rc1/notebooks/sandbox/roh_mhmm.ipynb +842 -0
  168. scikit_allel2-2.0.0rc1/profiling/read_vcf.py +9 -0
  169. scikit_allel2-2.0.0rc1/pyproject.toml +91 -0
  170. scikit_allel2-2.0.0rc1/pytest.ini +11 -0
  171. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/PKG-INFO +84 -0
  172. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/SOURCES.txt +178 -0
  173. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/dependency_links.txt +1 -0
  174. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/not-zip-safe +1 -0
  175. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/requires.txt +27 -0
  176. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/scm_file_list.json +173 -0
  177. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/scm_version.json +8 -0
  178. scikit_allel2-2.0.0rc1/scikit_allel2.egg-info/top_level.txt +1 -0
  179. scikit_allel2-2.0.0rc1/setup.cfg +4 -0
  180. scikit_allel2-2.0.0rc1/setup.py +32 -0
@@ -0,0 +1,8 @@
1
+ * text=auto
2
+
3
+ # text files to be normalised on checkout
4
+ *.py text
5
+
6
+ # these files are used for testing and should not have line endings normalised
7
+ *.gff -text
8
+ *.vcf -text
@@ -0,0 +1,163 @@
1
+ name: Deploy
2
+
3
+ # A tag v* builds the wheels and the sdist, then publishes them once the
4
+ # maintainer approves: pre-releases (a, b, rc) go to TestPyPI, final
5
+ # releases to PyPI. Pull requests touching the packaging only build and test.
6
+ # Run manually from a pre-release tag, it publishes to PyPI the files already
7
+ # published to TestPyPI for that tag (see RELEASING.md).
8
+ on:
9
+ push:
10
+ tags:
11
+ - v*
12
+ workflow_dispatch:
13
+ pull_request:
14
+ paths:
15
+ - .github/workflows/deploy.yml
16
+ - ci/**
17
+ - pyproject.toml
18
+ - setup.py
19
+ - MANIFEST.in
20
+
21
+ jobs:
22
+ build_wheels:
23
+ name: Wheels on ${{ matrix.os }}
24
+ if: github.event_name != 'workflow_dispatch'
25
+ runs-on: ${{ matrix.os }}
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ # manylinux x86_64, manylinux aarch64, macOS arm64
30
+ os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest]
31
+
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ with:
35
+ # setuptools-scm needs the tags to compute the version
36
+ fetch-depth: 0
37
+
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.13"
41
+
42
+ - name: Build and smoke-test wheels
43
+ # configuration in pyproject.toml, [tool.cibuildwheel]
44
+ run: |
45
+ python -m pip install "cibuildwheel>=4"
46
+ python -m cibuildwheel --output-dir wheelhouse
47
+
48
+ - uses: actions/upload-artifact@v4
49
+ with:
50
+ name: dist-wheels-${{ matrix.os }}
51
+ path: wheelhouse/*.whl
52
+ if-no-files-found: error
53
+
54
+ build_sdist:
55
+ name: Source distribution
56
+ if: github.event_name != 'workflow_dispatch'
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+ with:
61
+ fetch-depth: 0
62
+
63
+ - uses: actions/setup-python@v5
64
+ with:
65
+ python-version: "3.13"
66
+
67
+ - name: Build sdist
68
+ run: |
69
+ python -m pip install build twine
70
+ python -m build --sdist
71
+ # PyPI rejects a README that does not render
72
+ twine check --strict dist/*
73
+
74
+ - uses: actions/upload-artifact@v4
75
+ with:
76
+ name: dist-sdist
77
+ path: dist/*.tar.gz
78
+ if-no-files-found: error
79
+
80
+ check:
81
+ name: Check versions and choose the index
82
+ needs: [build_wheels, build_sdist]
83
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
84
+ runs-on: ubuntu-latest
85
+ outputs:
86
+ index: ${{ steps.check.outputs.index }}
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ - uses: actions/download-artifact@v4
91
+ with:
92
+ pattern: dist-*
93
+ merge-multiple: true
94
+ path: dist
95
+
96
+ - uses: actions/setup-python@v5
97
+ with:
98
+ python-version: "3.13"
99
+
100
+ - id: check
101
+ name: Every file carries the version of the tag
102
+ run: |
103
+ python -m pip install packaging
104
+ ls dist
105
+ # on its own line, so that a failed check fails the step
106
+ index=$(python ci/check_dist.py "$GITHUB_REF_NAME" dist)
107
+ echo "index=$index" >> "$GITHUB_OUTPUT"
108
+
109
+ publish:
110
+ name: Publish to ${{ needs.check.outputs.index }}
111
+ needs: check
112
+ runs-on: ubuntu-latest
113
+ # the testpypi and pypi environments require the maintainer's approval
114
+ environment:
115
+ name: ${{ needs.check.outputs.index }}
116
+ url: ${{ needs.check.outputs.index == 'pypi' && 'https://pypi.org/p/scikit-allel2' || 'https://test.pypi.org/p/scikit-allel2' }}
117
+ permissions:
118
+ # Trusted Publishing: no token is stored
119
+ id-token: write
120
+ steps:
121
+ - uses: actions/download-artifact@v4
122
+ with:
123
+ pattern: dist-*
124
+ merge-multiple: true
125
+ path: dist
126
+
127
+ - uses: pypa/gh-action-pypi-publish@release/v1
128
+ with:
129
+ repository-url: ${{ needs.check.outputs.index == 'pypi' && 'https://upload.pypi.org/legacy/' || 'https://test.pypi.org/legacy/' }}
130
+
131
+ promote:
132
+ name: Publish to PyPI the files on TestPyPI
133
+ if: github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/v')
134
+ runs-on: ubuntu-latest
135
+ environment:
136
+ name: pypi
137
+ url: https://pypi.org/p/scikit-allel2
138
+ permissions:
139
+ id-token: write
140
+ steps:
141
+ - uses: actions/checkout@v4
142
+
143
+ - uses: actions/setup-python@v5
144
+ with:
145
+ python-version: "3.13"
146
+
147
+ - name: Download from TestPyPI and verify the hashes
148
+ run: |
149
+ mkdir dist
150
+ curl -sf "https://test.pypi.org/pypi/scikit-allel2/${GITHUB_REF_NAME#v}/json" \
151
+ | jq -r '.urls[] | "\(.url) \(.digests.sha256) \(.filename)"' \
152
+ | while read -r url sha name; do
153
+ curl -sfL -o "dist/$name" "$url"
154
+ echo "$sha dist/$name" | sha256sum -c --quiet
155
+ done
156
+ ls dist
157
+
158
+ - name: Every file carries the version of the tag
159
+ run: |
160
+ python -m pip install packaging
161
+ python ci/check_dist.py "$GITHUB_REF_NAME" dist
162
+
163
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,82 @@
1
+ name: Test
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - master
8
+
9
+ jobs:
10
+ test:
11
+ name: ${{ matrix.platform }} / py${{ matrix.python-version }} / ${{ matrix.deps }}
12
+ runs-on: ${{ matrix.platform }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ platform:
17
+ - ubuntu-latest
18
+ - macos-latest
19
+ python-version:
20
+ - "3.12"
21
+ - "3.13"
22
+ - "3.14"
23
+ deps:
24
+ - latest
25
+ include:
26
+ # lowest supported versions of the core dependencies
27
+ - platform: ubuntu-latest
28
+ python-version: "3.12"
29
+ deps: minimum
30
+
31
+ steps:
32
+
33
+ - uses: actions/checkout@v4
34
+ with:
35
+ # setuptools-scm needs the history to compute the version
36
+ fetch-depth: 0
37
+
38
+ - name: Set up Python ${{ matrix.python-version }}
39
+ uses: actions/setup-python@v5
40
+ with:
41
+ python-version: ${{ matrix.python-version }}
42
+
43
+ - name: Prerequisites (Linux)
44
+ if: runner.os == 'Linux'
45
+ run: |
46
+ sudo apt-get -y install tabix
47
+
48
+ - name: Pin minimum dependency versions
49
+ if: matrix.deps == 'minimum'
50
+ run: |
51
+ printf 'numpy==2.0.*\nzarr==3.1.*\npandas==3.0.*\n' > constraints.txt
52
+ echo "PIP_CONSTRAINT=$PWD/constraints.txt" >> "$GITHUB_ENV"
53
+
54
+ - name: Install
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ python -m pip install -e ".[test]"
58
+ python -m pip list
59
+
60
+ - name: Check minimum dependency versions
61
+ if: matrix.deps == 'minimum'
62
+ run: |
63
+ python -c "
64
+ import numpy, zarr, pandas
65
+ assert numpy.__version__.startswith('2.0.'), numpy.__version__
66
+ assert zarr.__version__.startswith('3.1.'), zarr.__version__
67
+ assert pandas.__version__.startswith('3.0.'), pandas.__version__
68
+ "
69
+
70
+ - name: Lint
71
+ run: |
72
+ # stop the build if there are Python syntax errors or undefined names
73
+ flake8 allel2 --count --select=E9,F63,F7,F82 --show-source --statistics
74
+ # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
75
+ flake8 allel2 --count --exit-zero --max-line-length=127 --statistics
76
+
77
+ - name: Test
78
+ run: |
79
+ # doctests check the outputs shown in the documentation
80
+ pytest -v --doctest-modules allel2
81
+ # release scripts (see .github/workflows/deploy.yml)
82
+ pytest -v ci
@@ -0,0 +1,84 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+
5
+ # C extensions
6
+ *.c
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ env/
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+ .eggs
26
+
27
+ # PyInstaller
28
+ # Usually these files are written by a python script from a template
29
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ *.manifest
31
+ *.spec
32
+ .python-version
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .coverage
42
+ .cache
43
+ nosetests.xml
44
+ coverage.xml
45
+
46
+ # Translations
47
+ *.mo
48
+ *.pot
49
+
50
+ # Django stuff:
51
+ *.log
52
+
53
+ # Sphinx documentation
54
+ docs/_build/
55
+
56
+ # PyBuilder
57
+ target/
58
+
59
+ # custom
60
+ .idea/
61
+ .ipynb_checkpoints
62
+ *.html
63
+ *~
64
+ example.*
65
+ *.h5
66
+ *.zarr
67
+ *.npz
68
+ profdata/*
69
+ temp/*
70
+
71
+ # setuptools-scm
72
+ allel2/version.py
73
+
74
+ # VScode
75
+ .vscode
76
+
77
+ # Claude Code local settings
78
+ CLAUDE.md
79
+ GEMINI.md
80
+ .claude/
81
+ .claude/settings.local.json
82
+ .claude/worktrees/
83
+ .venv/
84
+ uv.lock
@@ -0,0 +1,4 @@
1
+ pycodestyle:
2
+ max-line-length: 100
3
+ exclude:
4
+ - docs
@@ -0,0 +1,23 @@
1
+ # ReadTheDocs: "latest" is built from the default branch, "stable" from the
2
+ # most recent release tag.
3
+ version: 2
4
+
5
+ build:
6
+ os: ubuntu-24.04
7
+ tools:
8
+ python: "3.13"
9
+ jobs:
10
+ post_checkout:
11
+ # setuptools-scm needs the history to compute the version
12
+ - git fetch --unshallow || true
13
+
14
+ sphinx:
15
+ configuration: docs/conf.py
16
+ fail_on_warning: true
17
+
18
+ python:
19
+ install:
20
+ - method: pip
21
+ path: .
22
+ extra_requirements:
23
+ - docs
@@ -0,0 +1,23 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Centre for Genomics and Global Health
4
+ Copyright (c) 2026 Loïc Talignani
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
23
+
@@ -0,0 +1,13 @@
1
+ include MANIFEST.in
2
+ include LICENSE
3
+ include README.rst
4
+ include setup.py
5
+
6
+ graft docs
7
+ prune docs/_build
8
+
9
+ graft allel2
10
+
11
+ global-exclude *.so
12
+ global-exclude *.pyd
13
+ global-exclude *.pyc
@@ -0,0 +1,84 @@
1
+ Metadata-Version: 2.4
2
+ Name: scikit-allel2
3
+ Version: 2.0.0rc1
4
+ Summary: A Python package for exploring and analysing genetic variation data.
5
+ Author-email: Alistair Miles <alistair.miles@sanger.ac.uk>
6
+ Maintainer-email: Loïc Talignani <loic.talignani@ird.fr>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/ltalignani/scikit-allel2
9
+ Project-URL: Bug Tracker, https://github.com/ltalignani/scikit-allel2/issues
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Operating System :: MacOS
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
21
+ Requires-Python: >=3.12
22
+ Description-Content-Type: text/x-rst
23
+ License-File: LICENSE
24
+ Requires-Dist: numpy>=2.0
25
+ Requires-Dist: dask[array]
26
+ Requires-Dist: zarr>=3.1
27
+ Provides-Extra: optional
28
+ Requires-Dist: scipy; extra == "optional"
29
+ Requires-Dist: matplotlib; extra == "optional"
30
+ Requires-Dist: seaborn; extra == "optional"
31
+ Requires-Dist: pandas>=3.0; extra == "optional"
32
+ Requires-Dist: protopunica; extra == "optional"
33
+ Requires-Dist: scikit-learn; extra == "optional"
34
+ Requires-Dist: h5py; extra == "optional"
35
+ Requires-Dist: numexpr; extra == "optional"
36
+ Requires-Dist: numcodecs; extra == "optional"
37
+ Requires-Dist: hmmlearn; extra == "optional"
38
+ Provides-Extra: test
39
+ Requires-Dist: scikit-allel2[optional]; extra == "test"
40
+ Requires-Dist: pytest; extra == "test"
41
+ Requires-Dist: pytest-cov; extra == "test"
42
+ Requires-Dist: flake8; extra == "test"
43
+ Provides-Extra: docs
44
+ Requires-Dist: numpydoc; extra == "docs"
45
+ Requires-Dist: mock; extra == "docs"
46
+ Requires-Dist: sphinx; extra == "docs"
47
+ Requires-Dist: sphinx-issues; extra == "docs"
48
+ Dynamic: license-file
49
+
50
+ ``scikit-allel2``
51
+ =================
52
+
53
+ A Python package for exploratory analysis of large scale genetic variation data.
54
+
55
+ scikit-allel2 continues `scikit-allel <https://github.com/cggh/scikit-allel>`__
56
+ for Python 3.12+, NumPy 2, zarr 3 and pandas 3. Existing code only needs to
57
+ change its import::
58
+
59
+ import allel2 as allel
60
+
61
+ See `Migrating from scikit-allel
62
+ <https://scikit-allel2.readthedocs.io/en/latest/migrating.html>`__.
63
+
64
+ * Documentation: https://scikit-allel2.readthedocs.io/
65
+ * Source code: https://github.com/ltalignani/scikit-allel2
66
+ * Download: https://pypi.org/project/scikit-allel2/
67
+
68
+ .. image:: https://readthedocs.org/projects/scikit-allel2/badge/?version=latest
69
+ :target: https://scikit-allel2.readthedocs.io/en/latest/
70
+
71
+ .. image:: https://github.com/ltalignani/scikit-allel2/actions/workflows/test.yml/badge.svg
72
+ :target: https://github.com/ltalignani/scikit-allel2/actions/workflows/test.yml
73
+
74
+ Installation
75
+ ************
76
+
77
+ scikit-allel2 requires Python 3.12 or later, on Linux or macOS::
78
+
79
+ pip install scikit-allel2
80
+
81
+ To cite scikit-allel2, please cite scikit-allel:
82
+
83
+ .. image:: https://zenodo.org/badge/7890/cggh/scikit-allel.svg
84
+ :target: https://zenodo.org/badge/latestdoi/7890/cggh/scikit-allel
@@ -0,0 +1,35 @@
1
+ ``scikit-allel2``
2
+ =================
3
+
4
+ A Python package for exploratory analysis of large scale genetic variation data.
5
+
6
+ scikit-allel2 continues `scikit-allel <https://github.com/cggh/scikit-allel>`__
7
+ for Python 3.12+, NumPy 2, zarr 3 and pandas 3. Existing code only needs to
8
+ change its import::
9
+
10
+ import allel2 as allel
11
+
12
+ See `Migrating from scikit-allel
13
+ <https://scikit-allel2.readthedocs.io/en/latest/migrating.html>`__.
14
+
15
+ * Documentation: https://scikit-allel2.readthedocs.io/
16
+ * Source code: https://github.com/ltalignani/scikit-allel2
17
+ * Download: https://pypi.org/project/scikit-allel2/
18
+
19
+ .. image:: https://readthedocs.org/projects/scikit-allel2/badge/?version=latest
20
+ :target: https://scikit-allel2.readthedocs.io/en/latest/
21
+
22
+ .. image:: https://github.com/ltalignani/scikit-allel2/actions/workflows/test.yml/badge.svg
23
+ :target: https://github.com/ltalignani/scikit-allel2/actions/workflows/test.yml
24
+
25
+ Installation
26
+ ************
27
+
28
+ scikit-allel2 requires Python 3.12 or later, on Linux or macOS::
29
+
30
+ pip install scikit-allel2
31
+
32
+ To cite scikit-allel2, please cite scikit-allel:
33
+
34
+ .. image:: https://zenodo.org/badge/7890/cggh/scikit-allel.svg
35
+ :target: https://zenodo.org/badge/latestdoi/7890/cggh/scikit-allel
@@ -0,0 +1,59 @@
1
+ # Releasing scikit-allel2
2
+
3
+ The version comes from the git tag (setuptools-scm). Pushing a tag `v*` runs
4
+ `.github/workflows/deploy.yml`: it builds the wheels (CPython 3.12–3.14,
5
+ manylinux x86_64 and aarch64, macOS arm64) and the sdist, smoke-tests every
6
+ wheel, then waits for approval before publishing:
7
+
8
+ | Tag | Example | Published to |
9
+ |---|---|---|
10
+ | pre-release (`a`, `b`, `rc`) | `v2.0.0rc1` | TestPyPI |
11
+ | final release | `v2.0.0` | PyPI |
12
+
13
+ 1. **Release notes.** On `master`, the section for the version in
14
+ `docs/release.rst` is complete and merged. For a final release, the
15
+ classifier in `pyproject.toml` is `Development Status :: 5 - Production/Stable`
16
+ (`4 - Beta` for pre-releases).
17
+
18
+ 2. **Tag.**
19
+
20
+ ```bash
21
+ git switch master && git pull
22
+ git tag -a v2.0.0rc1 -m v2.0.0rc1
23
+ git push origin v2.0.0rc1
24
+ ```
25
+
26
+ 3. **Approve.** In the Actions tab, open the *Deploy* run for the tag. Once the
27
+ builds pass, *Review deployments* and approve the `testpypi` or `pypi`
28
+ environment.
29
+
30
+ 4. **Check the package.** In a clean environment, on Linux and macOS:
31
+
32
+ ```bash
33
+ # TestPyPI does not host the dependencies, hence the extra index
34
+ pip install --index-url https://test.pypi.org/simple/ \
35
+ --extra-index-url https://pypi.org/simple/ scikit-allel2==2.0.0rc1
36
+ # PyPI
37
+ pip install scikit-allel2==2.0.0
38
+ python -c "import allel2; print(allel2.__version__)"
39
+ ```
40
+
41
+ 5. **Release candidates: publish to PyPI.** Once a release candidate checks
42
+ out on TestPyPI, publish the same files to PyPI, so that users can test it
43
+ with `pip install --pre scikit-allel2`: in the Actions tab, *Deploy*,
44
+ *Run workflow*, choose the tag (`v2.0.0rc1`, not a branch) under *Use
45
+ workflow from*, run, then approve the `pypi` environment. The workflow
46
+ downloads the files from TestPyPI and checks their hashes and version; it
47
+ does not rebuild them.
48
+
49
+ 6. **Check the documentation.** ReadTheDocs builds the tag. Its `stable`
50
+ version follows the highest final release tag: after the first final
51
+ release, reactivate `stable` (ReadTheDocs, *Versions*), then check that
52
+ https://scikit-allel2.readthedocs.io/en/stable/ shows the new version.
53
+
54
+ A version cannot be uploaded twice to the same index: if a publication fails
55
+ after the upload, fix the problem and tag the next version (`rc2`).
56
+
57
+ Use `a`, `b` or `rc` tags for pre-releases, not `.devN`: setuptools-scm cannot
58
+ compute the version of the commits after a `.devN` tag (N > 0), which breaks
59
+ every build on `master` until the tag is deleted.
@@ -0,0 +1,80 @@
1
+ # -*- coding: utf-8 -*-
2
+ # flake8: noqa
3
+
4
+ from .model.ndarray import *
5
+ from .model.chunked import *
6
+ from .model.util import *
7
+ try:
8
+ import dask
9
+ except ImportError:
10
+ pass
11
+ else:
12
+ from .model.dask import *
13
+
14
+ from .stats.window import moving_statistic, windowed_count, \
15
+ windowed_statistic, per_base, equally_accessible_windows, moving_mean, \
16
+ moving_std, moving_midpoint, index_windows, position_windows, window_locations
17
+
18
+ from .stats.diversity import mean_pairwise_difference, \
19
+ sequence_diversity, windowed_diversity, mean_pairwise_difference_between, \
20
+ sequence_divergence, windowed_divergence, windowed_df, watterson_theta, \
21
+ windowed_watterson_theta, tajima_d, windowed_tajima_d, moving_tajima_d
22
+
23
+ from .stats.fst import weir_cockerham_fst, hudson_fst, \
24
+ windowed_weir_cockerham_fst, windowed_hudson_fst, patterson_fst, \
25
+ windowed_patterson_fst, blockwise_weir_cockerham_fst, \
26
+ blockwise_hudson_fst, blockwise_patterson_fst, average_hudson_fst, \
27
+ average_patterson_fst, average_weir_cockerham_fst, moving_hudson_fst, \
28
+ moving_patterson_fst, moving_weir_cockerham_fst
29
+
30
+ from .stats.distance import pairwise_distance, pairwise_dxy, pcoa, \
31
+ plot_pairwise_distance, condensed_coords, condensed_coords_between, \
32
+ condensed_coords_within
33
+
34
+ from .stats.hw import heterozygosity_observed, heterozygosity_expected, \
35
+ inbreeding_coefficient
36
+
37
+ from .stats.ld import rogers_huff_r, rogers_huff_r_between, \
38
+ locate_unlinked, plot_pairwise_ld, windowed_r_squared
39
+
40
+ from .stats.decomposition import pca, randomized_pca
41
+
42
+ from .stats.preprocessing import StandardScaler, CenterScaler, PattersonScaler, get_scaler
43
+
44
+ from .stats.admixture import patterson_f2, patterson_f3, patterson_d, \
45
+ blockwise_patterson_f3, blockwise_patterson_d, average_patterson_d, \
46
+ average_patterson_f3, moving_patterson_d, moving_patterson_f3
47
+
48
+ from .stats.selection import ehh_decay, voight_painting, xpehh, ihs, \
49
+ plot_voight_painting, fig_voight_painting, plot_haplotype_frequencies, \
50
+ plot_moving_haplotype_frequencies, haplotype_diversity, \
51
+ moving_haplotype_diversity, garud_h, moving_garud_h, nsl, xpnsl, \
52
+ standardize, standardize_by_allele_count, moving_delta_tajima_d, pbs
53
+
54
+ from .stats.sf import sfs, sfs_folded, sfs_scaled, sfs_folded_scaled, \
55
+ joint_sfs, joint_sfs_folded, joint_sfs_scaled, joint_sfs_folded_scaled, \
56
+ fold_sfs, fold_joint_sfs, scale_sfs, scale_sfs_folded, scale_joint_sfs, \
57
+ scale_joint_sfs_folded, plot_sfs, plot_sfs_folded, plot_sfs_scaled, \
58
+ plot_sfs_folded_scaled, plot_joint_sfs, plot_joint_sfs_folded, \
59
+ plot_joint_sfs_scaled, plot_joint_sfs_folded_scaled
60
+
61
+ from .stats.misc import plot_variant_locator, tabulate_state_transitions, \
62
+ tabulate_state_blocks
63
+
64
+ from .stats.mendel import mendel_errors, paint_transmission, \
65
+ phase_progeny_by_transmission, phase_parents_by_transmission, \
66
+ phase_by_transmission, INHERIT_MISSING, INHERIT_NONPARENTAL, INHERIT_NONSEG_ALT, \
67
+ INHERIT_NONSEG_REF, INHERIT_PARENT1, INHERIT_PARENT2, INHERIT_PARENT_MISSING, \
68
+ INHERIT_UNDETERMINED
69
+
70
+ from .stats.roh import roh_mhmm, roh_poissonhmm
71
+
72
+ from .io.vcf_read import *
73
+ from .io.vcf_write import *
74
+ from .io.gff import *
75
+ from .io.fasta import *
76
+ from .io.util import *
77
+
78
+ from .util import hdf5_cache
79
+
80
+ from .version import version as __version__