cambrian/
rescaling.rs

1use crate::meta::{CrossoverParams, MutationParams};
2
3#[derive(Debug)]
4pub struct CrossoverRescaling {
5    pub crossover_prob_factor: f64,
6    pub selection_pressure_factor: f64,
7}
8
9#[derive(Debug)]
10pub struct MutationRescaling {
11    pub mutation_prob_factor: f64,
12    pub mutation_scale_factor: f64,
13}
14
15#[derive(Default, Debug)]
16pub struct Rescaling {
17    pub crossover_rescaling: CrossoverRescaling,
18    pub mutation_rescaling: MutationRescaling,
19}
20
21impl Default for CrossoverRescaling {
22    fn default() -> Self {
23        Self {
24            crossover_prob_factor: 1.0,
25            selection_pressure_factor: 1.0,
26        }
27    }
28}
29
30impl Default for MutationRescaling {
31    fn default() -> Self {
32        Self {
33            mutation_prob_factor: 1.0,
34            mutation_scale_factor: 1.0,
35        }
36    }
37}
38
39impl Rescaling {
40    pub fn rescale_crossover(&self, pre: &CrossoverParams) -> CrossoverParams {
41        CrossoverParams {
42            crossover_prob: pre.crossover_prob * self.crossover_rescaling.crossover_prob_factor,
43            selection_pressure: pre.selection_pressure
44                * self.crossover_rescaling.selection_pressure_factor,
45        }
46    }
47
48    pub fn rescale_mutation(&self, pre: &MutationParams) -> MutationParams {
49        MutationParams {
50            mutation_prob: pre.mutation_prob * self.mutation_rescaling.mutation_prob_factor,
51            mutation_scale: pre.mutation_scale * self.mutation_rescaling.mutation_scale_factor,
52        }
53    }
54}
55
56#[derive(Default, Debug)]
57pub struct RescalingContext {
58    pub current_rescaling: Rescaling,
59}