wavelet-matrix 2.2.4__tar.gz → 2.2.6__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.2.4 → wavelet_matrix-2.2.6}/.github/workflows/CI.yml +1 -1
  2. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/Cargo.lock +13 -13
  3. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/Cargo.toml +5 -5
  4. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/PKG-INFO +1 -1
  5. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/disk_wavelet_matrix/disk_bit_vector.rs +45 -42
  6. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/disk_wavelet_matrix/disk_wavelet_matrix.rs +29 -58
  7. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/dynamic_wavelet_matrix/dynamic_wavelet_matrix.rs +2 -2
  8. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/python/dynamic_wavelet_matrix.rs +61 -67
  9. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/python/wavelet_matrix.rs +90 -103
  10. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/wavelet_matrix/dynamic_wavelet_matrix.rs +2 -2
  11. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/tests/test_disk_wavelet_matrix.py +1 -1
  12. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/wavelet_matrix.pyi +8 -6
  13. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/.gitignore +0 -0
  14. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/LICENSE +0 -0
  15. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/README.md +0 -0
  16. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/benchmarks/__init__.py +0 -0
  17. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/benchmarks/bench_disk_wavelet_matrix.py +0 -0
  18. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/benchmarks/bench_dynamic_wavelet_matrix.py +0 -0
  19. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/benchmarks/bench_wavelet_matrix.py +0 -0
  20. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/docs/index.html +0 -0
  21. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/docs/wavelet_matrix.html +0 -0
  22. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/pdoc_templates/error.html.jinja2 +0 -0
  23. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/pdoc_templates/frame.html.jinja2 +0 -0
  24. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/pdoc_templates/index.html.jinja2 +0 -0
  25. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/pdoc_templates/module.html.jinja2 +0 -0
  26. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/pyproject.toml +0 -0
  27. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/disk_wavelet_matrix/mod.rs +0 -0
  28. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/dynamic_wavelet_matrix/dynamic_bit_vector.rs +0 -0
  29. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/dynamic_wavelet_matrix/mod.rs +0 -0
  30. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/lib.rs +0 -0
  31. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/python/mod.rs +0 -0
  32. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/bit_vector/bit_vector.rs +0 -0
  33. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/bit_vector/dynamic_bit_vector.rs +0 -0
  34. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/bit_vector/mod.rs +0 -0
  35. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/mod.rs +0 -0
  36. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/utils/bit_select.rs +0 -0
  37. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/utils/bit_width.rs +0 -0
  38. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/utils/mod.rs +0 -0
  39. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/wavelet_matrix/mod.rs +0 -0
  40. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/traits/wavelet_matrix/wavelet_matrix.rs +0 -0
  41. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/wavelet_matrix/bit_vector.rs +0 -0
  42. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/wavelet_matrix/mod.rs +0 -0
  43. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/src/wavelet_matrix/wavelet_matrix.rs +0 -0
  44. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/tests/__init__.py +0 -0
  45. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/tests/test_dynamic_wavelet_matrix.py +0 -0
  46. {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.6}/tests/test_wavelet_matrix.py +0 -0
@@ -245,7 +245,7 @@ jobs:
245
245
  python -m pip install --upgrade pip
246
246
  python -m pip install -e .[test]
247
247
  - name: Run benchmarks
248
- run: python -m pytest --benchmark-only --db .pymon
248
+ run: python -m pytest --benchmark-only --benchmark-warmup=off --db .pymon
249
249
  - name: Display benchmark results
250
250
  run: |
251
251
  sqlite3 -header -column .pymon '
@@ -53,9 +53,9 @@ checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
53
53
 
54
54
  [[package]]
55
55
  name = "either"
56
- version = "1.16.0"
56
+ version = "1.17.0"
57
57
  source = "registry+https://github.com/rust-lang/crates.io-index"
58
- checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
58
+ checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
59
59
 
60
60
  [[package]]
61
61
  name = "errno"
