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
30pub 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
47pub fn gen_inverse_gamma_random(rng : &mut ThreadRng, a : f32, b : f32) -> f32 {
49 generate_inverse_gamma_random(rng, a, b)
50}
51
52pub fn gen_nsphere_random(rng : &mut ThreadRng, dims : usize) -> Array1<f32> {
54 generate_nsphere_random(rng, dims)
55}
56
57pub 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}