radiate_alters/mutators/
flip.rs1use 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}