use num_traits::Float;
use rand::SeedableRng;
use rand::prelude::SliceRandom;
use rand::rngs::StdRng;
use rustc_hash::FxHashSet;
use std::fmt::Debug;
use std::hash::Hash;
use std::ops::AddAssign;
pub fn flatten_vector<I, T>(vec: I) -> Vec<T>
where
I: IntoIterator,
I::Item: IntoIterator<Item = T>,
{
vec.into_iter().flatten().collect()
}
pub fn array_max<T>(arr: &[T]) -> T
where
T: PartialOrd + Copy,
{
let mut max_val = arr[0];
for number in arr {
if *number > max_val {
max_val = *number
}
}
max_val
}
pub fn array_min<T>(arr: &[T]) -> T
where
T: PartialOrd + Copy,
{
let mut min_val = arr[0];
for number in arr {
if *number < min_val {
min_val = *number
}
}
min_val
}
pub fn array_max_min<T>(arr: &[T]) -> (T, T)
where
T: PartialOrd + Copy,
{
let mut min_val = arr[0];
let mut max_val = arr[0];
for number in arr {
if *number < min_val {
min_val = *number
}
if *number > max_val {
max_val = *number
}
}
(max_val, min_val)
}
pub fn unique<T>(vec: &[T]) -> Vec<T>
where
T: Copy + Eq + Hash + Debug,
{
let mut set = FxHashSet::default();
vec.iter()
.filter(|&&item| set.insert(item))
.cloned()
.collect()
}
pub fn cumsum<T>(x: &[T]) -> Vec<T>
where
T: Float + AddAssign<T>,
{
let mut sum = T::zero();
x.iter()
.map(|&val| {
sum += val;
sum
})
.collect()
}
pub fn split_vector_randomly<T>(vec: &[T], x: usize, seed: u64) -> (Vec<T>, Vec<T>)
where
T: Clone,
{
let mut rng = StdRng::seed_from_u64(seed);
let mut shuffled = vec.to_vec();
shuffled.shuffle(&mut rng);
let (first_set, second_set) = shuffled.split_at(x);
(first_set.to_vec(), second_set.to_vec())
}