@@ -1858,6 +1858,12 @@ def test_fiaparch(setup):
18581858 fiaparch .compute_variance (
18591859 parameters , setup .resids , setup .sigma2 , backcast , var_bounds
18601860 )
1861+ # Call again to exercise the sigma_delta buffer reuse path
1862+ sigma2_second = np .zeros_like (setup .sigma2 )
1863+ fiaparch .compute_variance (
1864+ parameters , setup .resids , sigma2_second , backcast , var_bounds
1865+ )
1866+ assert_allclose (setup .sigma2 , sigma2_second )
18611867
18621868 cond_var_direct = np .zeros_like (setup .sigma2 )
18631869 sigma_delta_direct = np .zeros_like (setup .sigma2 )
@@ -1967,6 +1973,13 @@ def test_fiaparch_updater_matches_recursion(setup, o, delta):
19671973
19681974 assert_allclose (sigma2_updater , sigma2 )
19691975
1976+ # Second initialize_update to exercise the buffer-already-allocated branch
1977+ updater .initialize_update (parameters , backcast , setup .t )
1978+ sigma2_updater2 = np .zeros_like (setup .sigma2 )
1979+ for t in range (setup .t ):
1980+ updater ._update_tester (t , parameters , setup .resids , sigma2_updater2 , var_bounds )
1981+ assert_allclose (sigma2_updater2 , sigma2 )
1982+
19701983
19711984def test_fiaparch_no_phi (setup ):
19721985 trunc_lag = 333
@@ -2024,6 +2037,28 @@ def test_fiaparch_no_beta(setup):
20242037 fiaparch .compute_variance (parameters , setup .resids , sigma2 , backcast , var_bounds )
20252038 assert np .all (np .isfinite (sigma2 ))
20262039
2040+ cond_var_direct = np .zeros_like (setup .sigma2 )
2041+ sigma_delta_direct = np .zeros_like (setup .sigma2 )
2042+ fig_params = parameters [:3 ] # omega, phi, d (no beta)
2043+ gamma = parameters [3 ]
2044+ delta = parameters [4 ]
2045+ recpy .fiaparch_recursion_python (
2046+ fig_params ,
2047+ setup .resids ,
2048+ np .abs (setup .resids ),
2049+ cond_var_direct ,
2050+ sigma_delta_direct ,
2051+ 1 ,
2052+ 0 ,
2053+ setup .t ,
2054+ 1000 ,
2055+ backcast ,
2056+ var_bounds ,
2057+ gamma ,
2058+ delta ,
2059+ )
2060+ assert_allclose (sigma2 , cond_var_direct )
2061+
20272062
20282063def test_fiaparch_no_asym (setup ):
20292064 fiaparch = FIAPARCH (o = 0 )
@@ -2141,6 +2176,21 @@ def test_fiaparch_simulate_high_beta(setup):
21412176 fiaparch .simulate (parameters , 20 , rng .simulate ([]))
21422177
21432178
2179+ def test_fiaparch_simulate_persistence_ge_1 (setup ):
2180+ fiaparch = FIAPARCH (truncation = 100 )
2181+ rng = Normal (seed = RandomState ())
2182+ # d > 1 pushes persistence >= 1
2183+ parameters = np .array ([0.1 , 0.2 , 1.01 , 0.2 , - 0.3 , 1.5 ])
2184+ fig_params = parameters [:4 ]
2185+ lam = rec .figarch_weights (fig_params [1 :], 1 , 1 , 100 )
2186+ persistence = np .sum (lam )
2187+ assert persistence >= 1
2188+ with pytest .warns (InitialValueWarning ):
2189+ sim_data = fiaparch .simulate (parameters , 20 , rng .simulate ([]))
2190+ assert sim_data [0 ].shape [0 ] == 20
2191+ assert sim_data [1 ].shape [0 ] == 20
2192+
2193+
21442194@pytest .mark .parametrize (
21452195 "p,o,q" ,
21462196 [(0 , 1 , 1 ), (1 , 0 , 1 ), (1 , 1 , 0 ), (0 , 0 , 1 ), (0 , 1 , 0 ), (1 , 0 , 0 ), (0 , 0 , 0 )],
@@ -2220,6 +2270,28 @@ def test_fiaparch_minimal(setup):
22202270 fiaparch .compute_variance (parameters , setup .resids , sigma2 , backcast , var_bounds )
22212271 assert np .all (np .isfinite (sigma2 ))
22222272
2273+ cond_var_direct = np .zeros_like (setup .sigma2 )
2274+ sigma_delta_direct = np .zeros_like (setup .sigma2 )
2275+ fig_params = parameters [:2 ] # omega, d (no phi, no beta)
2276+ gamma = parameters [2 ]
2277+ delta = parameters [3 ]
2278+ recpy .fiaparch_recursion_python (
2279+ fig_params ,
2280+ setup .resids ,
2281+ np .abs (setup .resids ),
2282+ cond_var_direct ,
2283+ sigma_delta_direct ,
2284+ 0 ,
2285+ 0 ,
2286+ setup .t ,
2287+ 1000 ,
2288+ backcast ,
2289+ var_bounds ,
2290+ gamma ,
2291+ delta ,
2292+ )
2293+ assert_allclose (sigma2 , cond_var_direct )
2294+
22232295
22242296def test_fiaparch_errors (setup ):
22252297 with pytest .raises (ValueError , match = r"truncation must be a positive integer" ):
0 commit comments