Skip to main content

radiate_engines/steps/
evaluate.rs

1use crate::steps::EngineStep;
2use radiate_core::{Chromosome, Ecosystem, Evaluator, MetricSet, Objective, Problem, metric_names};
3use radiate_error::Result;
4use std::sync::Arc;
5
6pub struct EvaluateStep<C: Chromosome, T> {
7    pub(crate) objective: Objective,
8    pub(crate) evaluator: Arc<dyn Evaluator<C, T>>,
9    pub(crate) problem: Arc<dyn Problem<C, T>>,
10}
11
12impl<C: Chromosome, T> EvaluateStep<C, T> {
13    pub fn new(
14        objective: Objective,
15        problem: Arc<dyn Problem<C, T>>,
16        evaluator: Arc<dyn Evaluator<C, T>>,
17    ) -> Self {
18        Self {
19            objective,
20            evaluator,
21            problem,
22        }
23    }
24}
25
26impl<C, T> EngineStep<C> for EvaluateStep<C, T>
27where
28    C: Chromosome + PartialEq,
29{
30    #[inline]
31    fn execute(
32        &mut self,
33        _: usize,
34        ecosystem: &mut Ecosystem<C>,
35        metrics: &mut MetricSet,
36    ) -> Result<()> {
37        let count = self.evaluator.eval(ecosystem, Arc::clone(&self.problem))?;
38
39        if count > 0 {
40            self.objective.sort(&mut ecosystem.population);
41            metrics.upsert((metric_names::EVALUATION_COUNT, count));
42        }
43
44        Ok(())
45    }
46}