libcorenn 0.3.1

Library for CoreNN
Documentation
use super::Compressor;
use super::CV;
use crate::metric::StdMetric;
use crate::vec::VecData;
use std::sync::Arc;

#[derive(Debug)]
pub struct TruncCompressor {
  dim: usize,
}

impl TruncCompressor {
  pub fn new(dim: usize) -> Self {
    Self { dim }
  }
}

impl Compressor for TruncCompressor {
  fn into_compressed(&self, v: VecData) -> CV {
    macro_rules! trunc {
      ($a:expr) => {{
        $a.truncate(self.dim);
        $a
      }};
    }
    let v = match v {
      VecData::BF16(mut a) => VecData::BF16(trunc!(a)),
      VecData::F16(mut a) => VecData::F16(trunc!(a)),
      VecData::F32(mut a) => VecData::F32(trunc!(a)),
      VecData::F64(mut a) => VecData::F64(trunc!(a)),
    };
    Arc::new(v)
  }

  fn dist(&self, metric: StdMetric, a: &CV, b: &CV) -> f64 {
    let a = a.downcast_ref::<VecData>().unwrap();
    let b = b.downcast_ref::<VecData>().unwrap();
    let f = metric.get_fn();
    f(a, b)
  }
}