use crate::fuse::{compute_importance, sort_by_importance};
use crate::inline::{InlineVec, OperandVec};
use strided_view::auxiliary::index_order;
pub(crate) fn compute_order(
dims: &[usize],
strides_list: &[&[isize]],
dest_index: Option<usize>,
) -> InlineVec<usize> {
let rank = dims.len();
if rank == 0 {
return InlineVec::new();
}
if strides_list.is_empty() {
return (0..rank).collect();
}
let mut index_orders: OperandVec<InlineVec<usize>> = OperandVec::new();
for strides in strides_list {
index_orders.push(index_order(strides));
}
let reordered_strides: OperandVec<&[isize]>;
let reordered_orders: OperandVec<InlineVec<usize>>;
if let Some(dest_idx) = dest_index {
if dest_idx < strides_list.len() && dest_idx != 0 {
let mut strides_vec: OperandVec<&[isize]> = strides_list.iter().copied().collect();
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.iter().copied().collect();
reordered_orders = index_orders;
}
} else {
reordered_strides = strides_list.iter().copied().collect();
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;