use crate::result::SolveResult;
use num_traits::Float;
#[cfg(feature = "parallel")]
pub(crate) fn run_replicas<T, F>(count: usize, run: F) -> Vec<SolveResult<T>>
where
T: Send,
F: Fn(usize) -> SolveResult<T> + Send + Sync,
{
use rayon::prelude::*;
(0..count).into_par_iter().map(run).collect()
}
#[cfg(not(feature = "parallel"))]
pub(crate) fn run_replicas<T, F>(count: usize, run: F) -> Vec<SolveResult<T>>
where
F: Fn(usize) -> SolveResult<T>,
{
(0..count).map(run).collect()
}
pub(crate) fn best_of<T: Float>(results: Vec<SolveResult<T>>) -> SolveResult<T> {
results
.into_iter()
.min_by(|a, b| {
a.energy
.partial_cmp(&b.energy)
.unwrap_or(core::cmp::Ordering::Equal)
})
.expect("at least one replica result")
}