From 1fd234d33d0fefcf1cbe9998a0f440e8720b2d2c Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Thu, 10 Mar 2022 15:02:00 -0500 Subject: [PATCH] refactoring of `newtons_method` --- src/misc.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/misc.rs b/src/misc.rs index afc7572..2319004 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -130,24 +130,23 @@ pub fn newtons_method( f_1: &dyn Fn(f64) -> f64, ) -> Vec { let mut output_list: Vec = Vec::new(); - let mut last_ele: Option = None; + let mut last_ele_option: Option = None; for ele in data.iter() { - if last_ele.is_none() { - last_ele = Some(*ele); + if last_ele_option.is_none() { + last_ele_option = Some(*ele); continue; } - let last_ele_signum = last_ele.unwrap().y.signum(); - let ele_signum = ele.y.signum(); + let last_ele_y = last_ele_option.unwrap().y; // store this here as it's used multiple times // If either are NaN, just continue iterating - if last_ele_signum.is_nan() | ele_signum.is_nan() { + if last_ele_y.is_nan() | ele.y.is_nan() { continue; } - if last_ele_signum != ele_signum { + if last_ele_y.signum() != ele.y.signum() { let x = { - let mut x1: f64 = last_ele.unwrap().x; + let mut x1: f64 = last_ele_option.unwrap().x; let mut x2: f64; let mut fail: bool = false; loop { @@ -157,6 +156,7 @@ pub fn newtons_method( break; } + // If below threshold, break if (x2 - x1).abs() < threshold { break; } @@ -164,6 +164,7 @@ pub fn newtons_method( x1 = x2; } + // If failed, return NaN, which is then filtered out match fail { true => f64::NAN, false => x1, @@ -174,7 +175,7 @@ pub fn newtons_method( output_list.push(x); } } - last_ele = Some(*ele); + last_ele_option = Some(*ele); } output_list }