use bit_set::BitSet;
use crate::data_structures::poset::Poset;
pub struct IcebergLattice {
pub poset: Poset<(BitSet, BitSet)>,
pub support: Vec<u32>,
pub total_objects: u32,
}
impl IcebergLattice {
pub fn new(poset: Poset<(BitSet, BitSet)>, support: Vec<u32>, total_objects: u32) -> Self {
debug_assert_eq!(support.len(), poset.nodes.len());
IcebergLattice { poset, support, total_objects }
}
pub fn empty(total_objects: u32) -> Self {
let poset = Poset::from_covering_relation(vec![], vec![])
.expect("empty poset is always valid");
IcebergLattice { poset, support: Vec::new(), total_objects }
}
pub fn relative_support(&self, node_idx: usize) -> f64 {
if self.total_objects == 0 {
return 0.0;
}
self.support[node_idx] as f64 / self.total_objects as f64
}
}