use crate::embedding::NeuralEmbedding;
use crate::error::Result;
use crate::graph::BrainGraph;
use crate::rvf::RvfFile;
use crate::sensor::SensorType;
use crate::signal::MultiChannelTimeSeries;
use crate::topology::{CognitiveState, MincutResult, TopologyMetrics};
pub trait SensorSource {
fn sensor_type(&self) -> SensorType;
fn num_channels(&self) -> usize;
fn sample_rate_hz(&self) -> f64;
fn read_chunk(&mut self, num_samples: usize) -> Result<MultiChannelTimeSeries>;
}
pub trait SignalProcessor {
fn process(&self, input: &MultiChannelTimeSeries) -> Result<MultiChannelTimeSeries>;
}
pub trait GraphConstructor {
fn construct(&self, signals: &MultiChannelTimeSeries) -> Result<BrainGraph>;
}
pub trait TopologyAnalyzer {
fn analyze(&self, graph: &BrainGraph) -> Result<TopologyMetrics>;
fn mincut(&self, graph: &BrainGraph) -> Result<MincutResult>;
}
pub trait EmbeddingGenerator {
fn embed(&self, graph: &BrainGraph) -> Result<NeuralEmbedding>;
fn embedding_dim(&self) -> usize;
}
pub trait StateDecoder {
fn decode(&self, embedding: &NeuralEmbedding) -> Result<CognitiveState>;
fn decode_with_confidence(
&self,
embedding: &NeuralEmbedding,
) -> Result<(CognitiveState, f64)>;
}
pub trait NeuralMemory {
fn store(&mut self, embedding: &NeuralEmbedding) -> Result<()>;
fn query_nearest(
&self,
embedding: &NeuralEmbedding,
k: usize,
) -> Result<Vec<NeuralEmbedding>>;
fn query_by_state(&self, state: CognitiveState) -> Result<Vec<NeuralEmbedding>>;
}
pub trait RvfSerializable {
fn to_rvf(&self) -> Result<RvfFile>;
fn from_rvf(file: &RvfFile) -> Result<Self>
where
Self: Sized;
}