From a94198a9bc2776a451bca27211d0c72291df5842 Mon Sep 17 00:00:00 2001 From: Tristan Murphy <72839119+inflectrix@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:14:42 +0000 Subject: [PATCH 1/3] create basic log test --- src/lib.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index ee9f769..ac569b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,3 +23,67 @@ pub use topology::*; #[cfg(feature = "serde")] pub use nnt_serde::*; + +#[cfg(test)] +mod tests { + use super::*; + use rand::prelude::*; + + #[derive(RandomlyMutable, DivisionReproduction, Clone)] + struct AgentDNA { + network: NeuralNetworkTopology<2, 1>, + } + + impl Prunable for AgentDNA {} + + impl GenerateRandom for AgentDNA { + fn gen_random(rng: &mut impl Rng) -> Self { + Self { + network: NeuralNetworkTopology::new(0.01, 3, rng), + } + } + } + + #[test] + fn basic_test() { + let fitness = |g: &AgentDNA| { + let network = NeuralNetwork::from(&g.network); + let mut fitness = 0.; + let mut rng = rand::thread_rng(); + + for _ in 0..100 { + let n = rng.gen::() * 10000.; + let base = rng.gen::() * 10.; + let expected = n.log(base); + + let [answer] = network.predict([n, base]); + network.flush_state(); + + fitness += 5. / (answer - expected).abs(); + } + + fitness + }; + + let mut rng = rand::thread_rng(); + + let mut sim = GeneticSim::new( + Vec::gen_random(&mut rng, 100), + fitness, + division_pruning_nextgen, + ); + + for _ in 0..100 { + sim.next_generation(); + } + + let mut fits: Vec<_> = sim.genomes + .iter() + .map(fitness) + .collect(); + + fits.sort_by(|a, b| a.partial_cmp(&b).unwrap()); + + dbg!(fits); + } +} \ No newline at end of file From f6d0df0493d2ec8b8cdc7ce8c978154470c449f5 Mon Sep 17 00:00:00 2001 From: Tristan Murphy <72839119+inflectrix@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:54:27 +0000 Subject: [PATCH 2/3] fix test rayon feature --- src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index ac569b0..0de19a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,10 +65,16 @@ mod tests { fitness }; + #[cfg(not(feature = "rayon"))] let mut rng = rand::thread_rng(); let mut sim = GeneticSim::new( + #[cfg(not(feature = "rayon"))] Vec::gen_random(&mut rng, 100), + + #[cfg(feature = "rayon")] + Vec::gen_random(100), + fitness, division_pruning_nextgen, ); From cc88ebfc8497ec4583a4fbd43d5ad7e53ef8d9ba Mon Sep 17 00:00:00 2001 From: Tristan Murphy <72839119+inflectrix@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:55:23 +0000 Subject: [PATCH 3/3] cargo fmt --- src/lib.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0de19a1..0dd0b8c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,7 +30,7 @@ mod tests { use rand::prelude::*; #[derive(RandomlyMutable, DivisionReproduction, Clone)] - struct AgentDNA { + struct AgentDNA { network: NeuralNetworkTopology<2, 1>, } @@ -71,10 +71,8 @@ mod tests { let mut sim = GeneticSim::new( #[cfg(not(feature = "rayon"))] Vec::gen_random(&mut rng, 100), - #[cfg(feature = "rayon")] Vec::gen_random(100), - fitness, division_pruning_nextgen, ); @@ -83,13 +81,10 @@ mod tests { sim.next_generation(); } - let mut fits: Vec<_> = sim.genomes - .iter() - .map(fitness) - .collect(); + let mut fits: Vec<_> = sim.genomes.iter().map(fitness).collect(); fits.sort_by(|a, b| a.partial_cmp(&b).unwrap()); dbg!(fits); } -} \ No newline at end of file +}