use crate::ids::{
CausalKey, EmotionKey, EntityKey, EventKey, GoalKey, MemoryId, TemporalKey, TopicKey, VectorId,
};
use crate::model::unit::TextSpan;
use crate::score::UnitScore;
use crate::time::Timestamp;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AssociationKeys {
pub entity_keys: Vec<EntityKey>,
pub temporal_keys: Vec<TemporalKey>,
pub lexical_signature: LexicalSignature,
pub semantic_signature: SemanticSignature,
pub topic_keys: Vec<TopicKey>,
pub emotion_keys: Vec<EmotionKey>,
pub goal_keys: Vec<GoalKey>,
pub event_keys: Vec<EventKey>,
pub causal_keys: Vec<CausalKey>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LexicalSignature {
pub simhash: [u64; 4],
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SemanticSignature {
pub lexical_simhash: [u64; 4],
pub dense_embedding_ref: Option<VectorId>,
pub binary_code: [u64; 2],
pub topic_minhash: [u32; 16],
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AssociationLink {
pub target_id: MemoryId,
pub link_type: LinkType,
pub direction: LinkDirection,
pub strength: UnitScore,
pub confidence: UnitScore,
pub evidence: LinkEvidence,
pub formed_at: Timestamp,
pub last_activated_at: Option<Timestamp>,
pub activation_count: u32,
pub observation: ObservationState,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum LinkType {
EntityOverlap,
TemporalAdjacent,
SemanticSimilar,
TopicRelated,
SameGoal,
SameEvent,
Causal,
EmotionalResonance,
Contradiction,
Correction,
Elaboration,
CoActivation,
Supersedes,
Deprecated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum LinkDirection {
Undirected,
Forward,
Backward,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LinkEvidence {
pub contributing_dimensions: Vec<MatchDimension>,
pub score_breakdown: Vec<(MatchDimension, f32)>,
pub text_spans: Vec<TextSpan>,
pub note: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MatchDimension {
Entity,
Semantic,
Temporal,
Topic,
Goal,
Event,
Emotion,
Causal,
CoContext,
Importance,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ObservationState {
Confirmed,
Observing {
since: Timestamp,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ActivationState {
pub last_retrieved_at: Option<Timestamp>,
pub retrieval_count: u32,
pub co_activations: Vec<CoActivationCount>,
pub usage_score: UnitScore,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CoActivationCount {
pub with: MemoryId,
pub count: u32,
pub last_at: Timestamp,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ActivationStep {
pub from: Option<MemoryId>,
pub to: MemoryId,
pub via_link: Option<LinkType>,
pub channel: Option<RecallChannel>,
pub hop: u8,
pub energy_in: f32,
pub energy_out: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum RecallChannel {
Bm25,
EntityInverted,
SemanticDense,
SemanticBinary,
Temporal,
TopicCluster,
Goal,
Event,
Causal,
RecentActivation,
GraphSpreading,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum RetrievalMode {
Fast,
Balanced,
Deep,
Diagnostic,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RetrievalResult {
pub memory: MemoryUnit,
pub final_score: f32,
pub activation_trace: Vec<ActivationStep>,
pub matched_dimensions: Vec<MatchDimension>,
pub warnings: Vec<MemoryWarning>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryWarning {
HasCorrection {
by: MemoryId,
},
HasContradiction {
with: MemoryId,
},
Superseded {
by: MemoryId,
},
Deprecated,
LowConfidence,
StaleFreshness,
}
use crate::model::unit::MemoryUnit;