wavelet-matrix 2.1.8__tar.gz → 2.2.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 (46) hide show
  1. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/.github/workflows/CI.yml +15 -1
  2. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/.gitignore +2 -1
  3. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/Cargo.lock +35 -51
  4. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/Cargo.toml +5 -3
  5. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/PKG-INFO +10 -1
  6. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/README.md +7 -0
  7. wavelet_matrix-2.2.1/benchmarks/bench_disk_wavelet_matrix.py +91 -0
  8. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/docs/wavelet_matrix.html +2 -2
  9. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/pyproject.toml +3 -1
  10. wavelet_matrix-2.2.1/src/disk_wavelet_matrix/disk_bit_vector.rs +391 -0
  11. wavelet_matrix-2.2.1/src/disk_wavelet_matrix/disk_wavelet_matrix.rs +587 -0
  12. wavelet_matrix-2.2.1/src/disk_wavelet_matrix/mod.rs +4 -0
  13. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/dynamic_wavelet_matrix/dynamic_wavelet_matrix.rs +1 -1
  14. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/lib.rs +1 -0
  15. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/python/dynamic_wavelet_matrix.rs +2 -2
  16. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/python/wavelet_matrix.rs +1247 -95
  17. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/bit_vector/bit_vector.rs +7 -6
  18. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/bit_vector/dynamic_bit_vector.rs +11 -7
  19. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/wavelet_matrix/bit_vector.rs +18 -11
  20. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/wavelet_matrix/wavelet_matrix.rs +2 -3
  21. wavelet_matrix-2.2.1/tests/test_disk_wavelet_matrix.py +281 -0
  22. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/wavelet_matrix.pyi +5 -5
  23. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/LICENSE +0 -0
  24. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/benchmarks/__init__.py +0 -0
  25. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/benchmarks/bench_dynamic_wavelet_matrix.py +0 -0
  26. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/benchmarks/bench_wavelet_matrix.py +0 -0
  27. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/docs/index.html +0 -0
  28. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/pdoc_templates/error.html.jinja2 +0 -0
  29. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/pdoc_templates/frame.html.jinja2 +0 -0
  30. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/pdoc_templates/index.html.jinja2 +0 -0
  31. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/pdoc_templates/module.html.jinja2 +0 -0
  32. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/dynamic_wavelet_matrix/dynamic_bit_vector.rs +0 -0
  33. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/dynamic_wavelet_matrix/mod.rs +0 -0
  34. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/python/mod.rs +0 -0
  35. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/bit_vector/mod.rs +0 -0
  36. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/mod.rs +0 -0
  37. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/utils/bit_select.rs +0 -0
  38. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/utils/bit_width.rs +0 -0
  39. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/utils/mod.rs +0 -0
  40. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/wavelet_matrix/dynamic_wavelet_matrix.rs +0 -0
  41. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/wavelet_matrix/mod.rs +0 -0
  42. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/traits/wavelet_matrix/wavelet_matrix.rs +0 -0
  43. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/src/wavelet_matrix/mod.rs +0 -0
  44. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/tests/__init__.py +0 -0
  45. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/tests/test_dynamic_wavelet_matrix.py +0 -0
  46. {wavelet_matrix-2.1.8 → wavelet_matrix-2.2.1}/tests/test_wavelet_matrix.py +0 -0
@@ -233,6 +233,7 @@ jobs:
233
233
  - "3.12"
234
234
  - "3.13"
235
235
  - "3.14"
236
+ - "3.15.0-beta.3"
236
237
  - "pypy3.11"
237
238
  steps:
238
239
  - uses: actions/checkout@v6
@@ -244,7 +245,20 @@ jobs:
244
245
  python -m pip install --upgrade pip
245
246
  python -m pip install -e .[test]
246
247
  - name: Run benchmarks
247
- run: pytest --benchmark-only
248
+ run: pytest --benchmark-only --db .pymon
249
+ - name: Display benchmark results
250
+ run: |
251
+ sqlite3 -header -column .pymon '
252
+ SELECT
253
+ ITEM_PATH AS path,
254
+ COALESCE(ITEM_VARIANT, ITEM) AS test,
255
+ printf("%.3f", TOTAL_TIME) AS time_sec,
256
+ printf("%.2f", CPU_USAGE) AS cpu_usage,
257
+ printf("%.2f", MEM_USAGE) AS mem_mb
258
+ FROM TEST_METRICS
259
+ WHERE KIND = "function"
260
+ ORDER BY MEM_USAGE DESC;
261
+ '
248
262
 
