use crate::common::ResizeFactor;
use crate::error::Error;
use crate::hash::DEFAULT_UPDATE_SEED;
use crate::thetacommon::constants::DEFAULT_LG_K;
use crate::thetacommon::union::UnionState;
use crate::tuple::hash_table::TupleEntry;
use crate::tuple::policy::SummaryCombinePolicy;
use crate::tuple::sketch::CompactTupleSketch;
use crate::tuple::sketch::TupleSketchView;
#[derive(Debug)]
pub struct TupleUnion<P>
where
P: SummaryCombinePolicy,
{
state: UnionState<TupleEntry<P::Summary>, P>,
}
impl<P> TupleUnion<P>
where
P: SummaryCombinePolicy,
{
pub fn update<'a>(
&mut self,
sketch: impl Into<TupleSketchView<'a, P::Summary>>,
) -> Result<(), Error>
where
P::Summary: Clone + 'a,
{
let sketch = sketch.into();
self.state.update(sketch)
}
pub fn to_sketch(&self, ordered: bool) -> CompactTupleSketch<P::Summary>
where
P::Summary: Clone,
{
CompactTupleSketch::from_compact_state(self.state.to_compact_sketch_state(ordered))
}
pub fn reset(&mut self) {
self.state.reset();
}
pub fn estimated_size(&self) -> usize {
size_of::<Self>() + self.state.estimated_size()
}
}
#[derive(Debug)]
pub struct TupleUnionBuilder<P>
where
P: SummaryCombinePolicy,
{
lg_k: u8,
resize_factor: ResizeFactor,
sampling_probability: f32,
seed: u64,
policy: P,
}
impl<P> TupleUnionBuilder<P>
where
P: SummaryCombinePolicy,
{
pub fn new(policy: P) -> Self {
Self {
lg_k: DEFAULT_LG_K,
resize_factor: ResizeFactor::X8,
sampling_probability: 1.0,
seed: DEFAULT_UPDATE_SEED,
policy,
}
}
pub fn lg_k(mut self, lg_k: u8) -> Self {
self.lg_k = lg_k;
self
}
pub fn resize_factor(mut self, factor: ResizeFactor) -> Self {
self.resize_factor = factor;
self
}
pub fn sampling_probability(mut self, probability: f32) -> Self {
self.sampling_probability = probability;
self
}
pub fn seed(mut self, seed: u64) -> Self {
self.seed = seed;
self
}
pub fn build(self) -> Result<TupleUnion<P>, Error> {
Ok(TupleUnion {
state: UnionState::new(
self.lg_k,
self.resize_factor,
self.sampling_probability,
self.seed,
self.policy,
)?,
})
}
}