use crate::types::*;
use async_trait::async_trait;
#[async_trait]
pub trait SubstrateBackend: Send + Sync {
type Error: std::error::Error + Send + Sync + 'static;
async fn similarity_search(
&self,
query: &[f32],
k: usize,
filter: Option<&Filter>,
) -> Result<Vec<SearchResult>, Self::Error>;
async fn manifold_deform(
&self,
pattern: &Pattern,
learning_rate: f32,
) -> Result<ManifoldDelta, Self::Error>;
async fn hyperedge_query(
&self,
query: &TopologicalQuery,
) -> Result<HyperedgeResult, Self::Error>;
}
#[async_trait]
pub trait TemporalContext: Send + Sync {
fn now(&self) -> SubstrateTime;
async fn causal_query(
&self,
query: &Query,
cone: &CausalCone,
) -> Result<Vec<CausalResult>, Error>;
async fn anticipate(&self, hints: &[AnticipationHint]) -> Result<(), Error>;
}
#[async_trait]
pub trait PimBackend: SubstrateBackend {
async fn execute_in_memory(&self, op: &MemoryOperation) -> Result<(), Error>;
fn data_location(&self, pattern_id: PatternId) -> MemoryBank;
}
#[async_trait]
pub trait NeuromorphicBackend: SubstrateBackend {
fn encode_spikes(&self, vector: &[f32]) -> SpikeTrain;
fn decode_spikes(&self, spikes: &SpikeTrain) -> Vec<f32>;
async fn submit_spike_compute(&self, input: SpikeTrain) -> Result<SpikeTrain, Error>;
}
#[async_trait]
pub trait PhotonicBackend: SubstrateBackend {
async fn optical_matmul(&self, matrix: &OpticalMatrix, vector: &[f32]) -> Vec<f32>;
async fn configure_mzi(&self, config: &MziConfig) -> Result<(), Error>;
}
#[derive(Clone, Debug)]
pub struct MemoryOperation {
pub operation_type: String,
pub data: Vec<u8>,
}
#[derive(Clone, Debug, Copy, PartialEq, Eq, Hash)]
pub struct MemoryBank(pub u32);
#[derive(Clone, Debug)]
pub struct SpikeTrain {
pub timestamps: Vec<f64>,
pub neuron_ids: Vec<u32>,
}
#[derive(Clone, Debug)]
pub struct OpticalMatrix {
pub dimensions: (usize, usize),
pub phase_shifts: Vec<f32>,
}
#[derive(Clone, Debug)]
pub struct MziConfig {
pub phase: f32,
pub attenuation: f32,
}