1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#![cfg(test)]
use crate::brain::*;
use crate::brain_builder::*;
use crate::config::*;
use crate::neuron::*;
use crate::offspring_builder::*;
#[test]
fn test_brain() {
let mut brain = Brain::new();
let n1 = brain.create_neuron(Position {
x: 0.0,
y: 0.0,
z: 0.0,
});
let n2 = brain.create_neuron(Position {
x: 1.0,
y: 0.0,
z: 0.0,
});
let n3 = brain.create_neuron(Position {
x: 4.0,
y: 0.0,
z: 0.0,
});
let s1 = brain.create_sensor(n1).unwrap();
let e1 = brain.create_effector(n3).unwrap();
brain.bind_neurons(n1, n2).unwrap();
brain.bind_neurons(n2, n3).unwrap();
assert!(brain.bind_neurons(n3, n1).is_err());
brain.sensor_trigger_impulse(s1, 10.0).unwrap();
for _ in 0..4 {
brain.process(1.0).unwrap();
}
assert!(brain.effector_potential_release(e1).unwrap() > 0.0);
}
#[test]
fn test_brain_builder() {
let _brain = BrainBuilder::new()
.config(Config::default())
.neurons(1000)
.connections(1000)
.min_neurogenesis_range(0.1)
.max_neurogenesis_range(10.0)
.radius(20.0)
.sensors(10)
.effectors(10)
.build();
// println!("brain: {:#?}", brain);
// println!("neurons: {}", brain.get_neurons().len());
// println!("synapses: {}", brain.synapses_count());
// println!("sensors: {}", brain.get_sensors().len());
// println!("effectors: {}", brain.get_effectors().len());
// println!("brain energy: {}", brain.energy());
// println!("brain activity: {:#?}", brain.build_activity_map());
}
#[test]
fn test_offspring_builder() {
let brain_a = BrainBuilder::new()
.config(Config::default())
.neurons(1000)
.connections(1000)
.min_neurogenesis_range(0.1)
.max_neurogenesis_range(10.0)
.radius(20.0)
.sensors(10)
.effectors(10)
.build();
let brain_b = BrainBuilder::new()
.config(Config::default())
.neurons(1000)
.connections(1000)
.min_neurogenesis_range(0.1)
.max_neurogenesis_range(10.0)
.radius(20.0)
.sensors(10)
.effectors(10)
.build();
let _brain = OffspringBuilder::new()
.new_neurons(200)
.new_connections(1000)
.min_neurogenesis_range(0.1)
.max_neurogenesis_range(10.0)
.radius(20.0)
.new_sensors(0)
.new_effectors(0)
.build_merged(&brain_a, &brain_b);
// println!(
// "neurons: {} x {} = {}",
// brain_a.get_neurons().len(),
// brain_b.get_neurons().len(),
// brain.get_neurons().len()
// );
// println!(
// "synapses: {} x {} = {}",
// brain_a.synapses_count(),
// brain_b.synapses_count(),
// brain.synapses_count()
// );
// println!(
// "sensors: {} x {} = {}",
// brain_a.get_sensors().len(),
// brain_b.get_sensors().len(),
// brain.get_sensors().len()
// );
// println!(
// "effectors: {} x {} = {}",
// brain_a.get_effectors().len(),
// brain_b.get_effectors().len(),
// brain.get_effectors().len()
// );
}