lmutils 0.2.92

A set of utilities for working with linear regression models
use diol::prelude::*;
use faer::{MatRef, RowMut, RowRef};
use lmutils::{mean, variance_avx2, variance_avx512, variance_naive};

fn main() -> std::io::Result<()> {
    let mut bench = Bench::new(BenchConfig::from_args()?);
    bench.register_many(
        list![naive, avx2, avx512, faer_],
        [10, 100, 1000, 10000, 100000, 1000000, 10000000],
    );
    bench.run()?;
    Ok(())
}

fn data(len: usize) -> Vec<f64> {
    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
        .iter()
        .cycle()
        .take(len)
        .copied()
        .collect::<Vec<f64>>()
}

fn naive(bencher: Bencher, len: usize) {
    let data = data(len);
    bencher.bench(|| {
        variance_naive(&data, 0);
    });
}

fn avx2(bencher: Bencher, len: usize) {
    let data = data(len);
    bencher.bench(|| unsafe {
        if is_x86_feature_detected!("avx2") {
            variance_avx2(&data, 0);
        }
    });
}

fn avx512(bencher: Bencher, len: usize) {
    let data = data(len);
    bencher.bench(|| unsafe {
        if is_x86_feature_detected!("avx512f") {
            variance_avx512(&data, 0);
        }
    });
}

fn faer_(bencher: Bencher, len: usize) {
    let data = data(len);
    bencher.bench(|| {
        let mean = mean(&data);
        let mut variance = 0.0;
        faer::stats::row_varm(
            RowMut::from_mut(&mut variance),
            MatRef::from_column_major_slice(data.as_slice(), data.len(), 1),
            RowRef::from_ref(&mean),
            faer::stats::NanHandling::Ignore,
        );
    });
}