arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/reference/znx/sampling.rs
poulpy-hal/src/reference/znx/sampling.rsRaw
 1use rand_distr::{Distribution, Normal};
 2
 3use crate::source::Source;
 4
 5pub fn znx_fill_uniform_ref(base2k: usize, res: &mut [i64], source: &mut Source) {
 6    let pow2k: u64 = 1 << base2k;
 7    let mask: u64 = pow2k - 1;
 8    let pow2k_half: i64 = (pow2k >> 1) as i64;
 9    res.iter_mut()
10        .for_each(|xi| *xi = (source.next_u64n(pow2k, mask) as i64) - pow2k_half)
11}
12
13pub fn znx_fill_dist_f64_ref<D: rand::prelude::Distribution<f64>>(res: &mut [i64], dist: D, bound: f64, source: &mut Source) {
14    res.iter_mut().for_each(|xi| {
15        let mut dist_f64: f64 = dist.sample(source);
16        while dist_f64.abs() > bound {
17            dist_f64 = dist.sample(source)
18        }
19        *xi = dist_f64.round() as i64
20    })
21}
22
23pub fn znx_add_dist_f64_ref<D: rand::prelude::Distribution<f64>>(res: &mut [i64], dist: D, bound: f64, source: &mut Source) {
24    res.iter_mut().for_each(|xi| {
25        let mut dist_f64: f64 = dist.sample(source);
26        while dist_f64.abs() > bound {
27            dist_f64 = dist.sample(source)
28        }
29        *xi += dist_f64.round() as i64
30    })
31}
32
33pub fn znx_fill_normal_f64_ref(res: &mut [i64], sigma: f64, bound: f64, source: &mut Source) {
34    let normal: Normal<f64> = Normal::new(0.0, sigma).unwrap();
35    res.iter_mut().for_each(|xi| {
36        let mut dist_f64: f64 = normal.sample(source);
37        while dist_f64.abs() > bound {
38            dist_f64 = normal.sample(source)
39        }
40        *xi = dist_f64.round() as i64
41    })
42}
43
44pub fn znx_add_normal_f64_ref(res: &mut [i64], sigma: f64, bound: f64, source: &mut Source) {
45    let normal: Normal<f64> = Normal::new(0.0, sigma).unwrap();
46    res.iter_mut().for_each(|xi| {
47        let mut dist_f64: f64 = normal.sample(source);
48        while dist_f64.abs() > bound {
49            dist_f64 = normal.sample(source)
50        }
51        *xi += dist_f64.round() as i64
52    })
53}