use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[schema(example = json!({
"category": "IPU",
"data_type": "CartesianPlane",
"frame_handling": "Absolute",
"encoding_details": {
"positioning": "Linear",
"signed": false
}
}))]
pub struct CorticalTypeInfo {
pub category: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frame_handling: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encoding_details: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[schema(example = json!({
"cortical_id": "v1",
"cortical_name": "Primary Visual Cortex",
"cortical_group": "vision",
"coordinates_3d": {
"x": 0,
"y": 0,
"z": 0
},
"cortical_dimensions": {
"x": 10,
"y": 10,
"z": 10
},
"neuron_count": 1000,
"cortical_visibility": true,
"cortical_type_info": {
"category": "IPU",
"data_type": "CartesianPlane",
"frame_handling": "Absolute"
}
}))]
pub struct CorticalAreaSummary {
pub cortical_id: String,
pub cortical_name: String,
pub cortical_group: String,
pub coordinates_3d: Coordinates3D,
pub cortical_dimensions: Dimensions3D,
pub neuron_count: usize,
pub cortical_visibility: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub cortical_type_info: Option<CorticalTypeInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[schema(example = json!({
"cortical_id": "v1",
"cortical_name": "Primary Visual Cortex",
"cortical_group": "vision",
"coordinates_3d": {
"x": 0,
"y": 0,
"z": 0
},
"cortical_dimensions": {
"x": 10,
"y": 10,
"z": 10
},
"neuron_count": 1000,
"synapse_count": 5000,
"incoming_synapse_count": 2500,
"outgoing_synapse_count": 2500,
"cortical_visibility": true,
"cortical_sub_group_name": "visual_input",
"cortical_neuron_per_vox_count": 1,
"postsynaptic_current": 1.0,
"plasticity_constant": 0.5,
"degeneration": 0.0,
"psp_uniform_distribution": false,
"firing_threshold_increment": 0.1,
"firing_threshold_limit": 10.0,
"consecutive_fire_count": 3,
"snooze_period": 5,
"refractory_period": 2,
"leak_coefficient": 0.01,
"leak_variability": 0.0,
"burst_engine_activation": true
}))]
pub struct CorticalAreaDetail {
pub cortical_id: String,
pub cortical_name: String,
pub cortical_group: String,
pub coordinates_3d: Coordinates3D,
pub cortical_dimensions: Dimensions3D,
pub neuron_count: usize,
pub synapse_count: usize,
pub incoming_synapse_count: usize,
pub outgoing_synapse_count: usize,
pub cortical_visibility: bool,
pub cortical_sub_group_name: String,
pub cortical_neuron_per_vox_count: u32,
pub postsynaptic_current: f64,
pub plasticity_constant: f64,
pub degeneration: f64,
pub psp_uniform_distribution: bool,
pub firing_threshold_increment: f64,
pub firing_threshold_limit: f64,
pub consecutive_fire_count: u32,
pub snooze_period: u32,
pub refractory_period: u32,
pub leak_coefficient: f64,
pub leak_variability: f64,
pub burst_engine_activation: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub cortical_type_info: Option<CorticalTypeInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateCorticalAreaRequest {
pub cortical_id: String,
pub cortical_name: String,
pub cortical_group: String,
pub coordinates_3d: Coordinates3D,
pub cortical_dimensions: Dimensions3D,
#[serde(default = "default_visibility")]
pub cortical_visibility: bool,
#[serde(default)]
pub cortical_sub_group_name: Option<String>,
#[serde(default = "default_neurons_per_vox")]
pub cortical_neuron_per_vox_count: u32,
#[serde(default = "default_postsynaptic_current")]
pub postsynaptic_current: f64,
#[serde(default = "default_plasticity_constant")]
pub plasticity_constant: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UpdateCorticalAreaRequest {
pub cortical_name: Option<String>,
pub cortical_group: Option<String>,
pub coordinates_3d: Option<Coordinates3D>,
pub cortical_dimensions: Option<Dimensions3D>,
pub cortical_visibility: Option<bool>,
pub postsynaptic_current: Option<f64>,
pub plasticity_constant: Option<f64>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)]
pub struct Coordinates3D {
pub x: i32,
pub y: i32,
pub z: i32,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)]
pub struct Dimensions3D {
pub x: u32,
pub y: u32,
pub z: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CorticalAreaListResponse {
pub cortical_areas: Vec<CorticalAreaSummary>,
pub total_count: usize,
}
fn default_visibility() -> bool {
true
}
fn default_neurons_per_vox() -> u32 {
1
}
fn default_postsynaptic_current() -> f64 {
1.0
}
fn default_plasticity_constant() -> f64 {
0.5
}