1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use rand::rngs::SmallRng;
use rand::{thread_rng, Rng, SeedableRng};
use rand_distr::StandardNormal;

pub fn increase_capacity<T>(size: usize, container: &mut Vec<T>) {
    if container.capacity() < size {
        let diff = size - container.capacity();
        container.reserve(diff)
    }
}

pub fn create_rng(seed: u64) -> SmallRng {
    // TODO: if seed == 0, use random seeded rng
    if seed == 0 {
        match SmallRng::from_rng(thread_rng()) {
            Ok(rng) => rng,
            Err(_) => SmallRng::from_entropy(),
        }
    } else {
        SmallRng::seed_from_u64(seed)
    }
}

pub fn rand_unit_vec<RNG: Rng>(size: usize, rng: RNG) -> Vec<f32> {
    rng.sample_iter(StandardNormal).take(size).collect()
}

pub fn all_eq<T>(u: &[T], v: &[T]) -> bool
where
    T: PartialEq,
{
    if u.len() != v.len() {
        return false;
    }
    for (u_, v_) in u.iter().zip(v) {
        if u_ != v_ {
            return false;
        }
    }
    true
}

#[cfg(test)]
mod test {
    use super::*;
    use rand::SeedableRng;

    #[test]
    fn test_all_eq() {
        assert!(all_eq(&[1, 2], &[1, 2]));
        assert!(all_eq(&[1., 2.], &[1., 2.]));
        assert!(!all_eq(&[1.1, -1.], &[1., 2.]));
    }
}