asap_sketchlib 0.2.0

A high-performance sketching library for approximate stream processing
Documentation
use std::{
    fs::File,
    io::{BufWriter, Write},
    path::PathBuf,
};

use rand::rngs::SmallRng;
use rand::{Rng, SeedableRng, rng};

const OUTPUT_PATH: &str = "src/common/precompute_sample.rs";
const MAX_VALUE: u64 = 0b1 << 16;

fn main() -> std::io::Result<()> {
    let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(OUTPUT_PATH);
    let file = File::create(&path)?;
    let mut seed_rng = rng();
    let mut generator = SmallRng::from_rng(&mut seed_rng);
    let mut writer = BufWriter::new(file);

    writeln!(
        writer,
        "//! Auto-generated by `cargo run --bin generate_precomputed_sample`."
    )?;
    writeln!(
        writer,
        "//! Precomputes part of geometric sampling: ln(1-u)."
    )?;
    writeln!(writer, "pub static PRECOMPUTED_SAMPLE: [f64; 0x10000] = [")?;

    for _ in 0..MAX_VALUE {
        let k = loop {
            let r = generator.random::<f64>();
            if r != 0.0_f64 && r != 1.0_f64 {
                break r;
            }
        };
        let f = (1.0 - k).ln();
        writeln!(writer, "    {f},")?;
    }

    writeln!(writer, "];")?;

    Ok(())
}