fetish_lib/
rand_utils.rs

1extern crate ndarray;
2extern crate ndarray_linalg;
3
4use ndarray::*;
5
6use rand::prelude::*;
7use rand_distr::{Cauchy, Distribution, Gamma};
8use rand_distr::StandardNormal;
9use crate::params::*;
10
11fn generate_standard_normal_random<R : Rng + ?Sized>(rng : &mut R, dims : usize) -> Array1<f32> {
12    let as_vec : Vec<f32> = rng.sample_iter(StandardNormal).take(dims).collect();
13
14    Array::from(as_vec)
15}
16
17fn generate_nsphere_random<R : Rng + ?Sized>(rng : &mut R, dims : usize) -> Array1<f32> {
18    let mut vec = generate_standard_normal_random(rng, dims);
19    let mut norm = 0.0;
20    for i in 0..dims {
21        norm += vec[[i,]] * vec[[i,]]
22    }
23    let norm = norm.sqrt();
24
25    vec /= norm;
26
27    vec
28}
29
30///Generates a zero-centered Cauchy random vector with the given `scaling` parameter and
31///the given number of dimensions.
32pub fn generate_cauchy_random<R : Rng + ?Sized>(rng : &mut R, scaling : f32, dims : usize) -> Array1<f32> {
33    let cauchy = Cauchy::<f32>::new(0.0, scaling).unwrap();
34    let norm : f32 = cauchy.sample(rng);
35    let mut result = generate_nsphere_random(rng, dims);
36    result *= norm;
37
38    result
39}
40
41fn generate_inverse_gamma_random<R : Rng + ?Sized>(rng : &mut R, a : f32, b : f32) -> f32 {
42    let gamma = Gamma::<f32>::new(a, b).unwrap();
43    let inv_result = gamma.sample(rng);
44    (1.0 / inv_result)
45}
46
47///Generates an inverse-gamma random variable with the given `a` and `b` parameters.
48pub fn gen_inverse_gamma_random(rng : &mut ThreadRng, a : f32, b : f32) -> f32 {
49    generate_inverse_gamma_random(rng, a, b)
50}
51
52///Generates a random vector on the unit `dims`-sphere.
53pub fn gen_nsphere_random(rng : &mut ThreadRng, dims : usize) -> Array1<f32> {
54    generate_nsphere_random(rng, dims)
55}
56
57///Generates a random vector contained in the unit `dims`-ball.
58pub fn gen_nball_random(rng : &mut ThreadRng, dims : usize) -> Array1<f32> {
59    let mut result = gen_nsphere_random(rng, dims);
60    let u : f32 = rng.gen();
61    let exponent = 1.0f32 / (dims as f32);
62    let r = u.powf(exponent);
63    result *= r;
64    result
65}