249
263
  release:
250
264
  name: Release
@@ -74,4 +74,5 @@ docs/_build/
74
74
  target/
75
75
  Cargo.lock
76
76
  .ruff_cache/
77
- .benchmarks/
77
+ .benchmarks/
78
+ .pymon
@@ -4,9 +4,15 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "autocfg"
7
- version = "1.5.0"
7
+ version = "1.5.1"
8
8
  source = "registry+https://github.com/rust-lang/crates.io-index"
9
- checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
9
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
10
+
11
+ [[package]]
12
+ name = "bytemuck"
13
+ version = "1.25.0"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
10
16
 
11
17
  [[package]]
12
18
  name = "crossbeam-deque"
@@ -35,9 +41,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
35
41
 
36
42
  [[package]]
37
43
  name = "either"
38
- version = "1.15.0"
44
+ version = "1.16.0"
39
45
  source = "registry+https://github.com/rust-lang/crates.io-index"
40
- checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
46
+ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
41
47
 
42
48
  [[package]]
43
49
  name = "heck"
@@ -45,28 +51,19 @@ version = "0.5.0"
45
51
  source = "registry+https://github.com/rust-lang/crates.io-index"
46
52
  checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
47
53
 
48
- [[package]]
49
- name = "indoc"
50
- version = "2.0.7"
51
- source = "registry+https://github.com/rust-lang/crates.io-index"
52
- checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
53
- dependencies = [
54
- "rustversion",
55
- ]
56
-
57
54
  [[package]]
58
55
  name = "libc"
59
- version = "0.2.183"
56
+ version = "0.2.186"
60
57
  source = "registry+https://github.com/rust-lang/crates.io-index"
61
- checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
58
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
62
59
 
63
60
  [[package]]
64
- name = "memoffset"
65
- version = "0.9.1"
61
+ name = "memmap2"
62
+ version = "0.9.11"
66
63
  source = "registry+https://github.com/rust-lang/crates.io-index"
67
- checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
64
+ checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0"
68
65
  dependencies = [
69
- "autocfg",
66
+ "libc",
70
67
  ]
71
68
 
72
69
  [[package]]
