@@ -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