geometry.rs
1.2 kB · rust · 33 lines
1use super::models::CellNd;2use mrlycore::cell;3use mrlycore::errors::Result;4use mrlycore::tensor::Tensor;56/// Merges same-shaped cells into one block laid out by the per-axis repetition counts.7pub fn merge_reps<const N: usize>(cells: &[CellNd<N>], reps: &[usize]) -> Result<CellNd<N>> {8 let inner: Vec<cell::Cell> = cells.iter().map(|c| c.cell.clone()).collect();9 Ok(CellNd {10 cell: cell::merge(&inner, reps)?,11 })12}1314/// Folds two or more cells into one by chained Kronecker combination.15pub fn magic<const N: usize>(cells: &[CellNd<N>]) -> Result<CellNd<N>> {16 let inner: Vec<cell::Cell> = cells.iter().map(|c| c.cell.clone()).collect();17 Ok(CellNd {18 cell: cell::magic(&inner)?,19 })20}2122/// Builds a cell by placing at each mask site the cell its value indexes.23pub fn mosaic<const N: usize>(mask: &Tensor, cells: &[CellNd<N>]) -> Result<CellNd<N>> {24 let inner: Vec<cell::Cell> = cells.iter().map(|c| c.cell.clone()).collect();25 Ok(CellNd {26 cell: cell::mosaic(mask, &inner)?,27 })28}2930/// Writes the value into the cell wherever the tiled mask is nonzero.31pub fn perforate<const N: usize>(mask: &Tensor, cell: &CellNd<N>, value: u8) -> Result<CellNd<N>> {32 cell.clone().perforate(mask, value)33}