Skip to content

Commit 32daf45

Browse files
committed
Lagrange-interpolator: Add unit tests
1 parent 2cbe56d commit 32daf45

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

crates/RustQuant_math/src/interpolation/lagrange_interpolator.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,64 @@ where
127127
Ok(self.lagrange_polynomial(point))
128128
}
129129
}
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

Comments
 (0)