p3_matrix/
util.rs
1use core::borrow::BorrowMut;
2
3use p3_maybe_rayon::prelude::*;
4use p3_util::{log2_strict_usize, reverse_bits_len};
5use tracing::instrument;
6
7use crate::dense::{DenseMatrix, DenseStorage, RowMajorMatrix};
8use crate::Matrix;
9
10#[instrument(level = "debug", skip_all)]
11pub fn reverse_matrix_index_bits<'a, F, S>(mat: &mut DenseMatrix<F, S>)
12where
13 F: Clone + Send + Sync + 'a,
14 S: DenseStorage<F> + BorrowMut<[F]>,
15{
16 let w = mat.width();
17 let h = mat.height();
18 let log_h = log2_strict_usize(h);
19 let values = mat.values.borrow_mut().as_mut_ptr() as usize;
20
21 (0..h).into_par_iter().for_each(|i| {
22 let values = values as *mut F;
23 let j = reverse_bits_len(i, log_h);
24 if i < j {
25 unsafe { swap_rows_raw(values, w, i, j) };
26 }
27 });
28}
29
30pub fn swap_rows<F: Clone + Send + Sync>(mat: &mut RowMajorMatrix<F>, i: usize, j: usize) {
32 let w = mat.width();
33 let (upper, lower) = mat.values.split_at_mut(j * w);
34 let row_i = &mut upper[i * w..(i + 1) * w];
35 let row_j = &mut lower[..w];
36 row_i.swap_with_slice(row_j);
37}
38
39pub(crate) unsafe fn swap_rows_raw<F>(mat: *mut F, w: usize, i: usize, j: usize) {
43 let row_i = core::slice::from_raw_parts_mut(mat.add(i * w), w);
44 let row_j = core::slice::from_raw_parts_mut(mat.add(j * w), w);
45 row_i.swap_with_slice(row_j);
46}