From 41658e700956f2bc41f9835ffd23128c073eb786 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sun, 16 Nov 2025 20:08:33 +0100 Subject: [PATCH] fix(eoa_lib): extract random distribution parameter out of perturbation --- codes/eoa_lib/src/evolutionary_strategy.rs | 14 ++++----- codes/eoa_lib/src/perturbation/mod.rs | 35 +++++++++++++++++----- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/codes/eoa_lib/src/evolutionary_strategy.rs b/codes/eoa_lib/src/evolutionary_strategy.rs index d0fb914eb550eae5f98a453444642a06edcf02e2..317378ac3ceafb7f44e36d8090bfca87c03693cf 100644 --- a/codes/eoa_lib/src/evolutionary_strategy.rs +++ b/codes/eoa_lib/src/evolutionary_strategy.rs @@ -3,7 +3,7 @@ use std::{convert::Infallible, error::Error}; use nalgebra::SVector; use rand_distr::{Normal, NormalError}; -use crate::{local_search::LocalSearchStats, perturbation::{apply_to_perturbations, PerturbationOperator, RandomDistributionPerturbation}}; +use crate::{local_search::LocalSearchStats, perturbation::{apply_to_perturbations, PerturbationOperator, RandomDistributionParameter, RandomDistributionPerturbation}}; pub trait EvolutionaryStrategy { type Err: Error + 'static; @@ -15,9 +15,9 @@ pub trait EvolutionaryStrategy { ) -> Result<(), Self::Err>; } -fn normal_one_to_five(perturbation: &mut RandomDistributionPerturbation>, better: bool) -> Result<(), NormalError> { +fn normal_one_to_five(params: &mut RandomDistributionParameter>, better: bool) -> Result<(), NormalError> { let exp: f64 = if better { 1.0 } else { 0.0 } - 0.2; - let sigma = perturbation.std_dev(); + let sigma = params.parameter; let new_sigma = sigma * exp.exp().powf(1.0 / LEN as f64); @@ -28,7 +28,7 @@ fn normal_one_to_five(perturbation: &mut RandomDistributionPer new_sigma }; - perturbation.set_std_dev(new_sigma)?; + params.parameter = new_sigma; Ok(()) } @@ -45,11 +45,11 @@ impl Result<(), Self::Err> { let mut found = false; let mut result = Ok(()); - apply_to_perturbations::<_, RandomDistributionPerturbation>>( + apply_to_perturbations::<_, RandomDistributionParameter>>( perturbation, - &mut |perturbation| { + &mut |params| { found = true; - result = normal_one_to_five(perturbation, better); + result = normal_one_to_five::(params, better); } ); diff --git a/codes/eoa_lib/src/perturbation/mod.rs b/codes/eoa_lib/src/perturbation/mod.rs index d145a3372ce3353d5c093baf003c2c2119447eb8..10597491d00667ecd201c1b5d81803a60ff5c438 100644 --- a/codes/eoa_lib/src/perturbation/mod.rs +++ b/codes/eoa_lib/src/perturbation/mod.rs @@ -176,25 +176,33 @@ where } } +pub struct RandomDistributionParameter { + pub parameter: f64, + _phantom: PhantomData +} + pub struct RandomDistributionPerturbation> { distribution: TDistribution, - parameter: f64 + params: RandomDistributionParameter } impl RandomDistributionPerturbation> { pub fn normal(std_dev: f64) -> Result { Ok(Self { distribution: Normal::new(0.0, std_dev)?, - parameter: std_dev + params: RandomDistributionParameter { + parameter: std_dev, + _phantom: PhantomData + } }) } pub fn std_dev(&self) -> f64 { - self.parameter + self.params.parameter } pub fn set_std_dev(&mut self, std_dev: f64) -> Result { - self.parameter = std_dev; + self.params.parameter = std_dev; self.distribution = Normal::new(0.0, std_dev)?; Ok(std_dev) } @@ -204,27 +212,38 @@ impl RandomDistributionPerturbation> { pub fn uniform(range: f64) -> Result { Ok(Self { distribution: Uniform::new(-range/2.0, range/2.0)?, - parameter: range, + params: RandomDistributionParameter { + parameter: range, + _phantom: PhantomData + } }) } pub fn range(&self) -> f64 { - self.parameter + self.params.parameter } pub fn set_range(&mut self, range: f64) -> Result { - self.parameter = range; + self.params.parameter = range; self.distribution = Uniform::new(-range/2.0, range/2.0)?; Ok(range) } } -impl, const LEN: usize> PerturbationOperator for RandomDistributionPerturbation { +impl + 'static, const LEN: usize> PerturbationOperator for RandomDistributionPerturbation { type Chromosome = SVector; fn perturb(&self, chromosome: &mut Self::Chromosome, rng: &mut dyn RngCore) { *chromosome += Self::Chromosome::zeros().map(|_| self.distribution.sample(rng)); } + + fn try_get_params(&self) -> Option<&dyn Any> { + Some(&self.params) + } + + fn try_get_params_mut(&mut self) -> Option<&mut dyn Any> { + Some(&mut self.params) + } } pub struct PatternPerturbation {