wavelet-matrix 2.2.4__tar.gz → 2.2.5__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.2.4 → wavelet_matrix-2.2.5}/Cargo.lock +3 -3
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/Cargo.toml +4 -4
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/PKG-INFO +1 -1
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/disk_wavelet_matrix/disk_bit_vector.rs +45 -42
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/disk_wavelet_matrix/disk_wavelet_matrix.rs +29 -58
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/dynamic_wavelet_matrix/dynamic_wavelet_matrix.rs +2 -2
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/python/dynamic_wavelet_matrix.rs +61 -67
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/python/wavelet_matrix.rs +90 -103
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/wavelet_matrix/dynamic_wavelet_matrix.rs +2 -2
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/tests/test_disk_wavelet_matrix.py +1 -1
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/.github/workflows/CI.yml +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/.gitignore +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/LICENSE +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/README.md +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/benchmarks/__init__.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/benchmarks/bench_disk_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/benchmarks/bench_dynamic_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/benchmarks/bench_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/docs/index.html +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/docs/wavelet_matrix.html +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/pdoc_templates/error.html.jinja2 +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/pdoc_templates/frame.html.jinja2 +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/pdoc_templates/index.html.jinja2 +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/pdoc_templates/module.html.jinja2 +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/pyproject.toml +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/disk_wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/dynamic_wavelet_matrix/dynamic_bit_vector.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/dynamic_wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/lib.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/python/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/bit_vector/bit_vector.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/bit_vector/dynamic_bit_vector.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/bit_vector/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/utils/bit_select.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/utils/bit_width.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/utils/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/traits/wavelet_matrix/wavelet_matrix.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/wavelet_matrix/bit_vector.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/wavelet_matrix/mod.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/wavelet_matrix/wavelet_matrix.rs +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/tests/__init__.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/tests/test_dynamic_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/tests/test_wavelet_matrix.py +0 -0
- {wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/wavelet_matrix.pyi +0 -0
|
@@ -53,9 +53,9 @@ checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
|
|
|
53
53
|
|
|
54
54
|
[[package]]
|
|
55
55
|
name = "either"
|
|
56
|
-
version = "1.
|
|
56
|
+
version = "1.17.0"
|
|
57
57
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
58
|
-
checksum = "
|
|
58
|
+
checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
|
|
59
59
|
|
|
60
60
|
[[package]]
|
|
61
61
|
name = "errno"
|
|
@@ -305,7 +305,7 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
|
305
305
|
|
|
306
306
|
[[package]]
|
|
307
307
|
name = "wavelet-matrix"
|
|
308
|
-
version = "2.2.
|
|
308
|
+
version = "2.2.5"
|
|
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.
|
|
3
|
+
version = "2.2.5"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
|
|
@@ -10,9 +10,9 @@ name = "wavelet_matrix"
|
|
|
10
10
|
crate-type = ["cdylib"]
|
|
11
11
|
|
|
12
12
|
[dependencies]
|
|
13
|
-
bytemuck = "1.25.
|
|
14
|
-
memmap2 = "0.9.
|
|
15
|
-
num-bigint = "0.4.
|
|
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
18
|
pyo3 = { version = "0.29.0", features = ["num-bigint"] }
|
|
@@ -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,
|
|
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(
|
|
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(
|
|
39
|
+
.map_err(PyOSError::new_err)?;
|
|
40
40
|
#[allow(unsafe_code)]
|
|
41
|
-
let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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(
|
|
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(
|
|
60
|
+
.map_err(PyOSError::new_err)?;
|
|
59
61
|
file
|
|
60
62
|
},
|
|
61
63
|
{
|
|
62
|
-
let file = tempfile().map_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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
113
|
+
.map_err(PyOSError::new_err)?,
|
|
112
114
|
select_index_1
|
|
113
115
|
.make_read_only()
|
|
114
|
-
.map_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(
|
|
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(
|
|
126
|
+
.map_err(PyOSError::new_err)?;
|
|
125
127
|
#[allow(unsafe_code)]
|
|
126
|
-
let mut ranks = unsafe { MmapMut::map_mut(&ranks_file).map_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(
|
|
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(
|
|
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(
|
|
141
|
+
let file = tempfile().map_err(PyOSError::new_err)?;
|
|
141
142
|
file.set_len(self.select_index[0].len() as u64)
|
|
142
|
-
.map_err(
|
|
143
|
+
.map_err(PyOSError::new_err)?;
|
|
143
144
|
file
|
|
144
145
|
},
|
|
145
146
|
{
|
|
146
|
-
let file = tempfile().map_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(
|
|
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(
|
|
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(
|
|
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(
|
|
170
|
+
ranks: ranks.make_read_only().map_err(PyOSError::new_err)?,
|
|
170
171
|
ranks_file,
|
|
171
|
-
blocks: blocks.make_read_only().map_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(
|
|
177
|
+
.map_err(PyOSError::new_err)?,
|
|
177
178
|
select_index_1
|
|
178
179
|
.make_read_only()
|
|
179
|
-
.map_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
|
-
|
|
292
|
-
.
|
|
293
|
-
|
|
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
|
}
|
{wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/disk_wavelet_matrix/disk_wavelet_matrix.rs
RENAMED
|
@@ -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::
|
|
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(
|
|
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(
|
|
50
|
+
.map_err(PyOSError::new_err)?;
|
|
51
51
|
#[allow(unsafe_code)]
|
|
52
|
-
let mut current_layer_bits =
|
|
53
|
-
MmapMut::map_mut(¤t_layer_bits_file).map_err(
|
|
54
|
-
};
|
|
52
|
+
let mut current_layer_bits =
|
|
53
|
+
unsafe { MmapMut::map_mut(¤t_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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
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();
|
{wavelet_matrix-2.2.4 → wavelet_matrix-2.2.5}/src/dynamic_wavelet_matrix/dynamic_wavelet_matrix.rs
RENAMED
|
@@ -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::
|
|
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(
|
|
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
|