Skip to content

Commit 2dfffb9

Browse files
committed
Cubic-Spline: Rewrite helper methods tests for Cholesky decomposition implementation
1 parent b1cef15 commit 2dfffb9

File tree

1 file changed

+33
-80
lines changed

1 file changed

+33
-80
lines changed

crates/RustQuant_math/src/interpolation/cubic_spline.rs

Lines changed: 33 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -393,107 +393,60 @@ mod tests_cubic_spline_helper_functions {
393393
use super::*;
394394

395395
#[test]
396-
fn test_compute_lower_tri_and_diagonal_matrices() {
396+
fn test_cholesky_decomposition() {
397397
let xs: Vec<f64> = vec![1., 2., 3., 4., 5.];
398398
let ys: Vec<f64> = vec![1., 2., 3., 4., 5.];
399399

400-
let time_steps: Vec<f64> = xs.windows(2)
400+
let mut interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
401+
interpolator.time_steps = interpolator.xs.windows(2)
401402
.map(|x| (x[1] - x[0]))
402403
.collect();
404+
let result: Vec<Vec<f64>> = interpolator.cholesky_decomposition();
405+
let expected: &[&[f64]] = &[
406+
&[2.0],
407+
&[0.5, 1.9364916731037085],
408+
&[0.5163977794943222, 1.9321835661585918],
409+
];
403410

404-
let interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
405-
let (lower_triangular, diagonal) = interpolator.compute_lower_tri_and_diagonal_matrices(&time_steps);
406-
407-
assert!(lower_triangular == vec![4.0, 3.75, 3.7333333333333334]);
408-
assert!(diagonal == vec![0.25, 0.26666666666666666]);
409-
}
410-
411-
#[test]
412-
fn test_invert_lower_tri_matrix() {
413-
let xs: Vec<f64> = vec![1., 2., 3., 4., 5.];
414-
let ys: Vec<f64> = vec![1., 2., 3., 4., 5.];
415-
416-
let interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
417-
let inv_lower_tri_matrix: Vec<Vec<f64>> = interpolator.invert_lower_tri_matrix(&[3.0, 2.0, 1.0]);
418-
419-
assert!(
420-
inv_lower_tri_matrix == vec![
421-
vec![1.0],
422-
vec![-3.0, 1.0],
423-
vec![6.0, -2.0, 1.0],
424-
vec![-6.0, 2.0, -1.0, 1.0]
425-
]
426-
)
427-
}
428-
429-
#[test]
430-
fn test_transpose() {
431-
let xs: Vec<f64> = vec![1., 2., 3., 4., 5.];
432-
let ys: Vec<f64> = vec![1., 2., 3., 4., 5.];
433-
434-
let interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
435-
let transposed_matrix = interpolator.transpose(vec![
436-
vec![1.0],
437-
vec![2.0, 3.0],
438-
vec![4.0, 5.0, 6.0],
439-
]);
440-
441-
assert!(
442-
transposed_matrix == vec![
443-
vec![1.0, 2.0, 4.0],
444-
vec![3.0, 5.0],
445-
vec![6.0],
446-
]
447-
);
411+
assert_eq!(result, expected);
448412
}
449413

450414
#[test]
451-
fn lower_tri_transpose_inv_times_diag_inv() {
415+
fn test_forward_substitution() {
452416
let xs: Vec<f64> = vec![1., 2., 3., 4., 5.];
453417
let ys: Vec<f64> = vec![1., 2., 3., 4., 5.];
454418

455419
let interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
456-
let lower_tri_inverse: Vec<Vec<f64>> = vec![vec![1.0], vec![2.0, 3.0], vec![4.0, 5.0, 6.0]];
457-
let diagonal: Vec<f64> = vec![1.0, 2.0, 3.0];
458-
459-
assert!(
460-
interpolator.lower_tri_transpose_inv_times_diag_inv(&lower_tri_inverse, &diagonal) == vec![
461-
vec![1.0, 2.0, 4.0],
462-
vec![0.5, 2.5],
463-
vec![0.3333333333333333]
464-
]
420+
let result: Vec<f64> = interpolator.forward_substitution(
421+
&[
422+
[2.0].to_vec(),
423+
[1.0, 2.0].to_vec(),
424+
[1.0, 2.0].to_vec(),
425+
],
426+
&[1.0, 1.0, 1.0]
465427
);
428+
let expected: &[f64] = &[0.5, 0.25, 0.375];
429+
430+
assert_eq!(result, expected);
466431
}
467432

468433
#[test]
469-
fn test_upper_tri_times_lower_tri() {
434+
fn test_backward_substitution() {
470435
let xs: Vec<f64> = vec![1., 2., 3., 4., 5.];
471436
let ys: Vec<f64> = vec![1., 2., 3., 4., 5.];
472437

473438
let interpolator: CubicSplineInterpolator<f64, f64> = CubicSplineInterpolator::new(xs, ys).unwrap();
474-
let upper_tri_matrix = vec![
475-
vec![1.0, 2.0, 3.0],
476-
vec![4.0, 5.0],
477-
vec![6.0],
478-
];
479-
let lower_tri_matrix_transpose = vec![
480-
vec![-1.0, -2.0, -3.0],
481-
vec![-4.0, -5.0],
482-
vec![-6.0],
483-
];
484-
485-
let product: Vec<Vec<f64>> = interpolator.upper_tri_times_lower_tri(
486-
&upper_tri_matrix,
487-
&lower_tri_matrix_transpose
488-
);
489-
490-
assert!(
491-
product == vec![
492-
[-14.0, -23.0, -18.0],
493-
[-23.0, -41.0, -30.0],
494-
[-18.0, -30.0, -36.0]
495-
]
439+
let result: Vec<f64> = interpolator.backward_substitution(
440+
&[
441+
[2.0].to_vec(),
442+
[1.0, 2.0].to_vec(),
443+
[1.0, 2.0].to_vec(),
444+
],
445+
&[1.0, 1.0, 1.0]
496446
);
447+
let expected: &[f64] = &[0.375, 0.25, 0.5];
448+
449+
assert_eq!(result, expected);
497450
}
498451

499452
#[test]
@@ -513,6 +466,6 @@ mod tests_cubic_spline_helper_functions {
513466
156.85714285714286
514467
);
515468

516-
assert!(spline_result == 36.64909523809524);
469+
assert_eq!(spline_result, 36.64909523809524);
517470
}
518471
}

0 commit comments

Comments
 (0)