optima 0.0.4

An easy to set up and easy optimization and planning toolbox, particularly for robotics.
Documentation
use rand::Rng;
use rand_distr::{Normal, Distribution};

pub struct SimpleSamplers;
impl SimpleSamplers {
    pub fn uniform_samples(bounds: &Vec<(f64, f64)>) -> Vec<f64> {
        let mut out_vec = vec![];
        let mut rng = rand::thread_rng();
        for b in bounds {
            if b.0 == b.1 {
                out_vec.push(b.0);
            } else {
                out_vec.push(rng.gen_range(b.0..b.1));
            }
        }
        out_vec
    }
    pub fn uniform_sample(bounds: (f64, f64)) -> f64 {
        let mut rng = rand::thread_rng();
        return rng.gen_range(bounds.0..bounds.1)
    }
    pub fn normal_samples(means_and_standard_deviations: &Vec<(f64, f64)>) -> Vec<f64> {
        let mut out_vec = vec![];
        let mut rng = rand::thread_rng();
        for (mean, standard_deviation) in means_and_standard_deviations {
            let distribution = Normal::new(*mean, *standard_deviation).expect("error");
            out_vec.push(distribution.sample(&mut rng));
        }
        out_vec
    }
    pub fn uniform_samples_i32(bounds: &Vec<(i32, i32)>) -> Vec<i32> {
        let bounds: Vec<(f64, f64)> = bounds.iter().map(|x| (x.0 as f64, x.1 as f64) ).collect();
        let float_samples = Self::uniform_samples(&bounds);
        return float_samples.iter().map(|x| x.round() as i32).collect();
    }
}