holographic_memory/core/engine/
knowledge.rs1use super::HmsCore;
5use crate::core::entangled::EntangledHVec;
6use crate::core::types::RetrievalResult;
7use anyhow::Result;
8
9impl HmsCore {
10 pub fn memorize_triplet(&self, id: String, h: String, r: String, t: String) -> Result<()> {
12 super::mutation::validate_public_id(&id)?;
13 if !self.meaning_enabled() {
14 let triplet = self
15 .encode_text(&h)
16 .bind(&self.encode_text(&r))
17 .bind(&self.encode_text(&t));
18 return self.memorize(id, triplet);
19 }
20 self.commit(&[super::mutation::Mutation::Triplet {
21 id,
22 subject: h,
23 relation: r,
24 object: t,
25 }])
26 }
27
28 pub fn memorize_sequence(&self, id: String, sequence: &[String]) -> Result<()> {
30 if sequence.is_empty() {
31 return Ok(());
32 }
33 let mut vecs = Vec::new();
34 for (i, item) in sequence.iter().enumerate() {
35 let v = self.encode_text(item).permute(i);
36 vecs.push(v);
37 }
38 let trajectory = self.bundle(&vecs);
39 self.memorize(id, trajectory)
40 }
41
42 pub fn query_triplet(&self, h: String, r: String, k: u32) -> Result<Vec<RetrievalResult>> {
44 let vec_h = self.encode_text(&h);
45 let vec_r = self.encode_text(&r);
46 let query_vec = vec_h.bind(&vec_r);
47 Ok(self.query(&query_vec, k))
48 }
49
50 pub fn find_analogy(&self, a: &str, b: &str, c: &str, k: u32) -> Vec<RetrievalResult> {
52 let vec_a = self.encode_text(a);
53 let vec_b = self.encode_text(b);
54 let vec_c = self.encode_text(c);
55 let target = vec_a.bind(&vec_b).bind(&vec_c);
56 self.query(&target, k)
57 }
58
59 pub fn query_sequence(&self, partial: &[String], k: u32) -> Result<Vec<RetrievalResult>> {
61 if partial.is_empty() {
62 return Ok(vec![]);
63 }
64 let vecs: Vec<EntangledHVec> = partial
65 .iter()
66 .enumerate()
67 .map(|(i, item)| self.encode_text(item).permute(i))
68 .collect();
69 let query_vec = self.bundle(&vecs);
70 Ok(self.query(&query_vec, k))
71 }
72}