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}