1
1
//! Interpolation strategies.
2
- use ndarray:: azip;
3
- use ndarray:: prelude:: * ;
4
2
use noisy_float:: types:: N64 ;
5
3
use num_traits:: { Float , FromPrimitive , NumOps , ToPrimitive } ;
6
4
@@ -45,14 +43,7 @@ pub trait Interpolate<T> {
45
43
/// **Panics** if `None` is provided for the lower value when it's needed
46
44
/// or if `None` is provided for the higher value when it's needed.
47
45
#[ doc( hidden) ]
48
- fn interpolate < D > (
49
- lower : Option < Array < T , D > > ,
50
- higher : Option < Array < T , D > > ,
51
- q : N64 ,
52
- len : usize ,
53
- ) -> Array < T , D >
54
- where
55
- D : Dimension ;
46
+ fn interpolate ( lower : Option < T > , higher : Option < T > , q : N64 , len : usize ) -> T ;
56
47
}
57
48
58
49
/// Select the higher value.
@@ -75,12 +66,7 @@ impl<T> Interpolate<T> for Higher {
75
66
fn needs_higher ( _q : N64 , _len : usize ) -> bool {
76
67
true
77
68
}
78
- fn interpolate < D > (
79
- _lower : Option < Array < T , D > > ,
80
- higher : Option < Array < T , D > > ,
81
- _q : N64 ,
82
- _len : usize ,
83
- ) -> Array < T , D > {
69
+ fn interpolate ( _lower : Option < T > , higher : Option < T > , _q : N64 , _len : usize ) -> T {
84
70
higher. unwrap ( )
85
71
}
86
72
}
@@ -92,12 +78,7 @@ impl<T> Interpolate<T> for Lower {
92
78
fn needs_higher ( _q : N64 , _len : usize ) -> bool {
93
79
false
94
80
}
95
- fn interpolate < D > (
96
- lower : Option < Array < T , D > > ,
97
- _higher : Option < Array < T , D > > ,
98
- _q : N64 ,
99
- _len : usize ,
100
- ) -> Array < T , D > {
81
+ fn interpolate ( lower : Option < T > , _higher : Option < T > , _q : N64 , _len : usize ) -> T {
101
82
lower. unwrap ( )
102
83
}
103
84
}
@@ -109,12 +90,7 @@ impl<T> Interpolate<T> for Nearest {
109
90
fn needs_higher ( q : N64 , len : usize ) -> bool {
110
91
!<Self as Interpolate < T > >:: needs_lower ( q, len)
111
92
}
112
- fn interpolate < D > (
113
- lower : Option < Array < T , D > > ,
114
- higher : Option < Array < T , D > > ,
115
- q : N64 ,
116
- len : usize ,
117
- ) -> Array < T , D > {
93
+ fn interpolate ( lower : Option < T > , higher : Option < T > , q : N64 , len : usize ) -> T {
118
94
if <Self as Interpolate < T > >:: needs_lower ( q, len) {
119
95
lower. unwrap ( )
120
96
} else {
@@ -133,24 +109,11 @@ where
133
109
fn needs_higher ( _q : N64 , _len : usize ) -> bool {
134
110
true
135
111
}
136
- fn interpolate < D > (
137
- lower : Option < Array < T , D > > ,
138
- higher : Option < Array < T , D > > ,
139
- _q : N64 ,
140
- _len : usize ,
141
- ) -> Array < T , D >
142
- where
143
- D : Dimension ,
144
- {
112
+ fn interpolate ( lower : Option < T > , higher : Option < T > , _q : N64 , _len : usize ) -> T {
145
113
let denom = T :: from_u8 ( 2 ) . unwrap ( ) ;
146
- let mut lower = lower. unwrap ( ) ;
114
+ let lower = lower. unwrap ( ) ;
147
115
let higher = higher. unwrap ( ) ;
148
- azip ! (
149
- mut lower, ref higher in {
150
- * lower = lower. clone( ) + ( higher. clone( ) - lower. clone( ) ) / denom. clone( )
151
- }
152
- ) ;
153
- lower
116
+ lower. clone ( ) + ( higher. clone ( ) - lower. clone ( ) ) / denom. clone ( )
154
117
}
155
118
}
156
119
@@ -164,23 +127,12 @@ where
164
127
fn needs_higher ( _q : N64 , _len : usize ) -> bool {
165
128
true
166
129
}
167
- fn interpolate < D > (
168
- lower : Option < Array < T , D > > ,
169
- higher : Option < Array < T , D > > ,
170
- q : N64 ,
171
- len : usize ,
172
- ) -> Array < T , D >
173
- where
174
- D : Dimension ,
175
- {
130
+ fn interpolate ( lower : Option < T > , higher : Option < T > , q : N64 , len : usize ) -> T {
176
131
let fraction = float_quantile_index_fraction ( q, len) . to_f64 ( ) . unwrap ( ) ;
177
- let mut a = lower. unwrap ( ) ;
178
- let b = higher. unwrap ( ) ;
179
- azip ! ( mut a, ref b in {
180
- let a_f64 = a. to_f64( ) . unwrap( ) ;
181
- let b_f64 = b. to_f64( ) . unwrap( ) ;
182
- * a = a. clone( ) + T :: from_f64( fraction * ( b_f64 - a_f64) ) . unwrap( ) ;
183
- } ) ;
184
- a
132
+ let lower = lower. unwrap ( ) ;
133
+ let higher = higher. unwrap ( ) ;
134
+ let lower_f64 = lower. to_f64 ( ) . unwrap ( ) ;
135
+ let higher_f64 = higher. to_f64 ( ) . unwrap ( ) ;
136
+ lower. clone ( ) + T :: from_f64 ( fraction * ( higher_f64 - lower_f64) ) . unwrap ( )
185
137
}
186
138
}
0 commit comments