use range_filters::data_gen::generate_smooth_u16;
use range_filters::diva::Diva;
fn main() {
let mut keys = generate_smooth_u16(Some(3000));
keys.sort();
let keys = keys.into_iter().map(|k| k as u64).collect::<Vec<_>>();
let target_size = 1024;
let false_positive_rate = 0.01; let diva = Diva::new_with_keys(&keys, target_size, false_positive_rate);
println!("\n=== Point Query Examples ===");
let test_keys = vec![
keys[0], keys[keys.len() / 4], keys[keys.len() / 2], keys[3 * keys.len() / 4], keys[keys.len() - 1], ];
println!("Testing existing keys:");
for &key in &test_keys {
let result = diva.contains(key);
println!(
" Key {}: {} (expected: found)",
key,
if result { "✓ FOUND" } else { "✗ NOT FOUND" }
);
}
let first_key = keys[0];
let last_key = keys[keys.len() - 1];
let non_existing_keys = vec![
first_key.saturating_sub(100), first_key + 1, (first_key + last_key) / 2 + 1, last_key + 100, ];
println!("\nTesting potentially non-existing keys:");
for &key in &non_existing_keys {
let result = diva.contains(key);
let actually_exists = keys.contains(&key);
println!(
" Key {}: {} (actual: {})",
key,
if result { "✓ FOUND" } else { "✗ NOT FOUND" },
if actually_exists {
"exists"
} else {
"does not exist"
}
);
if result && !actually_exists {
println!(" ^ FALSE POSITIVE detected!");
}
}
println!("\n=== Range Query Examples ===");
let first_key = keys[0];
let last_key = keys[keys.len() - 1];
let mid_key = keys[keys.len() / 2];
let range_tests = vec![
(first_key, first_key + 100), (mid_key - 50, mid_key + 50), (last_key - 100, last_key), (first_key, mid_key), (mid_key, last_key), (keys[keys.len() / 4], keys[3 * keys.len() / 4]), (first_key, last_key), (first_key.saturating_sub(1000), first_key.saturating_sub(1)), (last_key + 1, last_key + 1000), (mid_key, mid_key), ];
for &(start, end) in &range_tests {
let result = diva.range_query(start, end);
let actual_keys_in_range: Vec<&u64> =
keys.iter().filter(|&&k| k >= start && k <= end).collect();
let has_keys = !actual_keys_in_range.is_empty();
println!(
" Range [{}, {}]: {} (actual: {} keys)",
start,
end,
if result {
"✓ HAS KEYS"
} else {
"✗ NO KEYS"
},
actual_keys_in_range.len()
);
if result && !has_keys {
println!(" ^ FALSE POSITIVE detected!");
} else if !result && has_keys {
println!(" ^ FALSE NEGATIVE detected! (This should not happen)");
}
if has_keys && actual_keys_in_range.len() <= 10 {
println!(" Keys in range: {:?}", actual_keys_in_range);
} else if has_keys && actual_keys_in_range.len() > 10 {
println!(
" Keys in range: {:?}...{} more",
&actual_keys_in_range[..5],
actual_keys_in_range.len() - 5
);
}
}
}