use crate::math::tensor::{AsMutTensor, Tensor};
use super::*;
pub struct Uniform;
macro_rules! implement_uniform {
($T:ty, $bytes:literal) => {
impl RandomGenerable<Uniform> for $T {
#[allow(unused)]
fn sample(distribution: Uniform) -> Self {
use concrete_csprng::RandomGenerator;
let mut gen = RandomGenerator::new(None, None);
let mut buf = [0; $bytes];
buf.iter_mut().for_each(|a| *a = gen.generate_next());
unsafe { *(buf.as_ptr() as *const $T) }
}
}
};
}
implement_uniform!(u8, 1);
implement_uniform!(u16, 2);
implement_uniform!(u32, 4);
implement_uniform!(u64, 8);
implement_uniform!(u128, 16);
implement_uniform!(i8, 1);
implement_uniform!(i16, 1);
implement_uniform!(i32, 1);
implement_uniform!(i64, 1);
implement_uniform!(i128, 1);
pub fn random_uniform<T: RandomGenerable<Uniform>>() -> T {
T::sample(Uniform)
}
pub fn fill_with_random_uniform<Scalar, Tensorable>(output: &mut Tensorable)
where
Scalar: RandomGenerable<Uniform>,
Tensorable: AsMutTensor<Element = Scalar>,
{
output.as_mut_tensor().iter_mut().for_each(|s| {
*s = random_uniform::<Scalar>();
});
}
pub fn random_uniform_tensor<T: RandomGenerable<Uniform>>(size: usize) -> Tensor<Vec<T>> {
(0..size).map(|_| random_uniform::<T>()).collect()
}