use murk_core::Coord;
#[derive(Clone, Debug, PartialEq)]
pub enum RegionSpec {
All,
Disk {
center: Coord,
radius: u32,
},
Rect {
min: Coord,
max: Coord,
},
Neighbours {
center: Coord,
depth: u32,
},
Coords(Vec<Coord>),
}
#[derive(Clone, Debug)]
pub struct RegionPlan {
pub cell_count: usize,
pub coords: Vec<Coord>,
pub tensor_indices: Vec<usize>,
pub valid_mask: Vec<u8>,
pub bounding_shape: BoundingShape,
}
impl RegionPlan {
pub fn valid_ratio(&self) -> f64 {
let total = self.bounding_shape.total_elements();
if total == 0 {
return 0.0;
}
self.valid_mask.iter().filter(|&&v| v == 1).count() as f64 / total as f64
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum BoundingShape {
Rect(Vec<usize>),
}
impl BoundingShape {
pub fn total_elements(&self) -> usize {
match self {
Self::Rect(dims) => dims.iter().product(),
}
}
}