use apache_datasketches::cpc::{CpcSketch, CpcSketchBuilder, CpcUnionBuilder};
fn main() {
let mut visitors_day1 = CpcSketchBuilder::new()
.lg_k(11)
.build()
.expect("valid lg_k");
for id in 0..10_000u64 {
visitors_day1.update_u64(id);
}
let mut visitors_day2 = CpcSketchBuilder::new()
.lg_k(11)
.build()
.expect("valid lg_k");
for id in 5_000..15_000u64 {
visitors_day2.update_u64(id);
}
println!(
"Day 1 unique visitors (estimate): {:.0}",
visitors_day1.get_estimate()
);
println!(
"Day 2 unique visitors (estimate): {:.0}",
visitors_day2.get_estimate()
);
println!(
"Day 1, 95% confidence interval: [{:.0}, {:.0}]",
visitors_day1.get_lower_bound(2).unwrap(),
visitors_day1.get_upper_bound(2).unwrap()
);
let mut union = CpcUnionBuilder::new().lg_k(11).build().expect("valid lg_k");
union.update(&visitors_day1);
union.update(&visitors_day2);
let total_unique = union.get_result();
println!(
"Total unique visitors across both days (true count = 15000): {:.0}",
total_unique.get_estimate()
);
let bytes = visitors_day1.serialize();
let restored = CpcSketch::deserialize(&bytes).expect("valid sketch bytes");
println!(
"serialized day-1 sketch to {} bytes and restored successfully (estimate {:.0})",
bytes.len(),
restored.get_estimate()
);
}