()
| 88 | #[test] |
| 89 | #[ignore = "long-running hotspot; run explicitly with `cargo test -p openquant --test structural_breaks test_sadf_test -- --ignored`"] |
| 90 | fn test_sadf_test() { |
| 91 | let log_prices = log_prices(); |
| 92 | let lags_int = 5usize; |
| 93 | let lags_array = vec![1usize, 2, 5, 7]; |
| 94 | let min_length = 20usize; |
| 95 | |
| 96 | let sm_power = get_sadf(&log_prices, "sm_power", true, min_length, SadfLags::Fixed(lags_int)) |
| 97 | .expect("sm_power sadf"); |
| 98 | let linear = get_sadf(&log_prices, "linear", true, min_length, SadfLags::Fixed(lags_int)) |
| 99 | .expect("linear sadf"); |
| 100 | let linear_no_const = |
| 101 | get_sadf(&log_prices, "linear", false, min_length, SadfLags::Array(lags_array.clone())) |
| 102 | .expect("linear no const sadf"); |
| 103 | let quadratic = get_sadf(&log_prices, "quadratic", true, min_length, SadfLags::Fixed(lags_int)) |
| 104 | .expect("quadratic sadf"); |
| 105 | let sm_poly_1 = get_sadf(&log_prices, "sm_poly_1", true, min_length, SadfLags::Fixed(lags_int)) |
| 106 | .expect("sm_poly_1 sadf"); |
| 107 | let sm_poly_2 = get_sadf(&log_prices, "sm_poly_2", true, min_length, SadfLags::Fixed(lags_int)) |
| 108 | .expect("sm_poly_2 sadf"); |
| 109 | let sm_exp = get_sadf(&log_prices, "sm_exp", true, min_length, SadfLags::Fixed(lags_int)) |
| 110 | .expect("sm_exp sadf"); |
| 111 | |
| 112 | let expected_len = log_prices.len() - min_length - lags_int - 1; |
| 113 | assert_eq!(expected_len, sm_power.len()); |
| 114 | assert_eq!(expected_len, linear.len()); |
| 115 | assert_eq!(expected_len, quadratic.len()); |
| 116 | assert_eq!(expected_len, sm_poly_1.len()); |
| 117 | assert_eq!(expected_len, sm_poly_2.len()); |
| 118 | assert_eq!(expected_len, sm_exp.len()); |
| 119 | |
| 120 | assert!((mean(&sm_power) - 17.814).abs() < 0.001); |
| 121 | assert!((sm_power[29] + 4.281).abs() < 0.001); |
| 122 | assert!((mean(&linear) + 0.669).abs() < 0.001); |
| 123 | assert!((linear[29] + 0.717).abs() < 0.001); |
| 124 | assert!((mean(&linear_no_const) - 1.899).abs() < 0.001); |
| 125 | assert!((linear_no_const[29] - 1.252).abs() < 0.001); |
| 126 | assert!((mean(&quadratic) + 0.651).abs() < 0.001); |
| 127 | assert!((quadratic[29] + 1.065).abs() < 0.001); |
| 128 | assert!((mean(&sm_poly_1) - 21.02).abs() < 0.001); |
| 129 | assert!((sm_poly_1[29] - 0.8268).abs() < 0.001); |
| 130 | assert!((mean(&sm_poly_2) - 21.01).abs() < 0.001); |
| 131 | assert!((sm_poly_2[29] - 0.822).abs() < 0.001); |
| 132 | assert!((mean(&sm_exp) - 17.632).abs() < 0.001); |
| 133 | assert!((sm_exp[29] + 5.821).abs() < 0.001); |
| 134 | |
| 135 | let ones = vec![1.0; log_prices.len()]; |
| 136 | let trivial = |
| 137 | get_sadf(&ones, "sm_power", true, min_length, SadfLags::Fixed(lags_int)).expect("ones"); |
| 138 | assert!(trivial.iter().all(|v| v.is_infinite() && v.is_sign_negative())); |
| 139 | |
| 140 | let invalid = |
| 141 | get_sadf(&log_prices, "rubbish_string", true, min_length, SadfLags::Fixed(lags_int)); |
| 142 | assert!(matches!(invalid, Err(StructuralBreakError::InvalidModel(_)))); |
| 143 | |
| 144 | let singular_matrix = vec![vec![1.0, 0.0, 0.0], vec![-1.0, 3.0, 3.0], vec![1.0, 2.0, 2.0]]; |
| 145 | let (b_mean, b_var) = _get_betas(&singular_matrix, &singular_matrix).expect("betas"); |
| 146 | assert!(b_mean.iter().all(|v| v.is_nan())); |
| 147 | assert!(b_var.iter().all(|row| row.iter().all(|v| v.is_nan()))); |
nothing calls this directly
no test coverage detected