Skip to main content

ThetaUnion

Struct ThetaUnion 

Source
pub struct ThetaUnion { /* private fields */ }
Expand description

A streaming union accumulator over theta sketches. Accepts any of super::ThetaSketch, CompactThetaSketch, or super::WrappedCompactThetaSketch via the sealed ThetaInput trait.

Implementations§

Source§

impl ThetaUnion

Source

pub fn update(&mut self, input: &impl ThetaInput)

Merges the given sketch into this union’s running result.

Examples found in repository?
examples/theta.rs (line 34)
11fn main() {
12    // Build two sketches representing two overlapping sets of user IDs.
13    let mut visitors_day1 = ThetaSketchBuilder::new().lg_k(12).build().unwrap();
14    for id in 0..10_000u64 {
15        visitors_day1.update_u64(id);
16    }
17
18    let mut visitors_day2 = ThetaSketchBuilder::new().lg_k(12).build().unwrap();
19    for id in 5_000..15_000u64 {
20        visitors_day2.update_u64(id);
21    }
22
23    println!(
24        "Day 1 unique visitors (estimate): {:.0}",
25        visitors_day1.get_estimate()
26    );
27    println!(
28        "Day 2 unique visitors (estimate): {:.0}",
29        visitors_day2.get_estimate()
30    );
31
32    // Union: total unique visitors across both days.
33    let mut union = ThetaUnionBuilder::new().lg_k(12).build().unwrap();
34    union.update(&visitors_day1);
35    union.update(&visitors_day2);
36    let total_unique = union.get_result(true);
37    println!(
38        "Total unique visitors (union estimate): {:.0}",
39        total_unique.get_estimate()
40    );
41
42    // Intersection: visitors who came back on day 2.
43    let mut intersection = ThetaIntersection::new();
44    intersection.update(&visitors_day1);
45    intersection.update(&visitors_day2);
46    match intersection.get_result(true) {
47        Ok(returning) => println!(
48            "Returning visitors (intersection estimate): {:.0}",
49            returning.get_estimate()
50        ),
51        Err(e) => println!("No intersection result: {e}"),
52    }
53
54    // A-not-b: visitors who only came on day 1.
55    let a_not_b = ThetaAnotB::new();
56    let day1_only = a_not_b.compute(&visitors_day1, &visitors_day2, true);
57    println!(
58        "Day-1-only visitors (a-not-b estimate): {:.0}",
59        day1_only.get_estimate()
60    );
61
62    // Jaccard similarity: how similar are the two days' visitor sets?
63    let similarity = jaccard_similarity(&visitors_day1, &visitors_day2);
64    println!(
65        "Jaccard similarity: {:.3} (range [{:.3}, {:.3}])",
66        similarity.estimate, similarity.lower_bound, similarity.upper_bound
67    );
68
69    // Serialize a compact sketch for storage/transmission, then restore it.
70    let compact = visitors_day1.compact(true);
71    let bytes = compact.serialize_compact();
72    println!("Serialized day-1 sketch: {} bytes", bytes.len());
73    let restored = apache_datasketches::theta::CompactThetaSketch::deserialize(&bytes).unwrap();
74    println!("Restored estimate: {:.0}", restored.get_estimate());
75}
Source

pub fn get_result(&self, ordered: bool) -> CompactThetaSketch

Returns the union’s current result as a CompactThetaSketch. If ordered is true, the result’s entries are sorted by hash value.

Examples found in repository?
examples/theta.rs (line 36)
11fn main() {
12    // Build two sketches representing two overlapping sets of user IDs.
13    let mut visitors_day1 = ThetaSketchBuilder::new().lg_k(12).build().unwrap();
14    for id in 0..10_000u64 {
15        visitors_day1.update_u64(id);
16    }
17
18    let mut visitors_day2 = ThetaSketchBuilder::new().lg_k(12).build().unwrap();
19    for id in 5_000..15_000u64 {
20        visitors_day2.update_u64(id);
21    }
22
23    println!(
24        "Day 1 unique visitors (estimate): {:.0}",
25        visitors_day1.get_estimate()
26    );
27    println!(
28        "Day 2 unique visitors (estimate): {:.0}",
29        visitors_day2.get_estimate()
30    );
31
32    // Union: total unique visitors across both days.
33    let mut union = ThetaUnionBuilder::new().lg_k(12).build().unwrap();
34    union.update(&visitors_day1);
35    union.update(&visitors_day2);
36    let total_unique = union.get_result(true);
37    println!(
38        "Total unique visitors (union estimate): {:.0}",
39        total_unique.get_estimate()
40    );
41
42    // Intersection: visitors who came back on day 2.
43    let mut intersection = ThetaIntersection::new();
44    intersection.update(&visitors_day1);
45    intersection.update(&visitors_day2);
46    match intersection.get_result(true) {
47        Ok(returning) => println!(
48            "Returning visitors (intersection estimate): {:.0}",
49            returning.get_estimate()
50        ),
51        Err(e) => println!("No intersection result: {e}"),
52    }
53
54    // A-not-b: visitors who only came on day 1.
55    let a_not_b = ThetaAnotB::new();
56    let day1_only = a_not_b.compute(&visitors_day1, &visitors_day2, true);
57    println!(
58        "Day-1-only visitors (a-not-b estimate): {:.0}",
59        day1_only.get_estimate()
60    );
61
62    // Jaccard similarity: how similar are the two days' visitor sets?
63    let similarity = jaccard_similarity(&visitors_day1, &visitors_day2);
64    println!(
65        "Jaccard similarity: {:.3} (range [{:.3}, {:.3}])",
66        similarity.estimate, similarity.lower_bound, similarity.upper_bound
67    );
68
69    // Serialize a compact sketch for storage/transmission, then restore it.
70    let compact = visitors_day1.compact(true);
71    let bytes = compact.serialize_compact();
72    println!("Serialized day-1 sketch: {} bytes", bytes.len());
73    let restored = apache_datasketches::theta::CompactThetaSketch::deserialize(&bytes).unwrap();
74    println!("Restored estimate: {:.0}", restored.get_estimate());
75}
Source

pub fn reset(&mut self)

Resets this union to its initial, empty state.

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.