psyche_core/
config.rs

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}