1use crate::Scalar;
2use serde::{Deserialize, Serialize};
3use std::ops::Range;
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6#[repr(C)]
7pub struct Config {
8 pub propagation_speed: Scalar,
9 pub neuron_potential_decay: Scalar,
10 pub action_potential_treshold: Scalar,
11 pub receptors_excitation: Scalar,
12 pub receptors_inhibition: Scalar,
13 pub default_receptors: Range<Scalar>,
14 pub synapse_inactivity_time: Scalar,
15 pub synapse_reconnection_range: Option<Scalar>,
16 pub synapse_overdose_receptors: Option<Scalar>,
17 pub synapse_propagation_decay: Scalar,
18 pub synapse_new_connection_receptors: Option<Scalar>,
19}
20
21impl Default for Config {
22 fn default() -> Self {
23 Self {
24 propagation_speed: 1.0,
25 neuron_potential_decay: 1.0,
26 action_potential_treshold: 1.0,
27 receptors_excitation: 1.0,
28 receptors_inhibition: 0.05,
29 default_receptors: 0.5..1.5,
30 synapse_inactivity_time: 0.05,
31 synapse_reconnection_range: None,
32 synapse_overdose_receptors: None,
33 synapse_propagation_decay: 0.0,
34 synapse_new_connection_receptors: None,
35 }
36 }
37}
38
39impl Config {
40 pub fn merge(&self, other: &Self) -> Self {
41 Self {
42 propagation_speed: merge_scalar(self.propagation_speed, other.propagation_speed),
43 neuron_potential_decay: merge_scalar(
44 self.neuron_potential_decay,
45 other.neuron_potential_decay,
46 ),
47 action_potential_treshold: merge_scalar(
48 self.action_potential_treshold,
49 other.action_potential_treshold,
50 ),
51 receptors_excitation: merge_scalar(
52 self.receptors_excitation,
53 other.receptors_excitation,
54 ),
55 receptors_inhibition: merge_scalar(
56 self.receptors_inhibition,
57 other.receptors_inhibition,
58 ),
59 default_receptors: Range {
60 start: merge_scalar(self.default_receptors.start, other.default_receptors.start),
61 end: merge_scalar(self.default_receptors.end, other.default_receptors.end),
62 },
63 synapse_inactivity_time: merge_scalar(
64 self.synapse_inactivity_time,
65 other.synapse_inactivity_time,
66 ),
67 synapse_reconnection_range: match (
68 self.synapse_reconnection_range,
69 other.synapse_reconnection_range,
70 ) {
71 (Some(a), Some(b)) => Some(merge_scalar(a, b)),
72 (Some(a), None) => Some(a),
73 (None, Some(b)) => Some(b),
74 _ => None,
75 },
76 synapse_overdose_receptors: match (
77 self.synapse_overdose_receptors,
78 other.synapse_overdose_receptors,
79 ) {
80 (Some(a), Some(b)) => Some(merge_scalar(a, b)),
81 (Some(a), None) => Some(a),
82 (None, Some(b)) => Some(b),
83 _ => None,
84 },
85 synapse_propagation_decay: merge_scalar(
86 self.synapse_propagation_decay,
87 other.synapse_propagation_decay,
88 ),
89 synapse_new_connection_receptors: match (
90 self.synapse_new_connection_receptors,
91 other.synapse_new_connection_receptors,
92 ) {
93 (Some(a), Some(b)) => Some(merge_scalar(a, b)),
94 (Some(a), None) => Some(a),
95 (None, Some(b)) => Some(b),
96 _ => None,
97 },
98 }
99 }
100}
101
102fn merge_scalar(a: Scalar, b: Scalar) -> Scalar {
103 (a + b) * 0.5
104}