use std::rc::Rc;
use crate::simulation::parameter::*;
#[inline]
pub fn random_uniform_parameter(min: f64, max: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_uniform(min, max))
})
}
#[inline]
pub fn random_int_uniform_parameter(min: isize, max: isize) -> impl Parameter<Item = isize> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_int_uniform(min, max))
})
}
#[inline]
pub fn random_triangular_parameter(min: f64, median: f64, max: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_triangular(min, median, max))
})
}
#[inline]
pub fn random_normal_parameter(mu: f64, nu: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_normal(mu, nu))
})
}
#[inline]
pub fn random_log_normal_parameter(mu: f64, nu: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_log_normal(mu, nu))
})
}
#[inline]
pub fn random_exponential_parameter(mu: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_exponential(mu))
})
}
#[inline]
pub fn random_erlang_parameter(scale: f64, shape: isize) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_erlang(scale, shape))
})
}
#[inline]
pub fn random_poisson_parameter(mu: f64) -> impl Parameter<Item = isize> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_poisson(mu))
})
}
#[inline]
pub fn random_binomial_parameter(prob: f64, trials: isize) -> impl Parameter<Item = isize> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_binomial(prob, trials))
})
}
#[inline]
pub fn random_true_parameter(prob: f64) -> impl Parameter<Item = bool> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
let x = gen.random_uniform(0.0, 1.0);
Result::Ok(x <= prob)
})
}
#[inline]
pub fn random_false_parameter(prob: f64) -> impl Parameter<Item = bool> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
let x = gen.random_uniform(0.0, 1.0);
Result::Ok(x > prob)
})
}
#[inline]
pub fn random_gamma_parameter(kappa: f64, theta: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_gamma(kappa, theta))
})
}
#[inline]
pub fn random_beta_parameter(alpha: f64, beta: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_beta(alpha, beta))
})
}
#[inline]
pub fn random_weibull_parameter(alpha: f64, beta: f64) -> impl Parameter<Item = f64> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_weibull(alpha, beta))
})
}
#[inline]
pub fn random_discrete_parameter<T: Clone>(dpdf: Rc<Vec<(T, f64)>>) -> impl Parameter<Item = T> + Clone {
cons_parameter(move |r| {
let gen = &r.generator;
Result::Ok(gen.random_discrete(&dpdf).clone())
})
}