use ndarray::Array1;
use rayon::prelude::*;
use crate::statistics::sum;
#[inline]
pub fn normalized_gaussian(
sigma: f64,
bins: usize,
width: f64,
center: f64,
threads: Option<usize>,
) -> Array1<f64> {
let mut gauss_arr = vec![0.0; bins];
let width = width / (bins as f64 - 1.0);
let sigma_sq = 2.0 * sigma * sigma;
let gauss_calc = |(i, v): (usize, &mut f64)| {
let d = (i as f64 * width) - center;
*v = (-(d * d) / sigma_sq).exp();
};
par!(threads,
seq_exp: gauss_arr.iter_mut().enumerate().for_each(gauss_calc),
par_exp: gauss_arr.par_iter_mut().enumerate().for_each(gauss_calc));
let gauss_sum = sum(&gauss_arr, threads);
par!(threads,
seq_exp: gauss_arr.iter_mut().for_each(|v| *v /= gauss_sum),
par_exp: gauss_arr.par_iter_mut().for_each(|v| *v /= gauss_sum));
Array1::from_vec(gauss_arr)
}