wavelet-matrix 2.1.7__tar.gz → 2.2.0__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.
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/.github/workflows/CI.yml +21 -5
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/.gitignore +2 -1
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/Cargo.lock +35 -51
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/Cargo.toml +5 -3
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/PKG-INFO +9 -1
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/README.md +7 -0
- wavelet_matrix-2.2.0/benchmarks/bench_disk_wavelet_matrix.py +91 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/docs/wavelet_matrix.html +2 -2
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/pyproject.toml +2 -1
- wavelet_matrix-2.2.0/src/disk_wavelet_matrix/disk_bit_vector.rs +391 -0
- wavelet_matrix-2.2.0/src/disk_wavelet_matrix/disk_wavelet_matrix.rs +587 -0
- wavelet_matrix-2.2.0/src/disk_wavelet_matrix/mod.rs +4 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/dynamic_wavelet_matrix/dynamic_wavelet_matrix.rs +1 -1
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/lib.rs +1 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/python/dynamic_wavelet_matrix.rs +2 -2
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/python/wavelet_matrix.rs +1247 -95
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/bit_vector/bit_vector.rs +7 -6
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/bit_vector/dynamic_bit_vector.rs +11 -7
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/wavelet_matrix/bit_vector.rs +18 -11
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/wavelet_matrix/wavelet_matrix.rs +2 -3
- wavelet_matrix-2.2.0/tests/test_disk_wavelet_matrix.py +281 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/wavelet_matrix.pyi +5 -5
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/LICENSE +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/benchmarks/__init__.py +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/benchmarks/bench_dynamic_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/benchmarks/bench_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/docs/index.html +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/pdoc_templates/error.html.jinja2 +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/pdoc_templates/frame.html.jinja2 +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/pdoc_templates/index.html.jinja2 +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/pdoc_templates/module.html.jinja2 +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/dynamic_wavelet_matrix/dynamic_bit_vector.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/dynamic_wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/python/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/bit_vector/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/utils/bit_select.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/utils/bit_width.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/utils/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/wavelet_matrix/dynamic_wavelet_matrix.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/traits/wavelet_matrix/wavelet_matrix.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/src/wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/tests/__init__.py +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/tests/test_dynamic_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.1.7 → wavelet_matrix-2.2.0}/tests/test_wavelet_matrix.py +0 -0
|
@@ -16,6 +16,7 @@ on:
|
|
|
16
16
|
|
|
17
17
|
permissions:
|
|
18
18
|
contents: read
|
|
19
|
+
id-token: write
|
|
19
20
|
|
|
20
21
|
concurrency:
|
|
21
22
|
group: ci-${{ github.ref }}
|
|
@@ -243,7 +244,20 @@ jobs:
|
|
|
243
244
|
python -m pip install --upgrade pip
|
|
244
245
|
python -m pip install -e .[test]
|
|
245
246
|
- name: Run benchmarks
|
|
246
|
-
run: pytest --benchmark-only
|
|
247
|
+
run: pytest --benchmark-only --db .pymon
|
|
248
|
+
- name: Display benchmark results
|
|
249
|
+
run: |
|
|
250
|
+
sqlite3 -header -column .pymon '
|
|
251
|
+
SELECT
|
|
252
|
+
ITEM_PATH AS path,
|
|
253
|
+
COALESCE(ITEM_VARIANT, ITEM) AS test,
|
|
254
|
+
printf("%.3f", TOTAL_TIME) AS time_sec,
|
|
255
|
+
printf("%.2f", CPU_USAGE) AS cpu_usage,
|
|
256
|
+
printf("%.2f", MEM_USAGE) AS mem_mb
|
|
257
|
+
FROM TEST_METRICS
|
|
258
|
+
WHERE KIND = "function"
|
|
259
|
+
ORDER BY MEM_USAGE DESC;
|
|
260
|
+
'
|
|
247
261
|
|
|
248
262
|
release:
|
|
249
263
|
name: Release
|
|
@@ -259,15 +273,17 @@ jobs:
|
|
|
259
273
|
attestations: write
|
|
260
274
|
steps:
|
|
261
275
|
- uses: actions/download-artifact@v7
|
|
276
|
+
with:
|
|
277
|
+
pattern: wheels-*
|
|
278
|
+
path: dist
|
|
279
|
+
merge-multiple: true
|
|
262
280
|
- name: Generate artifact attestation
|
|
263
281
|
uses: actions/attest-build-provenance@v3
|
|
264
282
|
with:
|
|
265
|
-
subject-path: '
|
|
283
|
+
subject-path: 'dist/*'
|
|
266
284
|
- name: Publish to PyPI
|
|
267
285
|
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
268
286
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
269
287
|
with:
|
|
270
|
-
|
|
271
|
-
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
272
|
-
packages-dir: wheels-*
|
|
288
|
+
packages-dir: dist
|
|
273
289
|
skip-existing: true
|
|
@@ -4,9 +4,15 @@ version = 4
|
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "autocfg"
|
|
7
|
-
version = "1.5.
|
|
7
|
+
version = "1.5.1"
|
|
8
8
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
-
checksum = "
|
|
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.
|
|
44
|
+
version = "1.16.0"
|
|
39
45
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
40
|
-
checksum = "
|
|
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.
|
|
56
|
+
version = "0.2.186"
|
|
60
57
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
61
|
-
checksum = "
|
|
58
|
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
62
59
|
|
|
63
60
|
[[package]]
|
|
64
|
-
name = "
|
|
65
|
-
version = "0.9.
|
|
61
|
+
name = "memmap2"
|
|
62
|
+
version = "0.9.11"
|
|
66
63
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
67
|
-
checksum = "
|
|
64
|
+
checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0"
|
|
68
65
|
dependencies = [
|
|
69
|
-
"
|
|
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.
|
|
120
|
+
version = "0.28.3"
|
|
124
121
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
125
|
-
checksum = "
|
|
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.
|
|
136
|
+
version = "0.28.3"
|
|
143
137
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
144
|
-
checksum = "
|
|
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.
|
|
145
|
+
version = "0.28.3"
|
|
152
146
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
153
|
-
checksum = "
|
|
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.
|
|
155
|
+
version = "0.28.3"
|
|
162
156
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
163
|
-
checksum = "
|
|
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.
|
|
167
|
+
version = "0.28.3"
|
|
174
168
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
175
|
-
checksum = "
|
|
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.
|
|
180
|
+
version = "1.0.46"
|
|
187
181
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
188
|
-
checksum = "
|
|
182
|
+
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
|
189
183
|
dependencies = [
|
|
190
184
|
"proc-macro2",
|
|
191
185
|
]
|
|
192
186
|
|
|
193
187
|
[[package]]
|
|
194
188
|
name = "rayon"
|
|
195
|
-
version = "1.
|
|
189
|
+
version = "1.12.0"
|
|
196
190
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
197
|
-
checksum = "
|
|
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.
|
|
209
|
+
version = "2.0.118"
|
|
222
210
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
223
|
-
checksum = "
|
|
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.
|
|
232
|
+
version = "2.2.0"
|
|
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.
|
|
3
|
+
version = "2.2.0"
|
|
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.
|
|
17
|
-
rayon = "1.
|
|
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.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Classifier: Intended Audience :: Developers
|
|
5
5
|
Classifier: Intended Audience :: Science/Research
|
|
6
6
|
Classifier: Intended Audience :: Information Technology
|
|
@@ -22,6 +22,7 @@ Requires-Dist: pdoc>=16.0 ; extra == 'dev'
|
|
|
22
22
|
Requires-Dist: ruff>=0.14 ; extra == 'dev'
|
|
23
23
|
Requires-Dist: pytest>=7.0 ; extra == 'test'
|
|
24
24
|
Requires-Dist: pytest-benchmark>=4.0 ; extra == 'test'
|
|
25
|
+
Requires-Dist: pytest-monitor>=1.6 ; extra == 'test'
|
|
25
26
|
Provides-Extra: dev
|
|
26
27
|
Provides-Extra: test
|
|
27
28
|
License-File: LICENSE
|
|
@@ -59,6 +60,7 @@ supporting fast rank / select / range queries over indexed sequences
|
|
|
59
60
|
## Features:
|
|
60
61
|
- Fast rank, select, quantile
|
|
61
62
|
- Rich range queries (freq / sum / top-k / min / max)
|
|
63
|
+
- Optional disk-backed storage for static WaveletMatrix (`on_disk=True`)
|
|
62
64
|
- Optional dynamic updates (insert / remove / update)
|
|
63
65
|
- Safe Rust (no unsafe)
|
|
64
66
|
|
|
@@ -75,6 +77,12 @@ from wavelet_matrix import WaveletMatrix
|
|
|
75
77
|
|
|
76
78
|
data = [5, 4, 5, 5, 2, 1, 5, 6, 1, 3, 5, 0]
|
|
77
79
|
wm = WaveletMatrix(data)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
WaveletMatrix also supports disk-backed storage for large static sequences.
|
|
83
|
+
Set `on_disk=True` to keep its internal data on disk instead of holding it all in memory.
|
|
84
|
+
```python
|
|
85
|
+
wm = WaveletMatrix(data, on_disk=True)
|
|
78
86
|
```
|
|
79
87
|
|
|
80
88
|
### 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>
|
|
@@ -50,6 +50,7 @@ classifiers = [
|
|
|
50
50
|
test = [
|
|
51
51
|
"pytest>=7.0",
|
|
52
52
|
"pytest-benchmark>=4.0",
|
|
53
|
+
"pytest-monitor>=1.6"
|
|
53
54
|
]
|
|
54
55
|
dev = [
|
|
55
56
|
"pdoc>=16.0",
|
|
@@ -73,7 +74,7 @@ addopts = [
|
|
|
73
74
|
"--strict-markers",
|
|
74
75
|
"--tb=short",
|
|
75
76
|
"--benchmark-columns=mean,stddev,min,max",
|
|
76
|
-
"--benchmark-group-by=
|
|
77
|
+
"--benchmark-group-by=fullfunc",
|
|
77
78
|
]
|
|
78
79
|
|
|
79
80
|
[tool.ruff]
|