use nalgebra::DMatrix;
#[derive(Default, Debug, Clone)]
pub struct BlockArray {
pub block_array: DMatrix<usize>,
}
impl BlockArray {
pub fn from_block_array(block_array: &DMatrix<usize>) -> Self {
Self { block_array: block_array.clone() }
}
pub fn as_sorted(&mut self) -> DMatrix<usize> {
let mut block_array_out = self.block_array.clone();
for mut row in block_array_out.row_iter_mut() {
let mut swapped = true;
while swapped {
swapped = false;
for i in 0..row.len()-1 {
if row[i] > row[i + 1] {
row.swap_columns(i, i + 1);
swapped = true;
}
}
}
}
for _ in 0..block_array_out.ncols() {
let mut swapped = true;
while swapped {
swapped = false;
for j in 0..block_array_out.nrows()-1 {
let row_j = block_array_out.row(j).clone_owned();
let row_j1 = block_array_out.row(j+1).clone_owned();
let diff = row_j.cast::<i32>() - row_j1.cast::<i32>();
if let Some(first_non_zero) = diff.iter().position(|&x| x != 0) {
if diff[first_non_zero] > 0 {
block_array_out.swap_rows(j, j+1);
swapped = true;
}
}
}
}
}
block_array_out
}
}