cosyne 0.3.4

CoSyNE - neuro evolution through cooperatively coevolved synapses
Documentation
use cosyne::{Activation, Config, Cosyne, Environment, ANN};

#[test]
fn xor() {
    let config = Config::new(100);
    let env = Box::new(XorEnvironment {});
    let activation = Activation::Relu;
    let mut nn = ANN::new(2, 1, activation);
    nn.add_layer(2, Activation::Relu);
    let mut cosyne = Cosyne::new(env, nn, config);
    for _ in 0..100 {
        cosyne.evolve();
    }
    let champion = cosyne.champion();
    println!("champion: {:?}", champion);
    assert!(champion.1 > 3.9);
}

struct XorEnvironment {}

impl Environment for XorEnvironment {
    fn evaluate(&self, nn: &mut ANN) -> f64 {
        let mut distance: f64;

        let mut output = nn.forward(vec![0.0, 0.0]);
        distance = (0.0 - output[0]).abs();
        output = nn.forward(vec![0.0, 1.0]);
        distance += (1.0 - output[0]).abs();
        output = nn.forward(vec![1.0, 0.0]);
        distance += (1.0 - output[0]).abs();
        output = nn.forward(vec![1.0, 1.0]);
        distance += (0.0 - output[0]).abs();

        (4.0 - distance).powi(2)
    }
}