11//! Interpolation strategies.
2- use ndarray:: azip;
3- use ndarray:: prelude:: * ;
42use noisy_float:: types:: N64 ;
53use num_traits:: { Float , FromPrimitive , NumOps , ToPrimitive } ;
64
@@ -45,14 +43,7 @@ pub trait Interpolate<T> {
4543 /// **Panics** if `None` is provided for the lower value when it's needed
4644 /// or if `None` is provided for the higher value when it's needed.
4745 #[ 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 ;
5647}
5748
5849/// Select the higher value.
@@ -75,12 +66,7 @@ impl<T> Interpolate<T> for Higher {
7566 fn needs_higher ( _q : N64 , _len : usize ) -> bool {
7667 true
7768 }
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 {
8470 higher. unwrap ( )
8571 }
8672}
@@ -92,12 +78,7 @@ impl<T> Interpolate<T> for Lower {
9278 fn needs_higher ( _q : N64 , _len : usize ) -> bool {
9379 false
9480 }
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 {
10182 lower. unwrap ( )
10283 }
10384}
@@ -109,12 +90,7 @@ impl<T> Interpolate<T> for Nearest {
10990 fn needs_higher ( q : N64 , len : usize ) -> bool {
11091 !<Self as Interpolate < T > >:: needs_lower ( q, len)
11192 }
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 {
11894 if <Self as Interpolate < T > >:: needs_lower ( q, len) {
11995 lower. unwrap ( )
12096 } else {
@@ -133,24 +109,11 @@ where
133109 fn needs_higher ( _q : N64 , _len : usize ) -> bool {
134110 true
135111 }
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 {
145113 let denom = T :: from_u8 ( 2 ) . unwrap ( ) ;
146- let mut lower = lower. unwrap ( ) ;
114+ let lower = lower. unwrap ( ) ;
147115 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 ( )
154117 }
155118}
156119
@@ -164,23 +127,12 @@ where
164127 fn needs_higher ( _q : N64 , _len : usize ) -> bool {
165128 true
166129 }
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 {
176131 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 ( )
185137 }
186138}
0 commit comments