use crate::{Node, TensorData};
#[derive(Debug, Clone, PartialEq)]
pub struct TileConfig {
pub repeats: Vec<usize>,
}
impl TileConfig {
pub fn new(repeats: Vec<usize>) -> Self {
TileConfig { repeats }
}
}
pub fn tile_config(node: &Node) -> TileConfig {
let repeat = node
.inputs
.get(1)
.map(|input| {
if let Some(TensorData { data, .. }) = &input.value {
data.clone()
.into_i64s()
.iter()
.map(|&x| x as usize)
.collect()
} else {
vec![]
}
})
.unwrap_or_default();
TileConfig::new(repeat)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ir::NodeType;
use crate::node::test_utils::NodeBuilder;
fn create_test_node(repeats: Option<Vec<i64>>, input_rank: usize) -> Node {
let mut builder = NodeBuilder::new(NodeType::Tile, "test_tile")
.input_tensor_f32("input", input_rank, None)
.output_tensor_f32("output", input_rank, None);
if let Some(reps) = repeats {
builder = builder.input_tensor_i64_data("repeats", reps.clone(), vec![reps.len()]);
}
builder.build()
}
#[test]
fn test_tile_config_with_repeats() {
let repeats = vec![2, 3, 4];
let node = create_test_node(Some(repeats.clone()), 3);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![2, 3, 4]);
}
#[test]
fn test_tile_config_with_single_repeat() {
let repeats = vec![5];
let node = create_test_node(Some(repeats.clone()), 1);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![5]);
}
#[test]
fn test_tile_config_with_zero_repeats() {
let repeats = vec![0, 1, 0];
let node = create_test_node(Some(repeats.clone()), 3);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![0, 1, 0]);
}
#[test]
fn test_tile_config_with_large_repeats() {
let repeats = vec![100, 200];
let node = create_test_node(Some(repeats.clone()), 2);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![100, 200]);
}
#[test]
fn test_tile_config_without_repeats_input() {
let node = create_test_node(None, 3);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![]);
}
#[test]
fn test_tile_config_with_negative_repeats() {
let repeats = vec![-1, 2, -3];
let node = create_test_node(Some(repeats), 3);
let config = tile_config(&node);
assert!(config.repeats[0] > 0);
assert_eq!(config.repeats[1], 2);
assert!(config.repeats[2] > 0);
}
#[test]
fn test_tile_config_with_empty_repeats() {
let repeats = vec![];
let node = create_test_node(Some(repeats), 3);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![]);
}
#[test]
fn test_tile_config_with_missing_value() {
let mut node = create_test_node(None, 3);
node.inputs.push(
NodeBuilder::new(NodeType::Identity, "temp")
.input_tensor_i64("repeats", 1, Some(vec![3]))
.build()
.inputs
.pop()
.unwrap(),
);
let config = tile_config(&node);
assert_eq!(config.repeats, vec![]);
}
}