| Crates.io | minuet |
| lib.rs | minuet |
| version | 0.2.0 |
| created_at | 2025-12-23 18:26:51.360131+00 |
| updated_at | 2025-12-30 03:51:30.669069+00 |
| description | Extended memory systems built on amari-holographic |
| homepage | |
| repository | https://github.com/industrial-algebra/minuet |
| max_upload_size | |
| id | 2002111 |
| size | 337,764 |
"The optical table for holographic computing."
Minuet is a Rust toolkit for building holographic memory systems, extending amari-holographic with higher-level abstractions for cognitive memory architectures.
Named after Star Trek's first sentient hologram, Minuet provides memory that participates in cognition rather than merely serving it.
See the CHANGELOG for full details.
Holographic memory stores information in superposition using high-dimensional algebraic representations. Unlike traditional key-value stores:
Add to your Cargo.toml:
[dependencies]
minuet = "0.2"
amari-holographic = "0.15"
use minuet::prelude::*;
// Choose an algebra - ProductCliffordAlgebra<K> has 8*K dimensions
type Algebra = ProductCliffordAlgebra<64>; // 512 dimensions, ~85 item capacity
fn main() -> MinuetResult<()> {
// Create a simple memory (combines store + codebook)
let memory = SimpleMemory::<Algebra>::new();
// Store associations between symbols
memory.store_symbols("paris", "france")?;
memory.store_symbols("berlin", "germany")?;
memory.store_symbols("rome", "italy")?;
// Recall: given a key, find the associated value
if let Some((value, confidence)) = memory.recall("paris")? {
println!("paris -> {} (confidence: {:.2})", value, confidence);
}
// Direct algebra operations
let dog = memory.symbol("dog");
let bark = memory.symbol("bark");
memory.store(&dog, &bark)?;
Ok(())
}
For more control, compose custom pipelines:
use minuet::prelude::*;
use minuet::capacity::RejectPolicy;
type Algebra = ProductCliffordAlgebra<32>; // 256 dimensions
fn main() -> MinuetResult<()> {
// Build a custom pipeline
let pipeline = PipelineBuilder::<Algebra>::new()
.with_store(ShardedStore::with_shards(4)) // 4 shards for ~4x capacity
.with_retriever(ResonatorRetriever::new()) // Cleanup via resonator network
.with_codebook(HashMapCodebook::new()) // Symbol vocabulary
.with_capacity_policy(RejectPolicy::with_threshold(0.9))
.build()?;
// Use the pipeline
let key = pipeline.symbol("query");
let value = pipeline.symbol("result");
pipeline.store(&key, &value)?;
let result = pipeline.retrieve(&key)?;
println!("Retrieved with confidence: {:.2}", result.confidence);
Ok(())
}
For optical holographic computing systems:
use minuet::optical::{
CheckpointConfig, CheckpointedOpticalMemory,
MockOpticalHardware, SymbolicExpression,
};
use std::path::PathBuf;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create optical memory with mock hardware
let hardware = MockOpticalHardware::new(42);
let config = CheckpointConfig {
journal_path: PathBuf::from("/tmp/memory.bin"),
interval: Duration::from_secs(300),
..Default::default()
};
let mut memory = CheckpointedOpticalMemory::new(
hardware, encoder_config, codebook_config, config,
)?;
// Store using symbolic expressions
memory.store(
SymbolicExpression::role_filler("AGENT", "John"),
SymbolicExpression::role_filler("ACTION", "run"),
)?;
// Retrieve
if let Some(result) = memory.retrieve(
&SymbolicExpression::role_filler("AGENT", "John")
)? {
println!("John's action: {:?}", result.value);
}
// Checkpoint (saves to journal)
memory.checkpoint()?;
// Restore on any hardware (same or different)
let new_hardware = MockOpticalHardware::new(999);
let restored = CheckpointedOpticalMemory::restore(new_hardware, config)?;
Ok(())
}
Minuet is generic over any BindingAlgebra from amari-holographic. The algebra provides:
| Operation | Symbol | Description |
|---|---|---|
| Bind | a.bind(&b) |
Create association (dissimilar to inputs) |
| Bundle | a.bundle(&b, β) |
Superpose (similar to inputs) |
| Unbind | key.unbind(&trace) |
Retrieve associated value |
| Similarity | a.similarity(&b) |
Measure closeness [-1, 1] |
Available algebras:
| Type | Dimensions | Use Case |
|---|---|---|
ProductCliffordAlgebra<K> |
8×K | General purpose, recommended |
Cl3 |
8 | Small/embedded systems |
FHRRAlgebra<D> |
D | Frequency domain operations |
MAPAlgebra<D> |
D | Binary/bipolar systems |
A trace stores items in superposition:
use minuet::store::DenseTrace;
let mut trace = DenseTrace::<Algebra>::new();
// Add items (they superpose)
trace.add(&item1, 1.0); // weight = 1.0
trace.add(&item2, 1.0);
// Query similarity
let sim = trace.similarity(&item1); // High similarity
// Unbind to retrieve
let retrieved = trace.unbind(&key);
Stores manage one or more traces:
| Store | Description |
|---|---|
SimpleStore |
Single trace, minimal overhead |
ShardedStore |
Hash-sharded across N traces for N× capacity |
// Simple store for small workloads
let simple = SimpleStore::<Algebra>::new();
// Sharded store for larger capacity
let sharded = ShardedStore::<Algebra>::with_shards(8);
Codebooks provide consistent symbol-to-vector mappings:
use minuet::encoding::HashMapCodebook;
let codebook = HashMapCodebook::<Algebra>::new();
// Same name always returns same vector
let v1 = codebook.symbol("hello");
let v2 = codebook.symbol("hello");
assert!(v1.similarity(&v2) > 0.99);
// Find closest symbol to a vector
if let Some((name, similarity)) = codebook.closest(&query) {
println!("Closest: {} ({:.2})", name, similarity);
}
Retrievers clean up noisy retrieval results:
| Retriever | Description |
|---|---|
DirectRetriever |
Return raw result (no cleanup) |
ResonatorRetriever |
Iterative cleanup via resonator network |
use minuet::retrieval::ResonatorRetriever;
// Resonator with custom settings
let retriever = ResonatorRetriever::<Algebra>::new()
.initial_temperature(1.0) // Start soft
.final_temperature(100.0) // End hard
.max_iterations(50);
Holographic memory has finite capacity based on dimensions:
| Algebra | Dimensions | Approximate Capacity |
|---|---|---|
ProductCliffordAlgebra<16> |
128 | ~23 items |
ProductCliffordAlgebra<32> |
256 | ~46 items |
ProductCliffordAlgebra<64> |
512 | ~85 items |
ProductCliffordAlgebra<128> |
1024 | ~147 items |
Capacity scales as O(D / ln D) where D is dimension.
For larger workloads, use ShardedStore:
// 8 shards × 85 items ≈ 680 item capacity
let store = ShardedStore::<ProductCliffordAlgebra<64>>::with_shards(8);
The optical module provides hardware abstraction for optical holographic computing:
┌─────────────────────────────────────────────────────────┐
│ CheckpointedOpticalMemory │
│ • store() / retrieve() - optical hot paths │
│ • checkpoint() - periodic persistence │
│ • restore() - hardware-independent recovery │
├─────────────────────────────────────────────────────────┤
│ MemoryJournal TMatrixFingerprint OpticalHardware │
│ (portable) (validation) (backend) │
└─────────────────────────────────────────────────────────┘
Key Concepts:
Persistence Model:
| Layer | Content | Portability |
|---|---|---|
| Semantic | Associations, relationships | Fully portable |
| Codebook | Symbol → seed mappings | Regenerable |
| Holograms | Binary patterns | Derived on demand |
| Calibration | T-matrix, learned patterns | Hardware-bound |
minuet/
├── src/
│ ├── lib.rs # Re-exports and prelude
│ ├── traits.rs # Core trait definitions
│ ├── error.rs # Error types
│ ├── store/ # Memory storage
│ │ ├── trace.rs # DenseTrace - fundamental storage unit
│ │ ├── simple.rs # SimpleStore - single-trace store
│ │ └── sharded.rs # ShardedStore - hash-sharded store
│ ├── encoding/ # Symbol encoding
│ │ └── codebook.rs # HashMapCodebook
│ ├── retrieval/ # Cleanup strategies
│ │ ├── direct.rs # DirectRetriever
│ │ └── resonator_retriever.rs
│ ├── capacity/ # Capacity management
│ │ └── mod.rs # RejectPolicy, AcceptAllPolicy
│ ├── pipeline/ # Composition
│ │ └── builder.rs # PipelineBuilder
│ ├── reference/ # Reference implementations
│ │ └── simple_memory.rs # SimpleMemory
│ └── optical/ # Optical backend (feature-gated)
│ ├── mod.rs # Module exports
│ ├── symbolic.rs # SymbolicExpression types
│ ├── journal.rs # MemoryJournal, MemoryOp
│ ├── fingerprint.rs # TMatrixFingerprint
│ ├── hardware.rs # OpticalHardware trait
│ ├── mock_hardware.rs # MockOpticalHardware
│ └── checkpoint.rs # CheckpointedOpticalMemory
├── docs/
│ └── API.md # Complete API reference
├── examples/
│ ├── simple_memory.rs # Basic usage
│ ├── compose_pipeline.rs # Pipeline composition
│ ├── optical_memory_demo.rs # Optical backend demo
│ ├── optical_fingerprint_demo.rs # T-matrix fingerprinting
│ └── optical_expressions_demo.rs # Symbolic expressions
└── tests/
# Simple memory operations
cargo run --example simple_memory
# Pipeline composition with sharding
cargo run --example compose_pipeline
optical feature)# Full optical memory demo with checkpoint/restore
cargo run --example optical_memory_demo --features optical
# T-matrix fingerprinting for hardware validation
cargo run --example optical_fingerprint_demo --features optical
# Symbolic expressions (symbols, bindings, bundles)
cargo run --example optical_expressions_demo --features optical
[dependencies]
minuet = { version = "0.2", features = ["optical"] }
| Feature | Description | Dependencies |
|---|---|---|
default |
Standard features | std |
std |
Standard library support | - |
parallel |
Rayon parallelism | rayon |
serde |
Serialization | serde, bincode |
persistence |
RocksDB storage | rocksdb, serde |
async |
Async support | tokio |
optical |
Optical backend | serde, ordered-float, rand |
full |
All features | all above |
The underlying BindingAlgebra satisfies:
x.bind(&A::identity()) = xx.bind(&x.inverse()?) ≈ A::identity()a.bind(&b) is dissimilar to both a and ba.bundle(&b, β)? is similar to both a and ba.bind(&b.bundle(&c, β)?) ≈ a.bind(&b).bundle(&a.bind(&c), β)?ShardedStore when single-trace capacity is insufficientDirectRetriever is fastest; ResonatorRetriever improves accuracy| Domain | Application |
|---|---|
| Cognitive Agents | Working memory with associative recall |
| Knowledge Graphs | Relationship storage and analogical queries |
| Semantic Search | Content-addressable retrieval |
| Neurosymbolic AI | Symbol grounding with compositional generalization |
| Robotics | Motor primitive composition |
| Optical Computing | DMD/MMF-based memory systems |
Minuet excels at small-to-medium associative memories where algebraic structure matters.
# Run all tests
cargo test
# Run with all features
cargo test --all-features
# Run optical tests
cargo test --features optical
# Run examples
cargo run --example simple_memory
cargo run --example optical_memory_demo --features optical
Rust nightly is required. This enables compatibility with amari-gpu for future GPU-accelerated implementations.
MIT OR Apache-2.0
Contributions welcome! Please see the GitHub repository for issues and pull requests.