extern crate rand;
extern crate ndarray;
use std::iter::FromIterator;
use rand::Rng;
use rand::distributions::Sample;
use rand::distributions::IndependentSample;
use ndarray::{
ArrayBase,
Dimension,
DataOwned,
};
use ndarray::ShapeBuilder;
pub trait RandomExt<S, D>
where S: DataOwned,
D: Dimension,
{
fn random<Sh, IdS>(shape: Sh, distribution: IdS) -> ArrayBase<S, D>
where IdS: IndependentSample<S::Elem>,
Sh: ShapeBuilder<Dim=D>;
fn random_using<Sh, IdS, R>(shape: Sh, distribution: IdS, rng: &mut R) -> ArrayBase<S, D>
where IdS: IndependentSample<S::Elem>,
R: Rng,
Sh: ShapeBuilder<Dim=D>;
}
impl<S, D> RandomExt<S, D> for ArrayBase<S, D>
where S: DataOwned,
D: Dimension,
{
fn random<Sh, IdS>(shape: Sh, dist: IdS) -> ArrayBase<S, D>
where IdS: IndependentSample<S::Elem>,
Sh: ShapeBuilder<Dim=D>,
{
Self::random_using(shape, dist, &mut rand::weak_rng())
}
fn random_using<Sh, IdS, R>(shape: Sh, dist: IdS, rng: &mut R) -> ArrayBase<S, D>
where IdS: IndependentSample<S::Elem>,
R: Rng,
Sh: ShapeBuilder<Dim=D>,
{
Self::from_shape_fn(shape, |_| dist.ind_sample(rng))
}
}
#[derive(Copy, Clone, Debug)]
pub struct F32<S>(pub S);
impl<S> Sample<f32> for F32<S>
where S: Sample<f64>
{
fn sample<R>(&mut self, rng: &mut R) -> f32 where R: Rng {
self.0.sample(rng) as f32
}
}
impl<S> IndependentSample<f32> for F32<S>
where S: IndependentSample<f64>
{
fn ind_sample<R>(&self, rng: &mut R) -> f32 where R: Rng {
self.0.ind_sample(rng) as f32
}
}