#[derive(Debug, Clone)]
pub struct CauchySchwarzScreening {
pub pair_bounds: Vec<f64>,
pub aux_bounds: Vec<f64>,
pub threshold: f64,
pub norbs: usize,
pub naux: usize,
}
impl CauchySchwarzScreening {
pub fn new(norbs: usize, naux: usize, threshold: f64) -> Self {
Self {
pair_bounds: vec![0.0; norbs * norbs],
aux_bounds: vec![0.0; naux],
threshold,
norbs,
naux,
}
}
#[inline(always)]
pub fn set_pair_bound(&mut self, mu: usize, nu: usize, val: f64) {
self.pair_bounds[mu * self.norbs + nu] = val;
}
#[inline(always)]
pub fn set_aux_bound(&mut self, p: usize, val: f64) {
self.aux_bounds[p] = val;
}
#[inline(always)]
pub fn is_screened(&self, mu: usize, nu: usize, p: usize) -> bool {
let max_estimate = self.pair_bounds[mu * self.norbs + nu] * self.aux_bounds[p];
max_estimate < self.threshold
}
}