1use serde::{Deserialize, Serialize};
9use utoipa::ToSchema;
10
11#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
16#[schema(example = json!({
17 "category": "IPU",
18 "data_type": "CartesianPlane",
19 "frame_handling": "Absolute",
20 "encoding_details": {
21 "positioning": "Linear",
22 "signed": false
23 }
24}))]
25pub struct CorticalTypeInfo {
26 pub category: String,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub data_type: Option<String>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub frame_handling: Option<String>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub encoding_details: Option<serde_json::Value>,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
44#[schema(example = json!({
45 "cortical_id": "v1",
46 "cortical_name": "Primary Visual Cortex",
47 "cortical_group": "vision",
48 "coordinates_3d": {
49 "x": 0,
50 "y": 0,
51 "z": 0
52 },
53 "cortical_dimensions": {
54 "x": 10,
55 "y": 10,
56 "z": 10
57 },
58 "neuron_count": 1000,
59 "cortical_visibility": true,
60 "cortical_type_info": {
61 "category": "IPU",
62 "data_type": "CartesianPlane",
63 "frame_handling": "Absolute"
64 }
65}))]
66pub struct CorticalAreaSummary {
67 pub cortical_id: String,
69
70 pub cortical_name: String,
72
73 pub cortical_group: String,
75
76 pub coordinates_3d: Coordinates3D,
78
79 pub cortical_dimensions: Dimensions3D,
81
82 pub neuron_count: usize,
84
85 pub cortical_visibility: bool,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub cortical_type_info: Option<CorticalTypeInfo>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
95#[schema(example = json!({
96 "cortical_id": "v1",
97 "cortical_name": "Primary Visual Cortex",
98 "cortical_group": "vision",
99 "coordinates_3d": {
100 "x": 0,
101 "y": 0,
102 "z": 0
103 },
104 "cortical_dimensions": {
105 "x": 10,
106 "y": 10,
107 "z": 10
108 },
109 "neuron_count": 1000,
110 "synapse_count": 5000,
111 "incoming_synapse_count": 2500,
112 "outgoing_synapse_count": 2500,
113 "cortical_visibility": true,
114 "cortical_sub_group_name": "visual_input",
115 "cortical_neuron_per_vox_count": 1,
116 "postsynaptic_current": 1.0,
117 "plasticity_constant": 0.5,
118 "degeneration": 0.0,
119 "psp_uniform_distribution": false,
120 "firing_threshold_increment": 0.1,
121 "firing_threshold_limit": 10.0,
122 "consecutive_fire_count": 3,
123 "snooze_period": 5,
124 "refractory_period": 2,
125 "leak_coefficient": 0.01,
126 "leak_variability": 0.0,
127 "burst_engine_activation": true
128}))]
129pub struct CorticalAreaDetail {
130 pub cortical_id: String,
132
133 pub cortical_name: String,
135
136 pub cortical_group: String,
138
139 pub coordinates_3d: Coordinates3D,
141
142 pub cortical_dimensions: Dimensions3D,
144
145 pub neuron_count: usize,
147
148 pub synapse_count: usize,
150
151 pub incoming_synapse_count: usize,
153
154 pub outgoing_synapse_count: usize,
156
157 pub cortical_visibility: bool,
159
160 pub cortical_sub_group_name: String,
162
163 pub cortical_neuron_per_vox_count: u32,
165
166 pub postsynaptic_current: f64,
168
169 pub plasticity_constant: f64,
171
172 pub degeneration: f64,
174
175 pub psp_uniform_distribution: bool,
177
178 pub firing_threshold_increment: f64,
180
181 pub firing_threshold_limit: f64,
183
184 pub consecutive_fire_count: u32,
186
187 pub snooze_period: u32,
189
190 pub refractory_period: u32,
192
193 pub leak_coefficient: f64,
195
196 pub leak_variability: f64,
198
199 pub burst_engine_activation: bool,
201
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub cortical_type_info: Option<CorticalTypeInfo>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
209pub struct CreateCorticalAreaRequest {
210 pub cortical_id: String,
212
213 pub cortical_name: String,
215
216 pub cortical_group: String,
218
219 pub coordinates_3d: Coordinates3D,
221
222 pub cortical_dimensions: Dimensions3D,
224
225 #[serde(default = "default_visibility")]
227 pub cortical_visibility: bool,
228
229 #[serde(default)]
231 pub cortical_sub_group_name: Option<String>,
232
233 #[serde(default = "default_neurons_per_vox")]
235 pub cortical_neuron_per_vox_count: u32,
236
237 #[serde(default = "default_postsynaptic_current")]
239 pub postsynaptic_current: f64,
240
241 #[serde(default = "default_plasticity_constant")]
243 pub plasticity_constant: f64,
244}
245
246#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
248pub struct UpdateCorticalAreaRequest {
249 pub cortical_name: Option<String>,
251
252 pub cortical_group: Option<String>,
254
255 pub coordinates_3d: Option<Coordinates3D>,
257
258 pub cortical_dimensions: Option<Dimensions3D>,
260
261 pub cortical_visibility: Option<bool>,
263
264 pub postsynaptic_current: Option<f64>,
266
267 pub plasticity_constant: Option<f64>,
269}
270
271#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)]
273pub struct Coordinates3D {
274 pub x: i32,
275 pub y: i32,
276 pub z: i32,
277}
278
279#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)]
281pub struct Dimensions3D {
282 pub x: u32,
283 pub y: u32,
284 pub z: u32,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
289pub struct CorticalAreaListResponse {
290 pub cortical_areas: Vec<CorticalAreaSummary>,
292
293 pub total_count: usize,
295}
296
297fn default_visibility() -> bool {
299 true
300}
301
302fn default_neurons_per_vox() -> u32 {
303 1
304}
305
306fn default_postsynaptic_current() -> f64 {
307 1.0
308}
309
310fn default_plasticity_constant() -> f64 {
311 0.5
312}