radiate_core/codecs/
permutation.rs1use 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}