use crate::config::*;
use ndarray::{ArrayView1, IntoDimension};
use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
use rand_distr::StandardNormal;
use smallvec::Array;
pub fn max<T>(arr: ArrayView<Flt, T>) -> Flt
where
T: ndarray::Dimension,
{
arr.fold(
-Flt::INFINITY,
|acc, new| if *new > acc { *new } else { acc },
)
}
pub fn min<T>(arr: ArrayView<Flt, T>) -> Flt
where
T: ndarray::Dimension,
{
arr.fold(
Flt::INFINITY,
|acc, new| if *new < acc { *new } else { acc },
)
}
pub fn maxabs<T>(arr: ArrayView<Flt, T>) -> Flt
where
T: ndarray::Dimension,
{
arr.fold(0., |acc, new| if new.abs() > acc { new.abs() } else { acc })
}
pub fn randNormal<Sh, D>(shape: Sh) -> ndarray::Array<Flt,D>
where
Sh: ShapeBuilder<Dim=D>,
D: Dimension
{
let mut rng = SmallRng::from_entropy();
let shape = shape.f().into_shape_with_order();
ArrayBase::from_shape_simple_fn(shape, || rng.sample(StandardNormal))
}