From f304d07126d7123c7af3fff8a4bbc3109978ed21 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Fri, 31 Oct 2025 16:04:03 +0100 Subject: [PATCH] refactor(lib): implement generic evolutionary strategy using .wrapped_mut Thanks to wrapped_mut now the one_to_five strategy can be implemented without relying on BoundedPerturbation etc. --- codes/eoa_lib/src/evolutionary_strategy.rs | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/codes/eoa_lib/src/evolutionary_strategy.rs b/codes/eoa_lib/src/evolutionary_strategy.rs index d2758c5629c770822bdd0d2a5ff977f249ba38f4..fc44d87ff637cb1ec4db392a6d7157ca7e47417c 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::{BoundedPerturbation, PerturbationOperator, RandomDistributionPerturbation}}; +use crate::{local_search::LocalSearchStats, perturbation::{apply_to_perturbations, BoundedPerturbation, PerturbationOperator, RandomDistributionPerturbation}}; pub trait EvolutionaryStrategy { type Err: Error + 'static; @@ -33,30 +33,31 @@ fn normal_one_to_five(perturbation: &mut RandomDistributionPer } pub struct OneToFiveStrategy; -impl EvolutionaryStrategy>> for OneToFiveStrategy { +impl>, + TOut> EvolutionaryStrategy for OneToFiveStrategy { type Err = NormalError; fn step(&mut self, - perturbation: &mut RandomDistributionPerturbation>, + perturbation: &mut TPerturbation, better: bool, _: &LocalSearchStats, TOut> ) -> Result<(), Self::Err> { - normal_one_to_five(perturbation, better) - } -} + let mut found = false; + let mut result = Ok(()); + apply_to_perturbations::<_, RandomDistributionPerturbation>>( + perturbation, + &mut |perturbation| { + found = true; + result = normal_one_to_five(perturbation, better); + } + ); -// TODO: I don't really like this to be honest. This would basically have to take care of any perturbation wrapper -// that there is. But that just seems wrong. -impl EvolutionaryStrategy>>> for OneToFiveStrategy { - type Err = NormalError; + if !found { + panic!("There is no random distribution perturbation!"); + } - fn step(&mut self, - perturbation: &mut BoundedPerturbation>>, - better: bool, - _: &LocalSearchStats<>> as PerturbationOperator>::Chromosome, TOut> - ) -> Result<(), Self::Err> { - println!("{}", perturbation.inner().std_dev()); - normal_one_to_five(perturbation.inner_mut(), better) + result } }