use super::models::CellNd; use mrlycore::cell; use mrlycore::errors::Result; use mrlycore::tensor::Tensor; /// Merges same-shaped cells into one block laid out by the per-axis repetition counts. pub fn merge_reps(cells: &[CellNd], reps: &[usize]) -> Result> { let inner: Vec = cells.iter().map(|c| c.cell.clone()).collect(); Ok(CellNd { cell: cell::merge(&inner, reps)?, }) } /// Folds two or more cells into one by chained Kronecker combination. pub fn magic(cells: &[CellNd]) -> Result> { let inner: Vec = cells.iter().map(|c| c.cell.clone()).collect(); Ok(CellNd { cell: cell::magic(&inner)?, }) } /// Builds a cell by placing at each mask site the cell its value indexes. pub fn mosaic(mask: &Tensor, cells: &[CellNd]) -> Result> { let inner: Vec = cells.iter().map(|c| c.cell.clone()).collect(); Ok(CellNd { cell: cell::mosaic(mask, &inner)?, }) } /// Writes the value into the cell wherever the tiled mask is nonzero. pub fn perforate(mask: &Tensor, cell: &CellNd, value: u8) -> Result> { cell.clone().perforate(mask, value) }