~ruther/ctu-fee-eoa

fcdc8b366adfe108bd901dae12a5276be3e8f0a4 — Rutherther 2 months ago 79c83af
feat: add RandomDistributionPerturbation

For vectors of reals, perturb by a random distribution with
expectation in 0.
3 files changed, 44 insertions(+), 1 deletions(-)

M env/Cargo.lock
M env/Cargo.toml
M env/src/perturbation/mod.rs
M env/Cargo.lock => env/Cargo.lock +18 -0
@@ 35,6 35,7 @@ version = "0.1.0"
dependencies = [
 "nalgebra",
 "rand",
 "rand_distr",
]

[[package]]


@@ 56,6 57,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"

[[package]]
name = "libm"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"

[[package]]
name = "matrixmultiply"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 138,6 145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
 "autocfg",
 "libm",
]

[[package]]


@@ 209,6 217,16 @@ dependencies = [
]

[[package]]
name = "rand_distr"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
dependencies = [
 "num-traits",
 "rand",
]

[[package]]
name = "rawpointer"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

M env/Cargo.toml => env/Cargo.toml +1 -0
@@ 6,3 6,4 @@ edition = "2024"
[dependencies]
nalgebra = "0.33.2"
rand = "0.9.2"
rand_distr = "0.5.1"

M env/src/perturbation/mod.rs => env/src/perturbation/mod.rs +25 -1
@@ 1,4 1,6 @@
use rand::Rng;
use nalgebra::SVector;
use rand::{distr::Distribution, Rng};
use rand_distr::{Normal, NormalError};

use crate::binary_string::BinaryString;



@@ 30,6 32,28 @@ impl<TRng: Rng> PerturbationOperator for BinaryStringBitPerturbation<TRng> {
    }
}

pub struct RandomDistributionPerturbation<const LEN: usize, TRng: Rng, TDistribution: Distribution<f64>> {
    distribution: TDistribution,
    rng: TRng
}

impl<const LEN: usize> RandomDistributionPerturbation<LEN, rand::rngs::ThreadRng, Normal<f64>> {
    pub fn normal(variance: f64) -> Result<Self, NormalError> {
        Ok(Self {
            distribution: Normal::new(0.0, variance)?,
            rng: rand::rng()
        })
    }
}

impl<TRng: Rng, TDistribution: Distribution<f64>, const LEN: usize> PerturbationOperator for RandomDistributionPerturbation<LEN, TRng, TDistribution> {
    type Chromosome = SVector<f64, LEN>;

    fn perturb(self: &mut Self, chromosome: &Self::Chromosome) -> Self::Chromosome {
        chromosome + Self::Chromosome::zeros().map(|_| self.distribution.sample(&mut self.rng))
    }
}

#[cfg(test)]
pub mod tests {
    use crate::binary_string::BinaryString;