~ruther/ctu-fee-eoa

bf8e11ed52587eaca15a6bdb22de9a6bfe0d3b20 — Rutherther a month ago d0b6ff6
refactor: properly handle errors in local_search
M env/Cargo.lock => env/Cargo.lock +1 -0
@@ 208,6 208,7 @@ dependencies = [
 "plotters",
 "rand",
 "rand_distr",
 "thiserror",
]

[[package]]

M env/Cargo.toml => env/Cargo.toml +1 -0
@@ 8,3 8,4 @@ nalgebra = "0.33.2"
plotters = "0.3.7"
rand = "0.9.2"
rand_distr = "0.5.1"
thiserror = "2.0.17"

M env/src/binary_string.rs => env/src/binary_string.rs +4 -3
@@ 1,6 1,7 @@
use std::str::FromStr;
use std::{error::Error, str::FromStr};
use nalgebra::{allocator::Allocator, Const, DefaultAllocator, Dim, DimName, Dynamic, OVector, SVector, U1};
use rand::{Rng, RngCore};
use thiserror::Error;

#[derive(Debug, Clone, PartialEq)]
pub struct Bounds {


@@ 30,10 31,10 @@ pub struct BinaryString {
    pub vec: Vec<i8>
}

#[derive(Debug, Clone, PartialEq)]
#[derive(Error, Debug, Clone, PartialEq)]
pub enum BinaryStringConversionError {
    #[error("The dimension of the bounds does not divide the length of the binary string.")]
    DimensionMismatch,
    NoBounds
}

impl BinaryString {

M env/src/evolutionary_strategy.rs => env/src/evolutionary_strategy.rs +3 -3
@@ 1,12 1,12 @@
use std::convert::Infallible;
use std::{convert::Infallible, error::Error};

use nalgebra::SVector;
use rand_distr::{Normal, NormalError};

use crate::{local_search::{LocalSearchCandidate, LocalSearchStats}, perturbation::{BoundedPerturbation, PerturbationOperator, RandomDistributionPerturbation}};
use crate::{local_search::LocalSearchStats, perturbation::{BoundedPerturbation, PerturbationOperator, RandomDistributionPerturbation}};

pub trait EvolutionaryStrategy<TOut, TPerturbation: PerturbationOperator> {
    type Err;
    type Err: Error + 'static;

    fn step(&mut self,
            perturbation: &mut TPerturbation,

M env/src/fitness/mod.rs => env/src/fitness/mod.rs +2 -2
@@ 1,4 1,4 @@
use std::convert::Infallible;
use std::{convert::Infallible, error::Error};

use nalgebra::{allocator::Allocator, DefaultAllocator, Dim, OVector, SVector};



@@ 13,7 13,7 @@ pub mod real;
pub trait FitnessFunction {
    type In;
    type Out;
    type Err;
    type Err: Error + 'static;

    fn fit(self: &Self, inp: &Self::In) -> Result<Self::Out, Self::Err>;
}

M env/src/local_search/mod.rs => env/src/local_search/mod.rs +9 -11
@@ 1,3 1,4 @@
use std::error::Error;
use std::fmt::Debug;
use crate::binary_string::{BinaryString, BinaryStringConversionError};
use crate::evolutionary_strategy::{EvolutionaryStrategy, IdentityStrategy};


@@ 82,17 83,17 @@ pub struct LocalSearchResult<TInput, TResult>
}

pub fn local_search_first_improving<
        TInput, TResult, TErr, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator>(
        TInput, TResult, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator>(
    fit: &TFit,
    terminating_condition: &mut TTerminatingCondition,
    perturbation_operator: &mut TPerturbationOperator,
    better_than_operator: &TBetterThanOperator,
    initial: &TInput
) -> Result<LocalSearchResult<TInput, TResult>, TErr>
) -> Result<LocalSearchResult<TInput, TResult>, Box<dyn Error>>
where
    TResult: Clone,
    TInput: Clone,
    TFit: FitnessFunction<In = TInput, Out = TResult, Err = TErr>,
    TFit: FitnessFunction<In = TInput, Out = TResult>,
    TTerminatingCondition: TerminatingCondition<TInput, TResult>,
    TPerturbationOperator: PerturbationOperator<Chromosome = TInput>,
    TBetterThanOperator: BetterThanOperator<TResult>,


@@ 108,23 109,22 @@ where
}

pub fn local_search_first_improving_evolving<
        TInput, TResult, TErr, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator, TEvolutionaryStrategy>(
        TInput, TResult, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator, TEvolutionaryStrategy>(
    fit: &TFit,
    terminating_condition: &mut TTerminatingCondition,
    perturbation_operator: &mut TPerturbationOperator,
    better_than_operator: &TBetterThanOperator,
    evolutionary_strategy: &mut TEvolutionaryStrategy,
    initial: &TInput
) -> Result<LocalSearchResult<TInput, TResult>, TErr>
) -> Result<LocalSearchResult<TInput, TResult>, Box<dyn Error>>
where
    TResult: Clone,
    TInput: Clone,
    TFit: FitnessFunction<In = TInput, Out = TResult, Err = TErr>,
    TFit: FitnessFunction<In = TInput, Out = TResult>,
    TTerminatingCondition: TerminatingCondition<TInput, TResult>,
    TPerturbationOperator: PerturbationOperator<Chromosome = TInput>,
    TEvolutionaryStrategy: EvolutionaryStrategy<TResult, TPerturbationOperator>,
    TBetterThanOperator: BetterThanOperator<TResult>,
    <TEvolutionaryStrategy as EvolutionaryStrategy<TResult, TPerturbationOperator>>::Err: Debug
    TBetterThanOperator: BetterThanOperator<TResult>
{
    let mut best_candidate = LocalSearchCandidate {
        pos: initial.clone(),


@@ 157,9 157,7 @@ where
        evolutionary_strategy.step(
            perturbation_operator,
            better,
            &stats)
        // TODO
            .expect("Evolution failed.");
            &stats)?;

        cycle += 1;
    }