radiate_core/codecs/
permutation.rs

1use crate::{
2    Chromosome, Codec, Gene, Genotype, PermutationChromosome, PermutationGene, random_provider,
3};
4use std::sync::Arc;
5
6#[derive(Clone)]
7pub struct PermutationCodec<A: PartialEq + Clone> {
8    alleles: Arc<Vec<A>>,
9}
10
11impl<A: PartialEq + Clone> PermutationCodec<A> {
12    pub fn new(alleles: Vec<A>) -> Self {
13        PermutationCodec {
14            alleles: Arc::new(alleles),
15        }
16    }
17}
18
19impl<A: PartialEq + Clone> Codec<PermutationChromosome<A>, Vec<A>> for PermutationCodec<A> {
20    fn encode(&self) -> Genotype<PermutationChromosome<A>> {
21        Genotype::new(vec![PermutationChromosome::new(
22            random_provider::indexes(0..self.alleles.len())
23                .iter()
24                .map(|i| PermutationGene::new(*i, Arc::clone(&self.alleles)))
25                .collect(),
26            Arc::clone(&self.alleles),
27        )])
28    }
29
30    fn decode(&self, genotype: &Genotype<PermutationChromosome<A>>) -> Vec<A> {
31        genotype
32            .iter()
33            .flat_map(|chromosome| chromosome.genes().iter().map(|gene| gene.allele().clone()))
34            .collect()
35    }
36}