@@ -162,9 +162,9 @@ dependencies = [
162
162
 
163
163
  [[package]]
164
164
  name = "pyo3"
165
- version = "0.29.0"
165
+ version = "0.29.2"
166
166
  source = "registry+https://github.com/rust-lang/crates.io-index"
167
- checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
167
+ checksum = "4688ddedf473e32662b9b067670129a8afb8c18e351482c70d62ba4a88171e8b"
168
168
  dependencies = [
169
169
  "libc",
170
170
  "num-bigint",
@@ -178,18 +178,18 @@ dependencies = [
178
178
 
179
179
  [[package]]
180
180
  name = "pyo3-build-config"
181
- version = "0.29.0"
181
+ version = "0.29.2"
182
182
  source = "registry+https://github.com/rust-lang/crates.io-index"
183
- checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
183
+ checksum = "f41027e41b4bd03f6e60f9f417fe24a6341a6bb744edd62b6f709f2a52ea30e9"
184
184
  dependencies = [
185
185
  "target-lexicon",
186
186
  ]
187
187
 
188
188
  [[package]]
189
189
  name = "pyo3-ffi"
190
- version = "0.29.0"
190
+ version = "0.29.2"
191
191
  source = "registry+https://github.com/rust-lang/crates.io-index"
192
- checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
192
+ checksum = "e591a95526fead067432c3b3a33fc74770b87b1e04e73671090d9c2055a2b327"
193
193
  dependencies = [
194
194
  "libc",
195
195
  "pyo3-build-config",
@@ -197,9 +197,9 @@ dependencies = [
197
197
 
198
198
  [[package]]
199
199
  name = "pyo3-macros"
200
- version = "0.29.0"
200
+ version = "0.29.2"
201
201
  source = "registry+https://github.com/rust-lang/crates.io-index"
202
- checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
202
+ checksum = "73225868fc1cd84eef2c3c230ddb91273bf1de46aeb8a4248da76d32a0924a1c"
203
203
  dependencies = [
204
204
  "proc-macro2",
205
205
  "pyo3-macros-backend",
@@ -209,9 +209,9 @@ dependencies = [
209
209
 
210
210
  [[package]]
211
211
  name = "pyo3-macros-backend"
212
- version = "0.29.0"
212
+ version = "0.29.2"
213
213
  source = "registry+https://github.com/rust-lang/crates.io-index"
214
- checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
214
+ checksum = "571575aa3749fa6216757dd47d2a3e7ef360f329a40f0666a9fbd14889024952"
215
215
  dependencies = [
216
216
  "heck",
217
217
  "proc-macro2",
@@ -305,7 +305,7 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
305
305
 
306
306
  [[package]]
307
307
  name = "wavelet-matrix"
308
- version = "2.2.4"
308
+ version = "2.2.6"
309
309
  dependencies = [
310
310
  "bytemuck",
311
311
  "memmap2",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wavelet-matrix"
3
- version = "2.2.4"
3
+ version = "2.2.6"
4
4
  edition = "2024"
5
5
  readme = "README.md"
6
6
 
@@ -10,11 +10,11 @@ name = "wavelet_matrix"
10
10
  crate-type = ["cdylib"]
11
11
 
12
12
  [dependencies]
13
- bytemuck = "1.25.0"
14
- memmap2 = "0.9.10"
15
- num-bigint = "0.4.6"
13
+ bytemuck = "1.25.2"
14
+ memmap2 = "0.9.11"
15
+ num-bigint = "0.4.8"
16
16
  num-integer = "0.1.46"
17
17
  num-traits = "0.2.19"
18
- pyo3 = { version = "0.29.0", features = ["num-bigint"] }
18
+ pyo3 = { version = "0.29.2", features = ["num-bigint"] }
19
19
  rayon = "1.12.0"
20
20
  tempfile = "3.27.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavelet-matrix
3
- Version: 2.2.4
3
+ Version: 2.2.6
4
4
  Classifier: Intended Audience :: Developers
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Intended Audience :: Information Technology
@@ -6,7 +6,7 @@ use num_integer::Integer;
6
6
  use num_traits::{One, Zero};
7
7
  use pyo3::{
8
8
  PyResult,
9
- exceptions::{PyIndexError, PyRuntimeError, PyValueError},
9
+ exceptions::{PyIndexError, PyOSError, PyValueError},
10
10
  };
11
11
  use tempfile::tempfile;
12
12
 
@@ -33,47 +33,49 @@ impl DiskBitVector {
33
33
  let blocks_slice: &[BlockType] = cast_slice(&blocks[..]);
34
34
 
35
35
  // Build the rank index structure.
36
- let ranks_file = tempfile().map_err(PyRuntimeError::new_err)?;
36
+ let ranks_file = tempfile().map_err(PyOSError::new_err)?;
37
37
  ranks_file
38
38
  .set_len((blocks_slice.len() + 1) as u64 * mem::size_of::<usize>() as u64)
39
- .map_err(PyRuntimeError::new_err)?;
39
+ .map_err(PyOSError::new_err)?;
40
40
  #[allow(unsafe_code)]
41
- let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_err(PyRuntimeError::new_err)? };
41
+ let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_err(PyOSError::new_err)? };
42
42
  let ranks_slice: &mut [usize] = cast_slice_mut(&mut ranks[..]);
43
- iter::once(0usize)
44
- .chain(blocks_slice.iter().scan(0usize, |acc, block| {
45
- *acc += block.count_ones() as usize;
46
- Some(*acc)
47
- }))
48
- .enumerate()
49
- .for_each(|(index, rank)| ranks_slice[index] = rank);
43
+ ranks_slice.copy_from_slice(
44
+ iter::once(0)
45
+ .chain(blocks_slice.iter().scan(0usize, |acc, block| {
46
+ *acc += block.count_ones() as usize;
47
+ Some(*acc)
48
+ }))
49
+ .collect::<Vec<_>>()
50
+ .as_slice(),
51
+ );
50
52
 
51
53
  let select_index_file = [
52
54
  {
53
- let file = tempfile().map_err(PyRuntimeError::new_err)?;
55
+ let file = tempfile().map_err(PyOSError::new_err)?;
54
56
  file.set_len(
55
57
  (((len - ranks_slice.last().unwrap()) / SELECT_INDEX_INTERVAL + 2)
56
58
  * mem::size_of::<usize>()) as u64,
57
59
  )
58
- .map_err(PyRuntimeError::new_err)?;
60
+ .map_err(PyOSError::new_err)?;
59
61
  file
60
62
  },
61
63
  {
62
- let file = tempfile().map_err(PyRuntimeError::new_err)?;
64
+ let file = tempfile().map_err(PyOSError::new_err)?;
63
65
  file.set_len(
64
66
  ((ranks_slice.last().unwrap() / SELECT_INDEX_INTERVAL + 2)
65
67
  * mem::size_of::<usize>()) as u64,
66
68
  )
67
- .map_err(PyRuntimeError::new_err)?;
69
+ .map_err(PyOSError::new_err)?;
68
70
  file
69
71
  },
70
72
  ];
71
73
  #[allow(unsafe_code)]
72
74
  let mut select_index_0 =
73
- unsafe { MmapMut::map_mut(&select_index_file[0]).map_err(PyRuntimeError::new_err)? };
75
+ unsafe { MmapMut::map_mut(&select_index_file[0]).map_err(PyOSError::new_err)? };
74
76
  #[allow(unsafe_code)]
75
77
  let mut select_index_1 =
76
- unsafe { MmapMut::map_mut(&select_index_file[1]).map_err(PyRuntimeError::new_err)? };
78
+ unsafe { MmapMut::map_mut(&select_index_file[1]).map_err(PyOSError::new_err)? };
77
79
  let select_index_slice: [&mut [usize]; 2] = [
78
80
  cast_slice_mut(&mut select_index_0[..]),
79
81
  cast_slice_mut(&mut select_index_1[..]),
@@ -101,62 +103,61 @@ impl DiskBitVector {
101
103
 
102
104
  Ok(Self {
103
105
  len,
104
- ranks: ranks.make_read_only().map_err(PyRuntimeError::new_err)?,
106
+ ranks: ranks.make_read_only().map_err(PyOSError::new_err)?,
105
107
  ranks_file,
106
108
  blocks,
107
109
  blocks_file,
108
110
  select_index: [
109
111
  select_index_0
110
112
  .make_read_only()
111
- .map_err(PyRuntimeError::new_err)?,
113
+ .map_err(PyOSError::new_err)?,
112
114
  select_index_1
113
115
  .make_read_only()
114
- .map_err(PyRuntimeError::new_err)?,
116
+ .map_err(PyOSError::new_err)?,
115
117
  ],
116
118
  select_index_file,
117
119
  })
118
120
  }
119
121
 
120
122
  pub(super) fn try_clone(&self) -> PyResult<Self> {
121
- let ranks_file = tempfile().map_err(PyRuntimeError::new_err)?;
123
+ let ranks_file = tempfile().map_err(PyOSError::new_err)?;
122
124
  ranks_file
123
125
  .set_len(self.ranks.len() as u64)
124
- .map_err(PyRuntimeError::new_err)?;
126
+ .map_err(PyOSError::new_err)?;
125
127
  #[allow(unsafe_code)]
126
- let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_err(PyRuntimeError::new_err)? };
128
+ let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_err(PyOSError::new_err)? };
127
129
  ranks.copy_from_slice(&self.ranks[..]);
128
130
 
129
- let blocks_file = tempfile().map_err(PyRuntimeError::new_err)?;
131
+ let blocks_file = tempfile().map_err(PyOSError::new_err)?;
130
132
  blocks_file
131
133
  .set_len(self.blocks.len() as u64)
132
- .map_err(PyRuntimeError::new_err)?;
134
+ .map_err(PyOSError::new_err)?;
133
135
  #[allow(unsafe_code)]
134
- let mut blocks =
135
- unsafe { MmapMut::map_mut(&blocks_file).map_err(PyRuntimeError::new_err)? };
136
+ let mut blocks = unsafe { MmapMut::map_mut(&blocks_file).map_err(PyOSError::new_err)? };
136
137
  blocks.copy_from_slice(&self.blocks[..]);
137
138
 
138
139
  let select_index_file = [
139
140
  {
140
- let file = tempfile().map_err(PyRuntimeError::new_err)?;
141
+ let file = tempfile().map_err(PyOSError::new_err)?;
141
142
  file.set_len(self.select_index[0].len() as u64)
142
- .map_err(PyRuntimeError::new_err)?;
143
+ .map_err(PyOSError::new_err)?;
143
144
  file
144
145
  },
145
146
  {
146
- let file = tempfile().map_err(PyRuntimeError::new_err)?;
147
+ let file = tempfile().map_err(PyOSError::new_err)?;
147
148
  file.set_len(self.select_index[1].len() as u64)
148
- .map_err(PyRuntimeError::new_err)?;
149
+ .map_err(PyOSError::new_err)?;
149
150
  file
150
151
  },
151
152
  ];
152
153
  let mut select_index = [
153
154
  #[allow(unsafe_code)]
154
155
  unsafe {
155
- MmapMut::map_mut(&select_index_file[0]).map_err(PyRuntimeError::new_err)?
156
+ MmapMut::map_mut(&select_index_file[0]).map_err(PyOSError::new_err)?
156
157
  },
157
158
  #[allow(unsafe_code)]
158
159
  unsafe {
159
- MmapMut::map_mut(&select_index_file[1]).map_err(PyRuntimeError::new_err)?
160
+ MmapMut::map_mut(&select_index_file[1]).map_err(PyOSError::new_err)?
160
161
  },
161
162
  ];
162
163
  select_index[0].copy_from_slice(&self.select_index[0][..]);
@@ -166,17 +167,17 @@ impl DiskBitVector {
166
167
 
167
168
  Ok(Self {
168
169
  len: self.len,
169
- ranks: ranks.make_read_only().map_err(PyRuntimeError::new_err)?,
170
+ ranks: ranks.make_read_only().map_err(PyOSError::new_err)?,
170
171
  ranks_file,
171
- blocks: blocks.make_read_only().map_err(PyRuntimeError::new_err)?,
172
+ blocks: blocks.make_read_only().map_err(PyOSError::new_err)?,
172
173
  blocks_file,
173
174
  select_index: [
174
175
  select_index_0
175
176
  .make_read_only()
176
- .map_err(PyRuntimeError::new_err)?,
177
+ .map_err(PyOSError::new_err)?,
177
178
  select_index_1
178
179
  .make_read_only()
179
- .map_err(PyRuntimeError::new_err)?,
180
+ .map_err(PyOSError::new_err)?,
180
181
  ],
181
182
  select_index_file,
182
183
  })
@@ -288,10 +289,9 @@ mod tests {
288
289
  #[allow(unsafe_code)]
289
290
  let mut blocks = unsafe { MmapMut::map_mut(&blocks_file).unwrap() };
290
291
  let blocks_slice: &mut [BlockType] = cast_slice_mut(&mut blocks[..]);
291
- bits.chunks(BlockType::BITS as usize)
292
- .enumerate()
293
- .for_each(|(index, chunk)| {
294
- blocks_slice[index] =
292
+ blocks_slice.copy_from_slice(
293
+ bits.chunks(BlockType::BITS as usize)
294
+ .map(|chunk| {
295
295
  chunk
296
296
  .iter()
297
297
  .enumerate()
@@ -302,7 +302,10 @@ mod tests {
302
302
  acc
303
303
  }
304
304
  })
305
- });
305
+ })
306
+ .collect::<Vec<_>>()
307
+ .as_slice(),
308
+ );
306
309
 
307
310
  DiskBitVector::new(blocks.make_read_only().unwrap(), blocks_file, len).unwrap()
308
311
  }
@@ -4,7 +4,7 @@ use bytemuck::{Pod, cast_slice, cast_slice_mut};
4
4
  use memmap2::MmapMut;
5
5
  use num_bigint::ToBigUint;
6
6
  use num_traits::{One, PrimInt, Unsigned};
7
- use pyo3::{PyResult, exceptions::PyRuntimeError};
7
+ use pyo3::{PyResult, exceptions::PyOSError};
8
8
  use rayon::prelude::*;
9
9
  use tempfile::tempfile;
10
10
 
@@ -42,16 +42,15 @@ where
42
42
  let mut zeros_count_per_layer = Vec::with_capacity(height);
43
43
  let mut layer_blocks_vec = Vec::with_capacity(height);
44
44
  for i in 0..height {
45
- let current_layer_bits_file = tempfile().map_err(PyRuntimeError::new_err)?;
45
+ let current_layer_bits_file = tempfile().map_err(PyOSError::new_err)?;
46
46
  current_layer_bits_file
47
47
  .set_len(
48
48
  (len.div_ceil(BlockType::BITS as usize) * mem::size_of::<BlockType>()) as u64,
49
49
  )
50
- .map_err(PyRuntimeError::new_err)?;
50
+ .map_err(PyOSError::new_err)?;
51
51
  #[allow(unsafe_code)]
52
- let mut current_layer_bits = unsafe {
53
- MmapMut::map_mut(&current_layer_bits_file).map_err(PyRuntimeError::new_err)?
54
- };
52
+ let mut current_layer_bits =
53
+ unsafe { MmapMut::map_mut(&current_layer_bits_file).map_err(PyOSError::new_err)? };
55
54
  assert!(
56
55
  current_layer_bits
57
56
  .len()
@@ -79,13 +78,13 @@ where
79
78
  .map(|&block| block.count_ones() as usize)
80
79
  .sum::<usize>();
81
80
 
82
- let next_values_file = tempfile().map_err(PyRuntimeError::new_err)?;
81
+ let next_values_file = tempfile().map_err(PyOSError::new_err)?;
83
82
  next_values_file
84
83
  .set_len((len * mem::size_of::<NumberType>()) as u64)
85
- .map_err(PyRuntimeError::new_err)?;
84
+ .map_err(PyOSError::new_err)?;
86
85
  #[allow(unsafe_code)]
87
86
  let mut next_values =
88
- unsafe { MmapMut::map_mut(&next_values_file).map_err(PyRuntimeError::new_err)? };
87
+ unsafe { MmapMut::map_mut(&next_values_file).map_err(PyOSError::new_err)? };
89
88
  assert!(
90
89
  next_values
91
90
  .len()
@@ -118,7 +117,7 @@ where
118
117
  layer_blocks_vec.push((
119
118
  current_layer_bits
120
119
  .make_read_only()
121
- .map_err(PyRuntimeError::new_err)?,
120
+ .map_err(PyOSError::new_err)?,
122
121
  current_layer_bits_file,
123
122
  ));
124
123
  values = next_values;
@@ -200,15 +199,11 @@ mod tests {
200
199
 
201
200
  fn create_u8() -> DiskWaveletMatrix<u8> {
202
201
  let elements: Vec<u8> = vec![5, 4, 5, 5, 2, 1, 5, 6, 1, 3, 5, 0];
203
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
202
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
204
203
  file.set_len((elements.len() * mem::size_of::<u8>()) as u64)
205
204
  .unwrap();
206
205
  #[allow(unsafe_code)]
207
- let mut mmap = unsafe {
208
- MmapMut::map_mut(&file)
209
- .map_err(PyRuntimeError::new_err)
210
- .unwrap()
211
- };
206
+ let mut mmap = unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
212
207
  let mmap_slice: &mut [u8] = cast_slice_mut(&mut mmap[..]);
213
208
  mmap_slice.copy_from_slice(&elements);
214
209
  DiskWaveletMatrix::new(mmap, file).unwrap()
@@ -216,15 +211,11 @@ mod tests {
216
211
 
217
212
  fn create_u128() -> DiskWaveletMatrix<u128> {
218
213
  let elements: Vec<u128> = vec![5u128, 4, 5, 5, 2, 1, 5, 6, 1, 3, 5, 0];
219
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
214
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
220
215
  file.set_len((elements.len() * mem::size_of::<u128>()) as u64)
221
216
  .unwrap();
222
217
  #[allow(unsafe_code)]
223
- let mut mmap = unsafe {
224
- MmapMut::map_mut(&file)
225
- .map_err(PyRuntimeError::new_err)
226
- .unwrap()
227
- };
218
+ let mut mmap = unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
228
219
  let mmap_slice: &mut [u128] = cast_slice_mut(&mut mmap[..]);
229
220
  mmap_slice.copy_from_slice(&elements);
230
221
  DiskWaveletMatrix::new(mmap, file).unwrap()
@@ -234,13 +225,9 @@ mod tests {
234
225
  fn test_empty() {
235
226
  Python::initialize();
236
227
 
237
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
228
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
238
229
  #[allow(unsafe_code)]
239
- let mmap_empty = unsafe {
240
- MmapMut::map_mut(&file)
241
- .map_err(PyRuntimeError::new_err)
242
- .unwrap()
243
- };
230
+ let mmap_empty = unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
244
231
  let wv_u8 = DiskWaveletMatrix::<u8>::new(mmap_empty, file).unwrap();
245
232
  assert_eq!(wv_u8.len(), 0);
246
233
  assert_eq!(wv_u8.height(), 0);
@@ -298,14 +285,10 @@ mod tests {
298
285
  "ValueError: start must be less than end"
299
286
  );
300
287
 
301
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
288
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
302
289
  file.set_len(0).unwrap();
303
290
  #[allow(unsafe_code)]
304
- let mmap_empty = unsafe {
305
- MmapMut::map_mut(&file)
306
- .map_err(PyRuntimeError::new_err)
307
- .unwrap()
308
- };
291
+ let mmap_empty = unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
309
292
  let wv_u128 = DiskWaveletMatrix::<u128>::new(mmap_empty, file).unwrap();
310
293
  assert_eq!(wv_u128.height(), 0);
311
294
  assert_eq!(wv_u128.values().unwrap(), Vec::<u128>::new());
@@ -373,14 +356,11 @@ mod tests {
373
356
  fn test_all_zero() {
374
357
  Python::initialize();
375
358
 
376
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
359
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
377
360
  file.set_len((64 * mem::size_of::<u8>()) as u64).unwrap();
378
361
  #[allow(unsafe_code)]
379
- let mmap_u8_all_zero = unsafe {
380
- MmapMut::map_mut(&file)
381
- .map_err(PyRuntimeError::new_err)
382
- .unwrap()
383
- };
362
+ let mmap_u8_all_zero =
363
+ unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
384
364
  let wv_u8 = DiskWaveletMatrix::<u8>::new(mmap_u8_all_zero, file).unwrap();
385
365
  assert_eq!(wv_u8.len(), 64);
386
366
  assert_eq!(wv_u8.height(), 0);
@@ -398,14 +378,11 @@ mod tests {
398
378
  assert_eq!(wv_u8.prev_value(0, 64, None).unwrap(), Some(0u8));
399
379
  assert_eq!(wv_u8.next_value(0, 64, None).unwrap(), Some(0u8));
400
380
 
401
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
381
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
402
382
  file.set_len((64 * mem::size_of::<u128>()) as u64).unwrap();
403
383
  #[allow(unsafe_code)]
404
- let mmap_u128_all_zero = unsafe {
405
- MmapMut::map_mut(&file)
406
- .map_err(PyRuntimeError::new_err)
407
- .unwrap()
408
- };
384
+ let mmap_u128_all_zero =
385
+ unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
409
386
  let wv_u128 = DiskWaveletMatrix::<u128>::new(mmap_u128_all_zero, file).unwrap();
410
387
  assert_eq!(wv_u128.len(), 64);
411
388
  assert_eq!(wv_u128.height(), 0);
@@ -428,14 +405,11 @@ mod tests {
428
405
  fn test_max_value() {
429
406
  Python::initialize();
430
407
 
431
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
408
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
432
409
  file.set_len((64 * mem::size_of::<u8>()) as u64).unwrap();
433
410
  #[allow(unsafe_code)]
434
- let mut mmap_u8_max_value = unsafe {
435
- MmapMut::map_mut(&file)
436
- .map_err(PyRuntimeError::new_err)
437
- .unwrap()
438
- };
411
+ let mut mmap_u8_max_value =
412
+ unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
439
413
  let mmap_u8_slice: &mut [u8] = cast_slice_mut(&mut mmap_u8_max_value[..]);
440
414
  mmap_u8_slice.fill(u8::MAX);
441
415
  let wv_u8 = DiskWaveletMatrix::<u8>::new(mmap_u8_max_value, file).unwrap();
@@ -458,14 +432,11 @@ mod tests {
458
432
  assert_eq!(wv_u8.prev_value(0, 64, None).unwrap(), Some(u8::MAX));
459
433
  assert_eq!(wv_u8.next_value(0, 64, None).unwrap(), Some(u8::MAX));
460
434
 
461
- let file = tempfile().map_err(PyRuntimeError::new_err).unwrap();
435
+ let file = tempfile().map_err(PyOSError::new_err).unwrap();
462
436
  file.set_len((64 * mem::size_of::<u128>()) as u64).unwrap();
463
437
  #[allow(unsafe_code)]
464
- let mut mmap_u128_max_value = unsafe {
465
- MmapMut::map_mut(&file)
466
- .map_err(PyRuntimeError::new_err)
467
- .unwrap()
468
- };
438
+ let mut mmap_u128_max_value =
439
+ unsafe { MmapMut::map_mut(&file).map_err(PyOSError::new_err).unwrap() };
469
440
  let mmap_u128_slice: &mut [u128] = cast_slice_mut(&mut mmap_u128_max_value[..]);
470
441
  mmap_u128_slice.fill(u128::MAX);
471
442
  let wv_u128 = DiskWaveletMatrix::<u128>::new(mmap_u128_max_value, file).unwrap();
@@ -2,7 +2,7 @@ use std::{fmt, iter, marker, ops};
2
2
 
3
3
  use num_bigint::ToBigUint;
4
4
  use num_traits::{One, Zero};
5
- use pyo3::{PyResult, exceptions::PyValueError};
5
+ use pyo3::{PyResult, exceptions::PyOverflowError};
6
6
  use rayon::prelude::*;
7
7
 
8
8
  use super::dynamic_bit_vector::DynamicBitVector;
@@ -37,7 +37,7 @@ where
37
37
  .max()
38
38
  .map_or(0usize, |max| max.bit_width());
39
39
  if max_bit.is_some_and(|max_bit| max_bit < max_width) {
40
- return Err(PyValueError::new_err(format!(
40
+ return Err(PyOverflowError::new_err(format!(
41
41
  "max_bit = {} is less than the maximum bit width of the data = {}",
42
42
  max_bit.unwrap(),
43
43
  max_width