Skip to content

Commit f4aa5b6

Browse files
committed
test cleanup
1 parent 265271e commit f4aa5b6

File tree

9 files changed

+183
-143
lines changed

9 files changed

+183
-143
lines changed

src/interpolator/data.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,13 @@ impl<D, const N: usize> InterpData<D, N>
6363
where
6464
Dim<[Ix; N]>: Dimension,
6565
D: Data + RawDataClone + Clone,
66-
D::Elem: PartialOrd + Debug,
66+
D::Elem: PartialEq + Debug,
6767
{
6868
/// Validate interpolator data.
69-
pub fn validate(&self) -> Result<(), ValidateError> {
69+
pub fn validate(&self) -> Result<(), ValidateError>
70+
where
71+
D::Elem: PartialOrd,
72+
{
7073
for i in 0..N {
7174
let i_grid_len = self.grid[i].len();
7275
// Check that each grid dimension has elements

src/interpolator/enums.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ use strategy::enums::*;
2020
/// use ninterp::prelude::*;
2121
///
2222
/// // 1-D linear
23-
/// let x = array![0., 1., 2., 3., 4.];
24-
/// let f_x = array![0.2, 0.4, 0.6, 0.8, 1.0];
2523
/// // type annotation for clarity
26-
/// let mut interp: InterpolatorEnumViewed<&f64> = InterpolatorEnum::new_1d(
27-
/// x.view(),
28-
/// f_x.view(),
24+
/// let mut interp: InterpolatorEnumOwned<_> = InterpolatorEnum::new_1d(
25+
/// // x
26+
/// array![0., 1., 2., 3., 4.],
27+
/// // f(x)
28+
/// array![0.2, 0.4, 0.6, 0.8, 1.0],
2929
/// strategy::Linear, // strategy mod is exposed via `use ndarray::prelude::*;`
3030
/// Extrapolate::Error,
3131
/// )
@@ -35,17 +35,22 @@ use strategy::enums::*;
3535
/// assert_eq!(interp.interpolate(&[4.00]).unwrap(), 1.0);
3636
///
3737
/// // 2-D nearest
38-
/// let x = array![0.05, 0.10, 0.15];
39-
/// let y = array![0.10, 0.20, 0.30];
40-
/// let f_xy = array![[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]];
4138
/// interp = InterpolatorEnum::new_2d(
42-
/// x.view(),
43-
/// y.view(),
44-
/// f_xy.view(),
39+
/// // x
40+
/// array![0.05, 0.10, 0.15],
41+
/// // y
42+
/// array![0.10, 0.20, 0.30],
43+
/// // f(x, y)
44+
/// array![[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]],
4545
/// strategy::Nearest,
4646
/// Extrapolate::Error,
4747
/// )
4848
/// .unwrap();
49+
/// let f_xy = match &interp {
50+
/// InterpolatorEnum::Interp2D(interp) => &interp.data.values,
51+
/// _ => unreachable!(),
52+
/// };
53+
///
4954
/// assert_eq!(interp.interpolate(&[0.08, 0.21]).unwrap(), f_xy[[1, 1]]);
5055
/// assert_eq!(interp.interpolate(&[0.11, 0.26]).unwrap(), f_xy[[1, 2]]);
5156
/// assert_eq!(interp.interpolate(&[0.13, 0.12]).unwrap(), f_xy[[2, 0]]);

src/interpolator/n/mod.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,29 +52,26 @@ where
5252
impl<D> InterpDataND<D>
5353
where
5454
D: Data + RawDataClone + Clone,
55-
D::Elem: PartialOrd + Debug,
55+
D::Elem: PartialEq + Debug,
5656
{
57-
/// Get data dimensionality.
58-
pub fn ndim(&self) -> usize {
59-
if self.values.len() == 1 {
60-
0
61-
} else {
62-
self.values.ndim()
63-
}
64-
}
65-
6657
/// Construct and validate a new [`InterpDataND`].
6758
pub fn new(
6859
grid: Vec<ArrayBase<D, Ix1>>,
6960
values: ArrayBase<D, IxDyn>,
70-
) -> Result<Self, ValidateError> {
61+
) -> Result<Self, ValidateError>
62+
where
63+
D::Elem: PartialOrd,
64+
{
7165
let data = Self { grid, values };
7266
data.validate()?;
7367
Ok(data)
7468
}
7569

7670
/// Validate interpolator data.
77-
pub fn validate(&self) -> Result<(), ValidateError> {
71+
pub fn validate(&self) -> Result<(), ValidateError>
72+
where
73+
D::Elem: PartialOrd,
74+
{
7875
let n = self.ndim();
7976
if (self.grid.len() != n) && !(n == 0 && self.grid.iter().all(|g| g.is_empty())) {
8077
// Only possible for `InterpDataND`
@@ -102,6 +99,15 @@ where
10299
}
103100
Ok(())
104101
}
102+
103+
/// Get data dimensionality.
104+
pub fn ndim(&self) -> usize {
105+
if self.values.len() == 1 {
106+
0
107+
} else {
108+
self.values.ndim()
109+
}
110+
}
105111
}
106112

107113
/// N-D interpolator

src/interpolator/n/strategies.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ where
3030
// Point can share up to N values of a grid point, which reduces the problem dimensionality
3131
// i.e. the point shares one of three values of a 3-D grid point, then the interpolation becomes 2-D at that slice
3232
// or if the point shares two of three values of a 3-D grid point, then the interpolation becomes 1-D
33+
// TODO: avoid this clone
3334
let mut point = point.to_vec();
35+
// TODO: avoid this clone
3436
let mut grid = data.grid.clone();
3537
let mut values_view = data.values.view();
3638
for dim in (0..n).rev() {
@@ -129,7 +131,9 @@ where
129131
// Point can share up to N values of a grid point, which reduces the problem dimensionality
130132
// i.e. the point shares one of three values of a 3-D grid point, then the interpolation becomes 2-D at that slice
131133
// or if the point shares two of three values of a 3-D grid point, then the interpolation becomes 1-D
134+
// TODO: avoid this clone
132135
let mut point = point.to_vec();
136+
// TODO: avoid this clone
133137
let mut grid = data.grid.clone();
134138
let mut values_view = data.values.view();
135139
for dim in (0..n).rev() {

src/interpolator/n/tests.rs

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,32 @@ use super::*;
22

33
#[test]
44
fn test_linear() {
5-
let x = array![0.05, 0.10, 0.15];
6-
let y = array![0.10, 0.20, 0.30];
7-
let z = array![0.20, 0.40, 0.60];
8-
let grid = vec![x.view(), y.view(), z.view()];
9-
let values = array![
10-
[[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]],
11-
[[9., 10., 11.], [12., 13., 14.], [15., 16., 17.]],
12-
[[18., 19., 20.], [21., 22., 23.], [24., 25., 26.]],
13-
]
14-
.into_dyn();
15-
let interp = InterpND::new(grid, values.view(), strategy::Linear, Extrapolate::Error).unwrap();
5+
let interp = InterpND::new(
6+
vec![
7+
array![0.05, 0.10, 0.15],
8+
array![0.10, 0.20, 0.30],
9+
array![0.20, 0.40, 0.60],
10+
],
11+
array![
12+
[[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]],
13+
[[9., 10., 11.], [12., 13., 14.], [15., 16., 17.]],
14+
[[18., 19., 20.], [21., 22., 23.], [24., 25., 26.]],
15+
]
16+
.into_dyn(),
17+
strategy::Linear,
18+
Extrapolate::Error,
19+
)
20+
.unwrap();
1621
// Check that interpolating at grid points just retrieves the value
22+
let x = &interp.data.grid[0];
23+
let y = &interp.data.grid[1];
24+
let z = &interp.data.grid[2];
1725
for i in 0..x.len() {
1826
for j in 0..y.len() {
1927
for k in 0..z.len() {
2028
assert_eq!(
21-
&interp.interpolate(&[x[i], y[j], z[k]]).unwrap(),
22-
values.slice(s![i, j, k]).first().unwrap()
29+
interp.interpolate(&[x[i], y[j], z[k]]).unwrap(),
30+
interp.data.values[[i, j, k]]
2331
);
2432
}
2533
}
@@ -206,19 +214,23 @@ fn test_linear_extrapolate_3d() {
206214

207215
#[test]
208216
fn test_nearest() {
209-
let x = array![0., 1.];
210-
let y = array![0., 1.];
211-
let z = array![0., 1.];
212-
let grid = vec![x.view(), y.view(), z.view()];
213-
let values = array![[[0., 1.], [2., 3.]], [[4., 5.], [6., 7.]],].into_dyn();
214-
let interp = InterpND::new(grid, values.view(), strategy::Nearest, Extrapolate::Error).unwrap();
217+
let interp = InterpND::new(
218+
vec![array![0., 1.], array![0., 1.], array![0., 1.]],
219+
array![[[0., 1.], [2., 3.]], [[4., 5.], [6., 7.]],].into_dyn(),
220+
strategy::Nearest,
221+
Extrapolate::Error,
222+
)
223+
.unwrap();
215224
// Check that interpolating at grid points just retrieves the value
225+
let x = &interp.data.grid[0];
226+
let y = &interp.data.grid[1];
227+
let z = &interp.data.grid[2];
216228
for i in 0..x.len() {
217229
for j in 0..y.len() {
218230
for k in 0..z.len() {
219231
assert_eq!(
220-
&interp.interpolate(&[x[i], y[j], z[k]]).unwrap(),
221-
values.slice(s![i, j, k]).first().unwrap()
232+
interp.interpolate(&[x[i], y[j], z[k]]).unwrap(),
233+
interp.data.values[[i, j, k]]
222234
);
223235
}
224236
}
@@ -281,32 +293,28 @@ fn test_extrapolate_fill() {
281293

282294
#[test]
283295
fn test_extrapolate_clamp() {
284-
let x = array![0.1, 1.1];
285-
let y = array![0.2, 1.2];
286-
let z = array![0.3, 1.3];
287-
let values = array![[[0., 1.], [2., 3.]], [[4., 5.], [6., 7.]],].into_dyn();
288296
let interp = InterpND::new(
289-
vec![x.view(), y.view(), z.view()],
290-
values.view(),
297+
vec![array![0.1, 1.1], array![0.2, 1.2], array![0.3, 1.3]],
298+
array![[[0., 1.], [2., 3.]], [[4., 5.], [6., 7.]],].into_dyn(),
291299
strategy::Linear,
292300
Extrapolate::Clamp,
293301
)
294302
.unwrap();
295303
assert_eq!(
296304
interp.interpolate(&[-1., -1., -1.]).unwrap(),
297-
values[[0, 0, 0]]
305+
interp.data.values[[0, 0, 0]]
298306
);
299307
assert_eq!(
300308
interp.interpolate(&[-1., 2., -1.]).unwrap(),
301-
values[[0, 1, 0]]
309+
interp.data.values[[0, 1, 0]]
302310
);
303311
assert_eq!(
304312
interp.interpolate(&[2., -1., 2.]).unwrap(),
305-
values[[1, 0, 1]]
313+
interp.data.values[[1, 0, 1]]
306314
);
307315
assert_eq!(
308316
interp.interpolate(&[2., 2., 2.]).unwrap(),
309-
values[[1, 1, 1]]
317+
interp.data.values[[1, 1, 1]]
310318
);
311319
}
312320

src/interpolator/one/tests.rs

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,17 @@ fn test_invalid_args() {
1818

1919
#[test]
2020
fn test_linear() {
21-
let x = array![0., 1., 2., 3., 4.];
22-
let f_x = array![0.2, 0.4, 0.6, 0.8, 1.0];
23-
let interp = Interp1D::new(x.view(), f_x.view(), strategy::Linear, Extrapolate::Error).unwrap();
21+
let interp = Interp1D::new(
22+
array![0., 1., 2., 3., 4.],
23+
array![0.2, 0.4, 0.6, 0.8, 1.0],
24+
strategy::Linear,
25+
Extrapolate::Error,
26+
)
27+
.unwrap();
2428
// Check that interpolating at grid points just retrieves the value
29+
let x = &interp.data.grid[0];
2530
for (i, x_i) in x.iter().enumerate() {
26-
assert_eq!(interp.interpolate(&[*x_i]).unwrap(), f_x[i]);
31+
assert_eq!(interp.interpolate(&[*x_i]).unwrap(), interp.data.values[i]);
2732
}
2833
assert_eq!(interp.interpolate(&[3.00]).unwrap(), 0.8);
2934
assert_eq!(interp.interpolate(&[3.75]).unwrap(), 0.95);
@@ -32,16 +37,16 @@ fn test_linear() {
3237

3338
#[test]
3439
fn test_left_nearest() {
35-
let x = array![0., 1., 2., 3., 4.];
36-
let f_x = array![0.2, 0.4, 0.6, 0.8, 1.0];
3740
let interp = Interp1D::new(
38-
x.view(),
39-
f_x.view(),
41+
array![0., 1., 2., 3., 4.],
42+
array![0.2, 0.4, 0.6, 0.8, 1.0],
4043
strategy::LeftNearest,
4144
Extrapolate::Error,
4245
)
4346
.unwrap();
4447
// Check that interpolating at grid points just retrieves the value
48+
let x = &interp.data.grid[0];
49+
let f_x = &interp.data.values;
4550
for (i, x_i) in x.iter().enumerate() {
4651
assert_eq!(interp.interpolate(&[*x_i]).unwrap(), f_x[i]);
4752
}
@@ -52,16 +57,16 @@ fn test_left_nearest() {
5257

5358
#[test]
5459
fn test_right_nearest() {
55-
let x = array![0., 1., 2., 3., 4.];
56-
let f_x = array![0.2, 0.4, 0.6, 0.8, 1.0];
5760
let interp = Interp1D::new(
58-
x.view(),
59-
f_x.view(),
61+
array![0., 1., 2., 3., 4.],
62+
array![0.2, 0.4, 0.6, 0.8, 1.0],
6063
strategy::RightNearest,
6164
Extrapolate::Error,
6265
)
6366
.unwrap();
6467
// Check that interpolating at grid points just retrieves the value
68+
let x = &interp.data.grid[0];
69+
let f_x = &interp.data.values;
6570
for (i, x_i) in x.iter().enumerate() {
6671
assert_eq!(interp.interpolate(&[*x_i]).unwrap(), f_x[i]);
6772
}
@@ -72,11 +77,16 @@ fn test_right_nearest() {
7277

7378
#[test]
7479
fn test_nearest() {
75-
let x = array![0., 1., 2., 3., 4.];
76-
let f_x = array![0.2, 0.4, 0.6, 0.8, 1.0];
77-
let interp =
78-
Interp1D::new(x.view(), f_x.view(), strategy::Nearest, Extrapolate::Error).unwrap();
80+
let interp = Interp1D::new(
81+
array![0., 1., 2., 3., 4.],
82+
array![0.2, 0.4, 0.6, 0.8, 1.0],
83+
strategy::Nearest,
84+
Extrapolate::Error,
85+
)
86+
.unwrap();
7987
// Check that interpolating at grid points just retrieves the value
88+
let x = &interp.data.grid[0];
89+
let f_x = &interp.data.values;
8090
for (i, x_i) in x.iter().enumerate() {
8191
assert_eq!(interp.interpolate(&[*x_i]).unwrap(), f_x[i]);
8292
}

0 commit comments

Comments
 (0)