1use super::{Chromosome, Codec, Genotype, Score};
2use std::sync::Arc;
3
4pub trait Problem<C: Chromosome, T>: Send + Sync {
11 fn encode(&self) -> Genotype<C>;
12 fn decode(&self, genotype: &Genotype<C>) -> T;
13 fn eval(&self, individual: &Genotype<C>) -> Score;
14}
15
16pub struct EngineProblem<C, T>
20where
21 C: Chromosome,
22{
23 pub codec: Arc<dyn Codec<C, T>>,
24 pub fitness_fn: Arc<dyn Fn(T) -> Score + Send + Sync>,
25}
26
27impl<C: Chromosome, T> Problem<C, T> for EngineProblem<C, T> {
28 fn encode(&self) -> Genotype<C> {
29 self.codec.encode()
30 }
31
32 fn decode(&self, genotype: &Genotype<C>) -> T {
33 self.codec.decode(genotype)
34 }
35
36 fn eval(&self, individual: &Genotype<C>) -> Score {
37 let phenotype = self.decode(individual);
38 (self.fitness_fn)(phenotype)
39 }
40}
41
42unsafe impl<C: Chromosome, T> Send for EngineProblem<C, T> {}
43unsafe impl<C: Chromosome, T> Sync for EngineProblem<C, T> {}