use crate::types::Position3D;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NeuralSpatialConfig {
pub model_type: NeuralModelType,
pub hidden_dims: Vec<usize>,
pub input_dim: usize,
pub output_channels: usize,
pub sample_rate: u32,
pub buffer_size: usize,
pub use_gpu: bool,
pub quality: f32,
pub realtime_constraints: RealtimeConstraints,
pub training_config: Option<TrainingConfig>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum NeuralModelType {
Feedforward,
Convolutional,
Recurrent,
Transformer,
GAN,
VAE,
Diffusion,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RealtimeConstraints {
pub max_latency_ms: f32,
pub max_cpu_usage: f32,
pub max_memory_mb: usize,
pub target_fps: u32,
pub adaptive_quality: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrainingConfig {
pub learning_rate: f64,
pub batch_size: usize,
pub epochs: usize,
pub validation_split: f32,
pub loss_function: LossFunction,
pub optimizer: OptimizerType,
pub early_stopping_patience: usize,
pub augmentation: AugmentationConfig,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum LossFunction {
MSE,
MAE,
SpectralLoss,
PerceptualLoss,
MultiScaleSpectralLoss,
Combined,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum OptimizerType {
Adam,
SGD,
AdamW,
RMSprop,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AugmentationConfig {
pub noise_injection: bool,
pub time_stretching: bool,
pub pitch_shifting: bool,
pub reverb_augmentation: bool,
pub gain_variation: f32,
}
#[derive(Debug, Clone)]
pub struct NeuralInputFeatures {
pub position: Position3D,
pub listener_orientation: [f32; 4],
pub audio_features: Vec<f32>,
pub room_features: Vec<f32>,
pub hrtf_features: Option<Vec<f32>>,
pub temporal_context: Vec<f32>,
pub user_features: Option<Vec<f32>>,
}
#[derive(Debug, Clone)]
pub struct NeuralSpatialOutput {
pub binaural_audio: Vec<Vec<f32>>,
pub confidence: f32,
pub latency_ms: f32,
pub quality_score: f32,
pub metadata: HashMap<String, f32>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct NeuralPerformanceMetrics {
pub frames_processed: u64,
pub avg_processing_time_ms: f32,
pub peak_processing_time_ms: f32,
pub memory_usage_mb: f32,
pub gpu_utilization: f32,
pub inference_time_ms: f32,
pub quality_degradations: u32,
pub realtime_violations: u32,
pub last_updated: u64,
}
#[derive(Debug, Clone)]
pub struct NeuralTrainingResults {
pub training_loss: Vec<f32>,
pub validation_loss: Vec<f32>,
pub final_accuracy: f32,
pub training_duration_secs: f32,
pub epochs_completed: usize,
pub early_stopped: bool,
}
pub struct NeuralSpatialConfigBuilder {
config: NeuralSpatialConfig,
}
impl Default for NeuralSpatialConfig {
fn default() -> Self {
Self {
model_type: NeuralModelType::Feedforward,
hidden_dims: vec![512, 256, 128],
input_dim: 128,
output_channels: 2,
sample_rate: 48000,
buffer_size: 1024,
use_gpu: true,
quality: 0.8,
realtime_constraints: RealtimeConstraints {
max_latency_ms: 20.0,
max_cpu_usage: 25.0,
max_memory_mb: 512,
target_fps: 60,
adaptive_quality: true,
},
training_config: None,
}
}
}
impl Default for RealtimeConstraints {
fn default() -> Self {
Self {
max_latency_ms: 20.0,
max_cpu_usage: 25.0,
max_memory_mb: 512,
target_fps: 60,
adaptive_quality: true,
}
}
}
impl Default for TrainingConfig {
fn default() -> Self {
Self {
learning_rate: 0.001,
batch_size: 32,
epochs: 100,
validation_split: 0.2,
loss_function: LossFunction::MultiScaleSpectralLoss,
optimizer: OptimizerType::Adam,
early_stopping_patience: 10,
augmentation: AugmentationConfig::default(),
}
}
}
impl Default for AugmentationConfig {
fn default() -> Self {
Self {
noise_injection: true,
time_stretching: true,
pitch_shifting: true,
reverb_augmentation: true,
gain_variation: 0.1,
}
}
}
impl NeuralSpatialConfigBuilder {
pub fn new() -> Self {
Self {
config: NeuralSpatialConfig::default(),
}
}
pub fn model_type(mut self, model_type: NeuralModelType) -> Self {
self.config.model_type = model_type;
self
}
pub fn hidden_dims(mut self, dims: Vec<usize>) -> Self {
self.config.hidden_dims = dims;
self
}
pub fn input_dim(mut self, dim: usize) -> Self {
self.config.input_dim = dim;
self
}
pub fn output_channels(mut self, channels: usize) -> Self {
self.config.output_channels = channels;
self
}
pub fn sample_rate(mut self, rate: u32) -> Self {
self.config.sample_rate = rate;
self
}
pub fn buffer_size(mut self, size: usize) -> Self {
self.config.buffer_size = size;
self
}
pub fn use_gpu(mut self, use_gpu: bool) -> Self {
self.config.use_gpu = use_gpu;
self
}
pub fn quality(mut self, quality: f32) -> Self {
self.config.quality = quality.clamp(0.0, 1.0);
self
}
pub fn max_latency_ms(mut self, latency: f32) -> Self {
self.config.realtime_constraints.max_latency_ms = latency;
self
}
pub fn training_config(mut self, training_config: TrainingConfig) -> Self {
self.config.training_config = Some(training_config);
self
}
pub fn build(self) -> NeuralSpatialConfig {
self.config
}
}
impl Default for NeuralSpatialConfigBuilder {
fn default() -> Self {
Self::new()
}
}