radiate_engines/steps/
front.rs1use radiate_core::{
2 Chromosome, Ecosystem, EngineStep, Front, MetricSet, Phenotype, metric_names, pareto,
3};
4use std::sync::{Arc, RwLock};
5
6pub struct FrontStep<C: Chromosome> {
7 pub(crate) front: Arc<RwLock<Front<Phenotype<C>>>>,
8}
9
10impl<C> EngineStep<C> for FrontStep<C>
11where
12 C: Chromosome + 'static,
13{
14 fn execute(&mut self, _: usize, metrics: &mut MetricSet, ecosystem: &mut Ecosystem<C>) {
15 let timer = std::time::Instant::now();
16
17 let new_individuals = pareto::pareto_front(
18 &ecosystem.population().iter().collect::<Vec<_>>(),
19 &self.front.read().unwrap().objective(),
20 );
21
22 let phenotypes = new_individuals
23 .into_iter()
24 .map(|pheno| Phenotype::clone(pheno))
25 .collect::<Vec<Phenotype<C>>>();
26 let count = self.front.write().unwrap().add_all(&phenotypes);
27
28 metrics.upsert_operations(metric_names::FRONT, count as f32, timer.elapsed());
29 }
30}