use ndarray::{array, Array, Array2, Dimension, Array1}; use csaps::{Real, CubicSmoothingSpline}; fn test_driver_make_nd_npt(x: Array1, y: Array, order: usize, pieces: usize, coeffs: Array2) where T: Real, D: Dimension { let s = CubicSmoothingSpline::new(&x, &y) .make() .unwrap(); let spline = s.spline().unwrap(); assert_eq!(spline.order(), order); assert_eq!(spline.pieces(), pieces); assert_eq!(spline.breaks(), x); assert_eq!(spline.coeffs(), coeffs); } fn test_driver_make_nd_2pt(x: Array1, y: Array, coeffs: Array2) where T: Real, D: Dimension { test_driver_make_nd_npt(x, y, 2, 1, coeffs); } fn test_driver_make_nd_4pt(x: Array1, y: Array, coeffs: Array2) where T: Real, D: Dimension { test_driver_make_nd_npt(x, y, 4, 3, coeffs); } #[test] fn test_make_1d_2pt() { test_driver_make_nd_2pt( array![1., 2.], array![1., 2.], array![[1., 1.]] ); } #[test] fn test_make_2d_2pt() { test_driver_make_nd_2pt( array![1., 2.], array![[1., 2.], [3., 5.]], array![[1., 1.], [2., 3.]] ); } #[test] fn test_make_3d_2pt() { test_driver_make_nd_2pt( array![1., 2.], array![[[1., 2.], [3., 5.]], [[2., 4.], [4., 7.]]], array![[1., 1.], [2., 3.], [2., 2.], [3., 4.]] ); } #[test] fn test_make_1d_4pt() { test_driver_make_nd_4pt( array![1., 2., 3., 4.], array![1., 2., 3., 4.], array![[0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 2., 3.]] ); } #[test] fn test_make_2d_4pt() { test_driver_make_nd_4pt( array![1., 2., 3., 4.], array![[1., 2., 3., 4.], [1., 3., 5., 7.]], array![ [0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 2., 3.], [0., 0., 0., 0., 0., 0., 2., 2., 2., 1., 3., 5.]] ); } #[test] fn test_make_3d_4pt() { test_driver_make_nd_4pt( array![1., 2., 3., 4.], array![[[1., 2., 3., 4.], [1., 3., 5., 7.]], [[2., 4., 6., 8.], [3., 4., 5., 6.]]], array![ [0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 2., 3.], [0., 0., 0., 0., 0., 0., 2., 2., 2., 1., 3., 5.], [0., 0., 0., 0., 0., 0., 2., 2., 2., 2., 4., 6.], [0., 0., 0., 0., 0., 0., 1., 1., 1., 3., 4., 5.]] ); } #[test] fn test_make_2d_12x3_from_coeffs() { let x = array![1., 2., 3.]; let y = array![ [0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 5., 9.], [2., 6., 10.], [3., 7., 11.], ]; let spline = CubicSmoothingSpline::new(&x, &y) .make().unwrap(); let coeffs_expected = array![ [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 4., 4., 1., 5.], [0., 0., 0., 0., 4., 4., 2., 6.], [0., 0., 0., 0., 4., 4., 3., 7.], ]; assert_eq!(spline.spline().unwrap().coeffs(), coeffs_expected) }