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(())
}