#![allow(dead_code)]
use super::*;
impl SparseIoVec {
pub fn assign_groups<T>(&mut self, column_to_group: &[T], ncolumns_per_group: Option<usize>)
where
T: Sync + Send + std::hash::Hash + Eq + Clone + ToString,
{
let partitions = partition_by_membership(column_to_group, ncolumns_per_group);
let mut sorted_partitions: Vec<_> = partitions
.into_iter()
.map(|(k, cols)| (k.to_string().into_boxed_str(), cols))
.collect();
sorted_partitions.sort_by(|a, b| a.0.cmp(&b.0));
let (group_keys, group_to_cols): (Vec<Box<str>>, Vec<Vec<usize>>) =
sorted_partitions.into_iter().unzip();
let col_to_group: HashMap<_, _> = group_to_cols
.iter()
.enumerate()
.flat_map(|(g, cols)| cols.iter().map(move |&j| (j, g)))
.collect();
self.derived.group_keys = Some(group_keys);
self.derived.group_to_cols = Some(group_to_cols);
self.derived.col_to_group = Some(col_to_group);
}
pub fn take_grouped_columns(&self) -> Option<&Vec<Vec<usize>>> {
self.derived.group_to_cols.as_ref()
}
pub fn group_keys(&self) -> Option<&Vec<Box<str>>> {
self.derived.group_keys.as_ref()
}
pub fn group_key_to_cols(&self) -> Option<HashMap<Box<str>, Vec<usize>>> {
if let (Some(keys), Some(cols)) = (&self.derived.group_keys, &self.derived.group_to_cols) {
Some(
keys.iter()
.zip(cols.iter())
.map(|(k, c)| (k.clone(), c.clone()))
.collect(),
)
} else {
None
}
}
pub fn take_backend_columns(&self) -> Vec<(Box<str>, Vec<usize>)> {
self.data_to_cols
.iter()
.filter_map(|(&didx, cols)| {
if let Some(arc_data) = self.data_vec.get(didx) {
let k = arc_data.get_backend_file_name();
let kept: Vec<usize> =
cols.iter().copied().filter(|&c| c != usize::MAX).collect();
Some((Box::<str>::from(k), kept))
} else {
None
}
})
.collect()
}
pub fn get_group_membership<I>(&self, cells: I) -> anyhow::Result<Vec<usize>>
where
I: Iterator<Item = usize>,
{
let cell_to_group = self
.derived
.col_to_group
.as_ref()
.expect("groups were not assigned");
cells
.map(|j| {
cell_to_group
.get(&j)
.copied()
.ok_or_else(|| anyhow::anyhow!("missing group membership"))
})
.collect()
}
pub fn num_groups(&self) -> usize {
self.derived
.group_to_cols
.as_ref()
.map(|x| x.len())
.unwrap_or(0)
}
}