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;
}