diff --git a/src/history.rs b/src/history.rs index 5191929..920469c 100644 --- a/src/history.rs +++ b/src/history.rs @@ -262,17 +262,45 @@ impl, O: Observer, K: Eq + Hash + Clone> History HashMap> { - let mut data: HashMap> = HashMap::new(); - for slice in &self.time_slices { - for (idx, skill) in slice.skills.iter() { - if let Some(key) = self.keys.key(idx).cloned() { - data.entry(key) - .or_default() - .push((slice.time, skill.posterior())); + #[cfg(feature = "rayon")] + { + use rayon::prelude::*; + + let per_slice: Vec> = self + .time_slices + .par_iter() + .map(|ts| { + ts.skills + .iter() + .map(|(idx, sk)| (idx, ts.time, sk.posterior())) + .collect() + }) + .collect(); + + let mut data: HashMap> = HashMap::new(); + for slice_contrib in per_slice { + for (idx, t, g) in slice_contrib { + if let Some(key) = self.keys.key(idx).cloned() { + data.entry(key).or_default().push((t, g)); + } } } + data + } + #[cfg(not(feature = "rayon"))] + { + let mut data: HashMap> = HashMap::new(); + for slice in &self.time_slices { + for (idx, skill) in slice.skills.iter() { + if let Some(key) = self.keys.key(idx).cloned() { + data.entry(key) + .or_default() + .push((slice.time, skill.posterior())); + } + } + } + data } - data } /// Skill estimate at the latest time slice the competitor appears in.