poulpy/backend/src/hal/layouts/stats.rs
backend/src/hal/layouts/stats.rsRaw
1use rug::{
2 Float,
3 float::Round,
4 ops::{AddAssignRound, DivAssignRound, SubAssignRound},
5};
6
7use crate::hal::{
8 api::ZnxInfos,
9 layouts::{DataRef, VecZnx},
10};
11
12impl<D: DataRef> VecZnx<D> {
13 pub fn std(&self, basek: usize, col: usize) -> f64 {
14 let prec: u32 = (self.size() * basek) as u32;
15 let mut data: Vec<Float> = (0..self.n()).map(|_| Float::with_val(prec, 0)).collect();
16 self.decode_vec_float(basek, col, &mut data);
17 // std = sqrt(sum((xi - avg)^2) / n)
18 let mut avg: Float = Float::with_val(prec, 0);
19 data.iter().for_each(|x| {
20 avg.add_assign_round(x, Round::Nearest);
21 });
22 avg.div_assign_round(Float::with_val(prec, data.len()), Round::Nearest);
23 data.iter_mut().for_each(|x| {
24 x.sub_assign_round(&avg, Round::Nearest);
25 });
26 let mut std: Float = Float::with_val(prec, 0);
27 data.iter().for_each(|x| std += x * x);
28 std.div_assign_round(Float::with_val(prec, data.len()), Round::Nearest);
29 std = std.sqrt();
30 std.to_f64()
31 }
32}