use crate::ir::{ArgType, Node};
pub fn flatten_config(curr: &Node) -> (usize, usize) {
let mut start_dim: i64 = 1;
if curr.inputs.len() != 1 {
panic!(
"Flatten: multiple inputs are not supported (got {:?})",
curr.inputs.len()
);
}
let tensor = match curr.inputs.first().unwrap().clone().ty {
ArgType::Tensor(tensor) => tensor,
_ => panic!("Only tensor input is valid"),
};
if tensor.dim < 2 {
panic!(
"Flatten: input tensor must have at least 2 dimensions (got {:?})",
tensor.dim
);
}
let end_dim = tensor.dim - 1;
for (key, value) in curr.attrs.iter() {
if key.as_str() == "axis" {
start_dim = value.clone().into_i64();
}
}
if start_dim < 0 {
start_dim += tensor.dim as i64;
}
(start_dim as usize, end_dim)
}
pub fn shape_config(curr: &Node) -> (usize, usize) {
if curr.inputs.len() != 1 {
panic!(
"Shape: multiple inputs are not supported (got {:?})",
curr.inputs.len()
);
}
let tensor = match curr.inputs.first().unwrap().clone().ty {
ArgType::Tensor(tensor) => tensor,
_ => panic!("Only tensor input is valid"),
};
let mut start_dim: i64 = 0;
let mut end_dim: i64 = tensor.dim as i64;
for (key, value) in curr.attrs.iter() {
match key.as_str() {
"start" => start_dim = value.clone().into_i64(),
"end" => end_dim = value.clone().into_i64(),
_ => {}
}
}
if start_dim < 0 {
start_dim += tensor.dim as i64;
}
if end_dim < 0 {
end_dim += tensor.dim as i64;
}
(start_dim as usize, end_dim as usize)
}