radiate_engines/steps/
front.rs

1use 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}