light_curve_common/
linspace.rs

1use conv::prelude::*;
2use num_traits::float::Float;
3
4/// Creates uniform distributed vales
5///
6/// # Examples
7///
8/// ```
9/// use light_curve_common::linspace;
10///
11/// let a = linspace(0.0, 1.0, 3);
12///
13/// assert_eq!(0.0, a[0]);
14/// assert_eq!(0.5, a[1]);
15/// assert_eq!(1.0, a[2]);
16/// ```
17pub fn linspace<T>(start: T, end: T, size: usize) -> Vec<T>
18where
19    T: Float + ValueFrom<usize>,
20{
21    let intervals: T = (size - 1).value_as::<T>().unwrap();
22    let step = (end - start) / intervals;
23    (0..size)
24        .map(|i| start + step * i.value_as::<T>().unwrap())
25        .collect()
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    use crate::all_close;
33
34    #[test]
35    fn linspace_two_points() {
36        let actual = [0_f32, 1_f32];
37        let desired = linspace(0_f32, 1_f32, 2);
38        all_close(&actual[..], &desired[..], 1e-6);
39    }
40
41    #[test]
42    fn linspace_three_points() {
43        let actual = [-1_f64, 0_f64, 1_f64];
44        let desired = linspace(-1_f64, 1_f64, 3);
45        all_close(&actual[..], &desired[..], 1e-12);
46    }
47
48    #[test]
49    fn linspace_many_points() {
50        let actual: Vec<_> = (0_u8..101).map(f32::from).collect();
51        let desired = linspace(0_f32, 100_f32, 101);
52        all_close(&actual[..], &desired[..], 1e-6);
53    }
54}