use num_traits::Float;
#[cfg(feature = "std")]
pub fn linspace<T>(start: T, stop: T, num_points: usize) -> Vec<T>
where
T: Float,
{
if num_points < 2 {
return vec![start];
}
let step = (stop - start) / T::from(num_points - 1).unwrap();
(0..num_points)
.map(|i| start + T::from(i).unwrap() * step)
.collect()
}
#[cfg(feature = "std")]
pub fn logspace<T>(start: T, stop: T, num_points: usize) -> Vec<T>
where
T: Float,
{
if num_points < 2 {
return vec![start.exp()];
}
let log_start = start.ln();
let log_stop = stop.ln();
let step = (log_stop - log_start) / T::from(num_points - 1).unwrap();
(0..num_points)
.map(|i| (log_start + T::from(i).unwrap() * step).exp())
.collect()
}
pub fn map_linear<T>(val: T, range_in: (T, T), range_out: (T, T)) -> T
where
T: Float,
{
let portion = (val - range_in.0) / (range_in.1 - range_in.0);
portion * (range_out.1 - range_out.0) + range_out.0
}