| 249 | } |
| 250 | |
| 251 | pub fn single_fit_loop(&mut self, epsilon_override: Option<f64>) -> Vec<FitResultRow> { |
| 252 | if let Some(eps) = epsilon_override { |
| 253 | if eps > 0.0 { |
| 254 | self.epsilon = eps; |
| 255 | } |
| 256 | } |
| 257 | self.parameters = vec![0.0; 5]; |
| 258 | self.error = self.moments.iter().map(|m| m * m).sum(); |
| 259 | |
| 260 | let std_dev = centered_moment(&self.moments, 2).sqrt(); |
| 261 | let upper = (1.0 / self.epsilon).max(1.0) as usize; |
| 262 | let mut err_min = self.error; |
| 263 | let mut best: Option<FitResultRow> = None; |
| 264 | |
| 265 | for i in 1..upper { |
| 266 | let mu_2_i = i as f64 * self.epsilon * self.factor * std_dev + self.moments[0]; |
| 267 | let _ = self.fit(mu_2_i); |
| 268 | if self.error < err_min { |
| 269 | err_min = self.error; |
| 270 | best = Some(FitResultRow { |
| 271 | mu_1: self.parameters[0], |
| 272 | mu_2: self.parameters[1], |
| 273 | sigma_1: self.parameters[2], |
| 274 | sigma_2: self.parameters[3], |
| 275 | p_1: self.parameters[4], |
| 276 | error: err_min, |
| 277 | }); |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | best.into_iter().collect() |
| 282 | } |
| 283 | |
| 284 | pub fn mp_fit(&self) -> Vec<FitResultRow> { |
| 285 | let mut out = Vec::new(); |