Skip to main content

radiate_alters/mutators/
flip.rs

1use radiate_core::{AlterContext, BitGene, Chromosome, Expr, Mutate, RateSet, random_provider};
2
3#[derive(Debug, Clone)]
4pub struct BitFlipMutator {
5    rate: Expr,
6}
7
8impl BitFlipMutator {
9    pub fn new(rate: impl Into<Expr>) -> Self {
10        Self { rate: rate.into() }
11    }
12}
13
14impl<C> Mutate<C> for BitFlipMutator
15where
16    C: Chromosome<Gene = BitGene>,
17{
18    fn rates(&self) -> radiate_core::RateSet {
19        RateSet::new(self.rate.clone())
20    }
21
22    fn mutate_chromosome(&mut self, chromosome: &mut C, ctx: &mut AlterContext) -> usize {
23        let mut flips = 0;
24        random_provider::with_rng(|rng| {
25            for gene in chromosome.iter_mut() {
26                if rng.bool(ctx.rate()) {
27                    gene.flip();
28                    flips += 1;
29                }
30            }
31        });
32
33        flips
34    }
35}