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
impl ThetaUnion
Sourcepub fn update(&mut self, input: &impl ThetaInput)
pub fn update(&mut self, input: &impl ThetaInput)
Merges the given sketch into this union’s running result.
Examples found in repository?
examples/bench_theta_update.rs (line 388)
376fn bench_union(items: u64, reps: usize) {
377 let (a, b) = build_operands(items);
378 let mut passes = Vec::with_capacity(reps);
379 for _ in 0..reps {
380 let start = Instant::now();
381 let mut total = 0.0;
382 let mut estimate = 0.0;
383 for _ in 0..OP_CALLS {
384 let mut union = ThetaUnionBuilder::new()
385 .lg_k(LG_K)
386 .build()
387 .expect("fixed valid parameters were rejected");
388 union.update(&a);
389 union.update(&b);
390 estimate = union.get_result(true).get_estimate();
391 total += estimate;
392 }
393 let elapsed = start.elapsed();
394 black_box(total);
395 passes.push(Pass { elapsed, estimate });
396 }
397 report_line("union", items, OP_CALLS, &passes, String::new());
398}More examples
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}Sourcepub fn get_result(&self, ordered: bool) -> CompactThetaSketch
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/bench_theta_update.rs (line 390)
376fn bench_union(items: u64, reps: usize) {
377 let (a, b) = build_operands(items);
378 let mut passes = Vec::with_capacity(reps);
379 for _ in 0..reps {
380 let start = Instant::now();
381 let mut total = 0.0;
382 let mut estimate = 0.0;
383 for _ in 0..OP_CALLS {
384 let mut union = ThetaUnionBuilder::new()
385 .lg_k(LG_K)
386 .build()
387 .expect("fixed valid parameters were rejected");
388 union.update(&a);
389 union.update(&b);
390 estimate = union.get_result(true).get_estimate();
391 total += estimate;
392 }
393 let elapsed = start.elapsed();
394 black_box(total);
395 passes.push(Pass { elapsed, estimate });
396 }
397 report_line("union", items, OP_CALLS, &passes, String::new());
398}More examples
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}Trait Implementations§
impl Send for ThetaUnion
Auto Trait Implementations§
impl !Sync for ThetaUnion
impl Freeze for ThetaUnion
impl RefUnwindSafe for ThetaUnion
impl Unpin for ThetaUnion
impl UnsafeUnpin for ThetaUnion
impl UnwindSafe for ThetaUnion
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more