radiate_rust/engines/codexes/
int_codex.rs1use 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}