use crate::fuse::{compute_importance, sort_by_importance};
use strided_view::auxiliary::index_order;
pub(crate) fn compute_order(
dims: &[usize],
strides_list: &[&[isize]],
dest_index: Option<usize>,
) -> Vec<usize> {
let rank = dims.len();
if rank == 0 {
return Vec::new();
}
if strides_list.is_empty() {
return (0..rank).collect();
}
let mut index_orders: Vec<Vec<usize>> = Vec::with_capacity(strides_list.len());
for strides in strides_list {
index_orders.push(index_order(strides));
}
let reordered_strides: Vec<&[isize]>;
let reordered_orders: Vec<Vec<usize>>;
if let Some(dest_idx) = dest_index {
if dest_idx < strides_list.len() && dest_idx != 0 {
let mut strides_vec: Vec<&[isize]> = strides_list.to_vec();
let mut orders_vec = index_orders;
let dest_strides = strides_vec.remove(dest_idx);
let dest_order = orders_vec.remove(dest_idx);
strides_vec.insert(0, dest_strides);
orders_vec.insert(0, dest_order);
reordered_strides = strides_vec;
reordered_orders = orders_vec;
} else {
reordered_strides = strides_list.to_vec();
reordered_orders = index_orders;
}
} else {
reordered_strides = strides_list.to_vec();
reordered_orders = index_orders;
}
let importance = compute_importance(dims, &reordered_strides, &reordered_orders);
sort_by_importance(&importance)
}
#[cfg(test)]
#[path = "order/tests/tests.rs"]
mod tests;