use fnntw::distance::*;
use ordered_float::NotNan;

use criterion::{black_box, criterion_group, criterion_main, Criterion};

type T = f64;

fn criterion_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("euclidean");
    group.sample_size(100);

    const NDATA: usize = 100_000;
    const D: usize = 3;

    let aa: Vec<[NotNan<T>; D]> = [(); NDATA]
        .map(|_| [(); D].map(|_| NotNan::new(rand::random()).unwrap()))
        .to_vec();
    let bb: Vec<[NotNan<T>; D]> = [(); NDATA]
        .map(|_| [(); D].map(|_| NotNan::new(rand::random()).unwrap()))
        .to_vec();

    group.bench_function("squared_euclidean 3D", |b| {
        b.iter(|| {
            for i in 0..NDATA {
                unsafe {
                    squared_euclidean(
                        black_box(aa.get_unchecked(i)),
                        black_box(bb.get_unchecked(i)),
                    )
                };
            }
        })
    });

    group.finish();
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
