use crate::bf16::Bf16;
use crate::lattice::PaddedTileLattice;
pub trait IsZero {
fn is_zero(&self) -> bool;
}
impl IsZero for f32 {
#[inline]
fn is_zero(&self) -> bool {
*self == 0.0
}
}
impl IsZero for f64 {
#[inline]
fn is_zero(&self) -> bool {
*self == 0.0
}
}
impl IsZero for i8 {
#[inline]
fn is_zero(&self) -> bool {
*self == 0
}
}
impl IsZero for i32 {
#[inline]
fn is_zero(&self) -> bool {
*self == 0
}
}
impl IsZero for Bf16 {
#[inline]
fn is_zero(&self) -> bool {
Bf16::is_zero(*self)
}
}
impl<T: IsZero> PaddedTileLattice<T> {
pub fn is_tile_zero(&self, tile_row: usize, tile_col: usize) -> bool {
self.tile_slice(tile_row, tile_col)
.iter()
.all(|x| x.is_zero())
}
pub fn count_zero_tiles(&self) -> usize {
self.iter_tiles()
.filter(|(_, _, slice)| slice.iter().all(|x| x.is_zero()))
.count()
}
pub fn nonzero_tile_coords(&self) -> Vec<(usize, usize)> {
self.iter_tiles()
.filter(|(_, _, slice)| !slice.iter().all(|x| x.is_zero()))
.map(|(r, c, _)| (r, c))
.collect()
}
pub fn tile_sparsity(&self) -> f64 {
let total = self.num_tiles();
if total == 0 {
return 0.0;
}
self.count_zero_tiles() as f64 / total as f64
}
pub fn tile_density(&self) -> f64 {
1.0 - self.tile_sparsity()
}
}