From 9f19c2228af77b4a91997e3df1bea208558b1ad4 Mon Sep 17 00:00:00 2001 From: technocore Date: Sat, 1 Aug 2026 01:33:10 +0000 Subject: [PATCH] fix: prevent stack overflow in trend_analysis when max residual is at endpoint (closes #83) --- src/trends.rs | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/trends.rs b/src/trends.rs index 7497497..d584adf 100644 --- a/src/trends.rs +++ b/src/trends.rs @@ -60,20 +60,22 @@ fn recursive_trend_analysis( slope, intercept, }); - } else { - let Some(max_residual_index) = residuals - .iter() - .enumerate() - .max_by(|(_, a), (_, b)| a.abs().total_cmp(&b.abs())) - .map(|(i, _)| i) - else { - return; - }; - - let (left, right) = y.split_at(max_residual_index); - recursive_trend_analysis(left, start_index, segments, threshold); - recursive_trend_analysis(right, start_index + max_residual_index, segments, threshold); + return; } + + let Some(max_residual_index) = residuals + .iter() + .enumerate() + .filter(|(i, _)| *i > 0 && *i < y.len() - 1) + .max_by(|(_, a), (_, b)| a.abs().total_cmp(&b.abs())) + .map(|(i, _)| i) + else { + return; + }; + + let (left, right) = y.split_at(max_residual_index); + recursive_trend_analysis(left, start_index, segments, threshold); + recursive_trend_analysis(right, start_index + max_residual_index, segments, threshold); } fn calculate_linear_regression(y: &[f64]) -> (f64, f64) {