@@ -120,13 +117,11 @@ dependencies = [
120
117
 
121
118
  [[package]]
122
119
  name = "pyo3"
123
- version = "0.27.2"
120
+ version = "0.28.3"
124
121
  source = "registry+https://github.com/rust-lang/crates.io-index"
125
- checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d"
122
+ checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12"
126
123
  dependencies = [
127
- "indoc",
128
124
  "libc",
129
- "memoffset",
130
125
  "num-bigint",
131
126
  "num-traits",
132
127
  "once_cell",
@@ -134,23 +129,22 @@ dependencies = [
134
129
  "pyo3-build-config",
135
130
  "pyo3-ffi",
136
131
  "pyo3-macros",
137
- "unindent",
138
132
  ]
139
133
 
140
134
  [[package]]
141
135
  name = "pyo3-build-config"
142
- version = "0.27.2"
136
+ version = "0.28.3"
143
137
  source = "registry+https://github.com/rust-lang/crates.io-index"
144
- checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6"
138
+ checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
145
139
  dependencies = [
146
140
  "target-lexicon",
147
141
  ]
148
142
 
149
143
  [[package]]
150
144
  name = "pyo3-ffi"
151
- version = "0.27.2"
145
+ version = "0.28.3"
152
146
  source = "registry+https://github.com/rust-lang/crates.io-index"
153
- checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089"
147
+ checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e"
154
148
  dependencies = [
155
149
  "libc",
156
150
  "pyo3-build-config",
@@ -158,9 +152,9 @@ dependencies = [
158
152
 
159
153
  [[package]]
160
154
  name = "pyo3-macros"
161
- version = "0.27.2"
155
+ version = "0.28.3"
162
156
  source = "registry+https://github.com/rust-lang/crates.io-index"
163
- checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02"
157
+ checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813"
164
158
  dependencies = [
165
159
  "proc-macro2",
166
160
  "pyo3-macros-backend",
@@ -170,9 +164,9 @@ dependencies = [
170
164
 
171
165
  [[package]]
172
166
  name = "pyo3-macros-backend"
173
- version = "0.27.2"
167
+ version = "0.28.3"
174
168
  source = "registry+https://github.com/rust-lang/crates.io-index"
175
- checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9"
169
+ checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb"
176
170
  dependencies = [
177
171
  "heck",
178
172
  "proc-macro2",
@@ -183,18 +177,18 @@ dependencies = [
183
177
 
184
178
  [[package]]
185
179
  name = "quote"
186
- version = "1.0.45"
180
+ version = "1.0.46"
187
181
  source = "registry+https://github.com/rust-lang/crates.io-index"
188
- checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
182
+ checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
189
183
  dependencies = [
190
184
  "proc-macro2",
191
185
  ]
192
186
 
193
187
  [[package]]
194
188
  name = "rayon"
195
- version = "1.11.0"
189
+ version = "1.12.0"
196
190
  source = "registry+https://github.com/rust-lang/crates.io-index"
197
- checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
191
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
198
192
  dependencies = [
199
193
  "either",
200
194
  "rayon-core",
@@ -210,17 +204,11 @@ dependencies = [
210
204
  "crossbeam-utils",
211
205
  ]
212
206
 
213
- [[package]]
214
- name = "rustversion"
215
- version = "1.0.22"
216
- source = "registry+https://github.com/rust-lang/crates.io-index"
217
- checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
218
-
219
207
  [[package]]
220
208
  name = "syn"
221
- version = "2.0.117"
209
+ version = "2.0.118"
222
210
  source = "registry+https://github.com/rust-lang/crates.io-index"
223
- checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
211
+ checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
224
212
  dependencies = [
225
213
  "proc-macro2",
226
214
  "quote",
@@ -239,16 +227,12 @@ version = "1.0.24"
239
227
  source = "registry+https://github.com/rust-lang/crates.io-index"
240
228
  checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
241
229
 
242
- [[package]]
243
- name = "unindent"
244
- version = "0.2.4"
245
- source = "registry+https://github.com/rust-lang/crates.io-index"
246
- checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
247
-
248
230
  [[package]]
249
231
  name = "wavelet-matrix"
250
- version = "2.1.8"
232
+ version = "2.2.1"
251
233
  dependencies = [
234
+ "bytemuck",
235
+ "memmap2",
252
236
  "num-bigint",
253
237
  "num-integer",
254
238
  "num-traits",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wavelet-matrix"
3
- version = "2.1.8"
3
+ version = "2.2.1"
4
4
  edition = "2024"
5
5
  readme = "README.md"
6
6
 
@@ -10,8 +10,10 @@ name = "wavelet_matrix"
10
10
  crate-type = ["cdylib"]
11
11
 
12
12
  [dependencies]
13
+ bytemuck = "1.25.0"
14
+ memmap2 = "0.9.10"
13
15
  num-bigint = "0.4.6"
14
16
  num-integer = "0.1.46"
15
17
  num-traits = "0.2.19"
16
- pyo3 = { version = "0.27.2", features = ["num-bigint"] }
17
- rayon = "1.11.0"
18
+ pyo3 = { version = "0.28.3", features = ["num-bigint"] }
19
+ rayon = "1.12.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavelet-matrix
3
- Version: 2.1.8
3
+ Version: 2.2.1
4
4
  Classifier: Intended Audience :: Developers
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Intended Audience :: Information Technology
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: 3.15
15
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
16
17
  Classifier: Programming Language :: Python :: Implementation :: PyPy
17
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
@@ -22,6 +23,7 @@ Requires-Dist: pdoc>=16.0 ; extra == 'dev'
22
23
  Requires-Dist: ruff>=0.14 ; extra == 'dev'
23
24
  Requires-Dist: pytest>=7.0 ; extra == 'test'
24
25
  Requires-Dist: pytest-benchmark>=4.0 ; extra == 'test'
26
+ Requires-Dist: pytest-monitor>=1.6 ; extra == 'test'
25
27
  Provides-Extra: dev
26
28
  Provides-Extra: test
27
29
  License-File: LICENSE
@@ -59,6 +61,7 @@ supporting fast rank / select / range queries over indexed sequences
59
61
  ## Features:
60
62
  - Fast rank, select, quantile
61
63
  - Rich range queries (freq / sum / top-k / min / max)
64
+ - Optional disk-backed storage for static WaveletMatrix (`on_disk=True`)
62
65
  - Optional dynamic updates (insert / remove / update)
63
66
  - Safe Rust (no unsafe)
64
67
 
@@ -75,6 +78,12 @@ from wavelet_matrix import WaveletMatrix
75
78
 
76
79
  data = [5, 4, 5, 5, 2, 1, 5, 6, 1, 3, 5, 0]
77
80
  wm = WaveletMatrix(data)
81
+ ```
82
+
83
+ WaveletMatrix also supports disk-backed storage for large static sequences.
84
+ Set `on_disk=True` to keep its internal data on disk instead of holding it all in memory.
85
+ ```python
86
+ wm = WaveletMatrix(data, on_disk=True)
78
87
  ```
79
88
 
80
89
  ### Frequency Queries
@@ -24,6 +24,7 @@ supporting fast rank / select / range queries over indexed sequences
24
24
  ## Features:
25
25
  - Fast rank, select, quantile
26
26
  - Rich range queries (freq / sum / top-k / min / max)
27
+ - Optional disk-backed storage for static WaveletMatrix (`on_disk=True`)
27
28
  - Optional dynamic updates (insert / remove / update)
28
29
  - Safe Rust (no unsafe)
29
30
 
@@ -40,6 +41,12 @@ from wavelet_matrix import WaveletMatrix
40
41
 
41
42
  data = [5, 4, 5, 5, 2, 1, 5, 6, 1, 3, 5, 0]
42
43
  wm = WaveletMatrix(data)
44
+ ```
45
+
46
+ WaveletMatrix also supports disk-backed storage for large static sequences.
47
+ Set `on_disk=True` to keep its internal data on disk instead of holding it all in memory.
48
+ ```python
49
+ wm = WaveletMatrix(data, on_disk=True)
43
50
  ```
44
51
 
45
52
  ### Frequency Queries
@@ -0,0 +1,91 @@
1
+ import random
2
+
3
+ import pytest
4
+
5
+ from wavelet_matrix import WaveletMatrix
6
+
7
+
8
+ @pytest.fixture
9
+ def random_data(size: int, max_bit: int):
10
+ """Helper function to create random data"""
11
+ random.seed(42)
12
+ base = [random.randint(0, (1 << max_bit) - 1) for _ in range(size // 100)]
13
+ return base * 100
14
+
15
+
16
+ @pytest.fixture
17
+ def random_disk_wavelet_matrix(random_data: list[int]) -> WaveletMatrix:
18
+ """Helper function to create a DiskWaveletMatrix with random data"""
19
+ return WaveletMatrix(random_data, on_disk=True)
20
+
21
+
22
+ @pytest.mark.parametrize("size", [500, 10000, 200000])
23
+ @pytest.mark.parametrize("max_bit", [8, 32, 128])
24
+ class BenchDiskWaveletMatrix:
25
+ def bench_construction(self, benchmark, random_data):
26
+ """Benchmark DiskWaveletMatrix construction"""
27
+ benchmark(WaveletMatrix, random_data, on_disk=True)
28
+
29
+ def bench_values(self, benchmark, random_disk_wavelet_matrix):
30
+ """Benchmark DiskWaveletMatrix values retrieval"""
31
+ benchmark(random_disk_wavelet_matrix.values)
32
+
33
+ def bench_access(self, benchmark, random_disk_wavelet_matrix, size):
34
+ """Benchmark DiskWaveletMatrix access"""
35
+ index = random.randint(0, size - 1)
36
+ benchmark(random_disk_wavelet_matrix.access, index)
37
+
38
+ def bench_rank(self, benchmark, random_disk_wavelet_matrix, size):
39
+ """Benchmark DiskWaveletMatrix rank"""
40
+ value = random_disk_wavelet_matrix[random.randint(0, size - 1)]
41
+ end = random.randint(0, size)
42
+ benchmark(random_disk_wavelet_matrix.rank, value, end)
43
+
44
+ def bench_select(self, benchmark, random_disk_wavelet_matrix, size):
45
+ """Benchmark DiskWaveletMatrix select"""
46
+ value = random_disk_wavelet_matrix[random.randint(0, size - 1)]
47
+ kth = random_disk_wavelet_matrix.rank(value, size)
48
+ benchmark(random_disk_wavelet_matrix.select, value, kth)
49
+
50
+ def bench_quantile(self, benchmark, random_disk_wavelet_matrix, size):
51
+ """Benchmark DiskWaveletMatrix quantile"""
52
+ start = size // 4
53
+ end = size * 3 // 4
54
+ kth = random.randint(1, end - start)
55
+ benchmark(random_disk_wavelet_matrix.quantile, start, end, kth)
56
+
57
+ def bench_range_freq(self, benchmark, random_disk_wavelet_matrix, size, max_bit):
58
+ """Benchmark DiskWaveletMatrix range_freq"""
59
+ start = size // 4
60
+ end = size * 3 // 4
61
+ lower = (1 << max_bit) // 4
62
+ upper = (1 << max_bit) * 3 // 4
63
+ benchmark(random_disk_wavelet_matrix.range_freq, start, end, lower, upper)
64
+
65
+ def bench_range_maxk(self, benchmark, random_disk_wavelet_matrix, size):
66
+ """Benchmark DiskWaveletMatrix range_maxk"""
67
+ start = size // 4
68
+ end = size * 3 // 4
69
+ k = 10
70
+ benchmark(random_disk_wavelet_matrix.range_maxk, start, end, k)
71
+
72
+ def bench_range_mink(self, benchmark, random_disk_wavelet_matrix, size):
73
+ """Benchmark DiskWaveletMatrix range_mink"""
74
+ start = size // 4
75
+ end = size * 3 // 4
76
+ k = 10
77
+ benchmark(random_disk_wavelet_matrix.range_mink, start, end, k)
78
+
79
+ def bench_prev_value(self, benchmark, random_disk_wavelet_matrix, size, max_bit):
80
+ """Benchmark DiskWaveletMatrix prev_value"""
81
+ start = size // 4
82
+ end = size * 3 // 4
83
+ upper = 1 << (max_bit - 1)
84
+ benchmark(random_disk_wavelet_matrix.prev_value, start, end, upper)
85
+
86
+ def bench_next_value(self, benchmark, random_disk_wavelet_matrix, size, max_bit):
87
+ """Benchmark DiskWaveletMatrix next_value"""
88
+ start = size // 4
89
+ end = size * 3 // 4
90
+ lower = 1 << (max_bit - 1)
91
+ benchmark(random_disk_wavelet_matrix.next_value, start, end, lower)
@@ -222,7 +222,7 @@ wavelet_matrix </h1>
222
222
 
223
223
  <div class="pdoc-code codehilite">
224
224
  <pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">wavelet_matrix</span><span class="w"> </span><span class="kn">import</span> <span class="n">WaveletMatrix</span>
225
- <span class="n">wm</span> <span class="o">=</span> <span class="n">WaveletMatrix</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
225
+ <span class="n">wm</span> <span class="o">=</span> <span class="n">WaveletMatrix</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="n">on_disk</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="c1"># in-memory</span>
226
226
  </code></pre>
227
227
  </div>
228
228
  </div>
@@ -231,7 +231,7 @@ wavelet_matrix </h1>
231
231
  <div id="WaveletMatrix.__init__" class="classattr">
232
232
  <div class="attr function">
233
233
 
234
- <span class="name">WaveletMatrix</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">data</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span></span>)</span>
234
+ <span class="name">WaveletMatrix</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">data</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span>, </span><span class="param"><span class="n">on_disk</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span>)</span>
235
235
 
236
236
 
237
237
  </div>
@@ -38,6 +38,7 @@ classifiers = [
38
38
  "Programming Language :: Python :: 3.12",
39
39
  "Programming Language :: Python :: 3.13",
40
40
  "Programming Language :: Python :: 3.14",
41
+ "Programming Language :: Python :: 3.15",
41
42
  "Programming Language :: Python :: Implementation :: CPython",
42
43
  "Programming Language :: Python :: Implementation :: PyPy",
43
44
  "Topic :: Software Development :: Libraries :: Python Modules",
@@ -50,6 +51,7 @@ classifiers = [
50
51
  test = [
51
52
  "pytest>=7.0",
52
53
  "pytest-benchmark>=4.0",
54
+ "pytest-monitor>=1.6"
53
55
  ]
54
56
  dev = [
55
57
  "pdoc>=16.0",
@@ -73,7 +75,7 @@ addopts = [
73
75
  "--strict-markers",
74
76
  "--tb=short",
75
77
  "--benchmark-columns=mean,stddev,min,max",
76
- "--benchmark-group-by=func",
78
+ "--benchmark-group-by=fullfunc",
77
79
  ]
78
80
 
79
81
  [tool.ruff]