use crate::codebook::Codebook;
use crate::hyper::Hyper;
#[derive(Clone)]
pub struct HoloSequence {
codebook: Codebook,
memory: Hyper,
len: usize,
}
impl HoloSequence {
pub fn new(dim: usize, alphabet: usize, seed: u64) -> Self {
let codebook = Codebook::new(dim, alphabet, seed);
let memory = Hyper::zeros(dim);
HoloSequence {
codebook,
memory,
len: 0,
}
}
#[inline]
pub fn dim(&self) -> usize {
self.codebook.dim()
}
#[inline]
pub fn len(&self) -> usize {
self.len
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len == 0
}
#[inline]
pub fn memory(&self) -> &Hyper {
&self.memory
}
pub fn push(&mut self, id: usize) {
let positioned = self.codebook.atom(id).permute(self.len);
self.memory.bundle_into(&positioned);
self.len += 1;
}
fn probe(&self, pos: usize) -> Hyper {
self.memory.inverse_permute(pos)
}
pub fn get(&self, pos: usize) -> (usize, f32) {
self.codebook.cleanup(&self.probe(pos))
}
pub fn decode(&self) -> Vec<usize> {
let probes: Vec<Hyper> = (0..self.len).map(|p| self.probe(p)).collect();
self.codebook
.cleanup_batch(&probes)
.into_iter()
.map(|(id, _)| id)
.collect()
}
}
impl core::fmt::Debug for HoloSequence {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"HoloSequence {{ dim: {}, len: {} }}",
self.dim(),
self.len
)
}
}