@@ -127,3 +127,64 @@ where
127
127
Ok ( self . lagrange_polynomial ( point) )
128
128
}
129
129
}
130
+
131
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132
+ // Unit tests
133
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
134
+
135
+ #[ cfg( test) ]
136
+ mod tests_lagrange_interpolation {
137
+ use super :: * ;
138
+ use RustQuant_utils :: { assert_approx_equal, RUSTQUANT_EPSILON } ;
139
+
140
+ #[ test]
141
+ fn test_lagrange_interpolation ( ) {
142
+ let xs: Vec < f64 > = vec ! [ 0. , 1. , 2. , 3. , 4. ] ;
143
+ let ys: Vec < f64 > = vec ! [ 1. , 2. , 4. , 8. , 16. ] ;
144
+
145
+ let mut interpolator = LagrangeInterpolator :: new ( xs, ys) . unwrap ( ) ;
146
+ let _ = interpolator. fit ( ) ;
147
+
148
+ assert_approx_equal ! (
149
+ 5.6484375 ,
150
+ interpolator. interpolate( 2.5 ) . unwrap( ) ,
151
+ RUSTQUANT_EPSILON
152
+ ) ;
153
+ }
154
+
155
+ #[ test]
156
+ fn test_lagrange_interpolation_dates ( ) {
157
+ let now: time:: OffsetDateTime = time:: OffsetDateTime :: now_utc ( ) ;
158
+
159
+ let xs: Vec < time:: OffsetDateTime > = vec ! [
160
+ now,
161
+ now + time:: Duration :: days( 1 ) ,
162
+ now + time:: Duration :: days( 2 ) ,
163
+ now + time:: Duration :: days( 3 ) ,
164
+ now + time:: Duration :: days( 4 ) ,
165
+ ] ;
166
+ let ys: Vec < f64 > = vec ! [ 1. , 2. , 4. , 8. , 16. ] ;
167
+
168
+ let mut interpolator: LagrangeInterpolator < time:: OffsetDateTime , f64 > = LagrangeInterpolator :: new ( xs. clone ( ) , ys) . unwrap ( ) ;
169
+ let _ = interpolator. fit ( ) ;
170
+
171
+ assert_approx_equal ! (
172
+ 5.6484375 ,
173
+ interpolator
174
+ . interpolate( xs[ 2 ] + time:: Duration :: hours( 12 ) )
175
+ . unwrap( ) ,
176
+ RUSTQUANT_EPSILON
177
+ ) ;
178
+ }
179
+
180
+ #[ test]
181
+ fn test_linear_interpolation_out_of_range ( ) {
182
+ let xs: Vec < f64 > = vec ! [ 1. , 2. , 3. , 4. , 5. ] ;
183
+ let ys: Vec < f64 > = vec ! [ 1. , 2. , 3. , 4. , 5. ] ;
184
+
185
+ let mut interpolator: LagrangeInterpolator < f64 , f64 > = LagrangeInterpolator :: new ( xs, ys) . unwrap ( ) ;
186
+ let _ = interpolator. fit ( ) ;
187
+
188
+ assert ! ( interpolator. interpolate( 6. ) . is_err( ) ) ;
189
+ }
190
+ }
0 commit comments