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}