Skip to main content

holographic_memory/core/engine/
knowledge.rs

1// Copyright 2024-2026 WritersLogic Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4use super::HmsCore;
5use crate::core::entangled::EntangledHVec;
6use crate::core::types::RetrievalResult;
7use anyhow::Result;
8
9impl HmsCore {
10    /// Encode a (head, relation, tail) triplet as `h XOR r XOR t` and memorize it.
11    pub fn memorize_triplet(&self, id: String, h: String, r: String, t: String) -> Result<()> {
12        let vec_h = self.encode_text(&h);
13        let vec_r = self.encode_text(&r);
14        let vec_t = self.encode_text(&t);
15        let triplet = vec_h.bind(&vec_r).bind(&vec_t);
16        self.memorize(id, triplet)
17    }
18
19    /// Encode an ordered sequence using position-based permutation and memorize it.
20    pub fn memorize_sequence(&self, id: String, sequence: &[String]) -> Result<()> {
21        if sequence.is_empty() {
22            return Ok(());
23        }
24        let mut vecs = Vec::new();
25        for (i, item) in sequence.iter().enumerate() {
26            let v = self.encode_text(item).permute(i);
27            vecs.push(v);
28        }
29        let trajectory = self.bundle(&vecs);
30        self.memorize(id, trajectory)
31    }
32
33    /// Query for tails matching `head XOR relation`.
34    pub fn query_triplet(&self, h: String, r: String, k: u32) -> Result<Vec<RetrievalResult>> {
35        let vec_h = self.encode_text(&h);
36        let vec_r = self.encode_text(&r);
37        let query_vec = vec_h.bind(&vec_r);
38        Ok(self.query(&query_vec, k))
39    }
40
41    /// Find analogy: A is to B as C is to ? Returns k closest matches.
42    pub fn find_analogy(&self, a: &str, b: &str, c: &str, k: u32) -> Vec<RetrievalResult> {
43        let vec_a = self.encode_text(a);
44        let vec_b = self.encode_text(b);
45        let vec_c = self.encode_text(c);
46        let target = vec_a.bind(&vec_b).bind(&vec_c);
47        self.query(&target, k)
48    }
49
50    /// Query for sequences matching a partial sequence prefix.
51    pub fn query_sequence(&self, partial: &[String], k: u32) -> Result<Vec<RetrievalResult>> {
52        if partial.is_empty() {
53            return Ok(vec![]);
54        }
55        let vecs: Vec<EntangledHVec> = partial
56            .iter()
57            .enumerate()
58            .map(|(i, item)| self.encode_text(item).permute(i))
59            .collect();
60        let query_vec = self.bundle(&vecs);
61        Ok(self.query(&query_vec, k))
62    }
63}