radiate_rust/engines/codexes/
int_codex.rs

1use crate::engines::genome::chromosome::Chromosome;
2use crate::engines::genome::genes::gene::{BoundGene, Gene};
3use crate::engines::genome::genes::int_gene::IntGene;
4use crate::engines::genome::genotype::Genotype;
5
6use super::Codex;
7
8pub struct IntCodex {
9    pub num_chromosomes: usize,
10    pub num_genes: usize,
11    pub min: i32,
12    pub max: i32,
13    pub lower_bound: i32,
14    pub upper_bound: i32,
15}
16
17impl IntCodex {
18    pub fn new(num_chromosomes: usize, num_genes: usize, min: i32, max: i32) -> Self {
19        IntCodex {
20            num_chromosomes,
21            num_genes,
22            min,
23            max,
24            lower_bound: i32::MIN,
25            upper_bound: i32::MAX,
26        }
27    }
28
29    pub fn with_bounds(mut self, lower_bound: i32, upper_bound: i32) -> Self {
30        self.lower_bound = lower_bound;
31        self.upper_bound = upper_bound;
32        self
33    }
34}
35
36impl Codex<IntGene, i32, Vec<Vec<i32>>> for IntCodex {
37    fn encode(&self) -> Genotype<IntGene, i32> {
38        Genotype {
39            chromosomes: (0..self.num_chromosomes)
40                .into_iter()
41                .map(|_| Chromosome::from_genes((0..self.num_genes)
42                        .into_iter()
43                        .map(|_| IntGene::new(self.min, self.max).with_bounds(self.lower_bound, self.upper_bound))
44                        .collect::<Vec<IntGene>>()))
45                .collect::<Vec<Chromosome<IntGene, i32>>>(),
46        }
47    }
48
49    fn decode(&self, genotype: &Genotype<IntGene, i32>) -> Vec<Vec<i32>> {
50        genotype
51            .iter()
52            .map(|chromosome| {
53                chromosome
54                    .iter()
55                    .map(|gene| *gene.allele())
56                    .collect::<Vec<i32>>()
57            })
58            .collect::<Vec<Vec<i32>>>()
59    }
60}