pub struct CompactThetaSketch { /* private fields */ }Expand description
An immutable, serializable snapshot of a theta sketch. Produced by
super::ThetaSketch::compact, by any set operation’s result
(ThetaUnion::get_result, ThetaIntersection::get_result,
ThetaAnotB::compute), or by Self::deserialize.
Implementations§
Source§impl CompactThetaSketch
impl CompactThetaSketch
Sourcepub fn deserialize(bytes: &[u8]) -> Result<Self, SketchError>
pub fn deserialize(bytes: &[u8]) -> Result<Self, SketchError>
Deserializes v1/v2/v3 (uncompressed) bytes. Upstream’s deserialize()
auto-detects the serial version transparently, including v4
(compressed) — see Self::deserialize_compressed, which calls the
exact same underlying routine; the two Rust names exist purely for
call-site symmetry with serialize_compact/serialize_compressed.
Examples found in repository?
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 deserialize_compressed(bytes: &[u8]) -> Result<Self, SketchError>
pub fn deserialize_compressed(bytes: &[u8]) -> Result<Self, SketchError>
Deserializes v4 (compressed) bytes. See Self::deserialize — both
methods call the same upstream auto-detecting deserialize().
Sourcepub fn get_estimate(&self) -> f64
pub fn get_estimate(&self) -> f64
Returns the current estimate of the number of distinct items in this sketch.
Examples found in repository?
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_lower_bound(&self, num_std_dev: u8) -> Result<f64, SketchError>
pub fn get_lower_bound(&self, num_std_dev: u8) -> Result<f64, SketchError>
Returns the lower bound of the confidence interval around
Self::get_estimate. See
ThetaSketch::get_lower_bound
for the meaning of num_std_dev.
Sourcepub fn get_upper_bound(&self, num_std_dev: u8) -> Result<f64, SketchError>
pub fn get_upper_bound(&self, num_std_dev: u8) -> Result<f64, SketchError>
Returns the upper bound of the confidence interval around
Self::get_estimate. See
ThetaSketch::get_lower_bound
for the meaning of num_std_dev.
Sourcepub fn is_estimation_mode(&self) -> bool
pub fn is_estimation_mode(&self) -> bool
Returns true if this sketch’s theta threshold is below 1.0
(i.e. Self::get_estimate is a statistical estimate rather than
an exact count).
Sourcepub fn is_ordered(&self) -> bool
pub fn is_ordered(&self) -> bool
Returns true if this sketch’s retained entries are sorted by hash
value.
Sourcepub fn get_theta(&self) -> f64
pub fn get_theta(&self) -> f64
Returns the current theta threshold (1.0 if not in estimation
mode).
Sourcepub fn get_num_retained(&self) -> u32
pub fn get_num_retained(&self) -> u32
Returns the number of entries currently retained by this sketch.
Sourcepub fn serialize_compact(&self) -> Vec<u8> ⓘ
pub fn serialize_compact(&self) -> Vec<u8> ⓘ
Serializes in the v3 (uncompressed) format. Note: unlike the design
spec’s initially-sketched signature, this takes no ordered
parameter — upstream’s compact_theta_sketch::serialize() has none;
orderedness is fixed when this sketch was created (e.g. via
ThetaSketch::compact(ordered)).
Examples found in repository?
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 serialize_compressed(&self) -> Vec<u8> ⓘ
pub fn serialize_compressed(&self) -> Vec<u8> ⓘ
Serializes in the v4 (compressed) format.