use rand::{seq::SliceRandom, Rng};
use std::collections::HashMap;
mod neuron;
pub use neuron::*;
mod network;
pub use network::*;
mod population;
pub use population::*;
#[cfg(test)]
mod tests {
use std::vec;
use super::*;
#[test]
fn test_network() {
let mut network = Network::new(2, 1);
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Output, 0), 1.0);
network.add_connection((NeuronSet::Input, 1), (NeuronSet::Output, 0), 1.0);
let output = network.activate(vec![1.0, 1.0]);
assert_eq!(output, vec![2.0]);
}
#[test]
fn test_network_with_extra() {
let mut network = Network::new(2, 1);
network.create_extra_neuron();
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Extra, 0), (NeuronSet::Output, 0), 1.0);
let output = network.activate(vec![1.0, 1.0]);
assert_eq!(output, vec![1.0]);
}
#[test]
fn test_network_with_hidden() {
let mut network = Network::new(2, 1);
network.create_extra_neuron();
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Input, 1), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Extra, 0), (NeuronSet::Output, 0), 1.0);
let output = network.activate(vec![1.0, 1.0]);
assert_eq!(output, vec![2.0]);
}
#[test]
fn test_network_with_hidden_and_disabled() {
let mut network = Network::new(2, 1);
network.create_extra_neuron();
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Input, 1), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Extra, 0), (NeuronSet::Output, 0), 1.0);
network.connections[1].enabled = false;
let output = network.activate(vec![1.0, 1.0]);
assert_eq!(output, vec![1.0]);
}
#[test]
fn test_network_with_hidden_and_disabled_and_negative() {
let mut network = Network::new(2, 1);
network.create_extra_neuron();
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Input, 1), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Extra, 0), (NeuronSet::Output, 0), -1.0);
network.connections[1].enabled = false;
let output = network.activate(vec![1.0, 1.0]);
assert_eq!(output, vec![-1.0]);
}
#[test]
fn perfect_xor_network() {
let mut network = Network::new(2, 1);
network.create_extra_neuron();
network.add_connection((NeuronSet::Input, 0), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Input, 1), (NeuronSet::Extra, 0), 1.0);
network.add_connection((NeuronSet::Extra, 0), (NeuronSet::Output, 0), -2.0);
assert_eq!(network.activate(vec![0.0, 0.0]), vec![0.0]);
assert_eq!(network.activate(vec![0.0, 1.0]), vec![1.0]);
assert_eq!(network.activate(vec![1.0, 0.0]), vec![1.0]);
assert_eq!(network.activate(vec![1.0, 1.0]), vec![0.0]);
}
}