use super::*;
use crate::math::tensor::{AsMutTensor, Tensor};
pub struct UniformMsb {
pub n: usize,
}
macro_rules! implement_uniform_some_msb {
($T:ty) => {
impl RandomGenerable<UniformMsb> for $T {
fn sample(UniformMsb { n }: UniformMsb) -> Self {
random_uniform::<$T>() << (<$T as Numeric>::BITS - n)
}
}
};
}
implement_uniform_some_msb!(u8);
implement_uniform_some_msb!(u16);
implement_uniform_some_msb!(u32);
implement_uniform_some_msb!(u64);
implement_uniform_some_msb!(u128);
pub fn random_uniform_n_msb<T: RandomGenerable<UniformMsb>>(n: usize) -> T {
T::sample(UniformMsb { n })
}
pub fn fill_with_random_uniform_n_msb<Scalar, Tensorable>(output: &mut Tensorable, n: usize)
where
Scalar: RandomGenerable<UniformMsb>,
Tensorable: AsMutTensor<Element = Scalar>,
{
output.as_mut_tensor().iter_mut().for_each(|s| {
*s = random_uniform_n_msb::<Scalar>(n);
});
}
pub fn random_uniform_n_msb_tensor<T: RandomGenerable<UniformMsb>>(
size: usize,
n: usize,
) -> Tensor<Vec<T>> {
(0..size).map(|_| random_uniform_n_msb::<T>(n)).collect()
}