radiate_engines/steps/
evaluate.rs1use 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}