light_curve_common/
linspace.rs1use conv::prelude::*;
2use num_traits::float::Float;
3
4pub 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}