Array-Based API: VSA uses numpy arrays directly in its public API, not vector objects. This design choice ensures:
- Consistency with SDM and HRR modules
- Better performance (no object overhead)
- Easier integration with scientific computing libraries
- Direct manipulation of vector data when needed
No Factory Functions for Architectures: Use architecture classes directly:
# Correct
from cognitive_computing.vsa import BSC, MAP, FHRR
bsc = BSC(dimension=1000)
map_arch = MAP(dimension=1000)
# Incorrect (no create_architecture function)
# arch = create_architecture('bsc', dimension=1000) # Does not existVector Generation: Use generate_vector() method or utility functions:
# Generate vectors
vector = vsa.generate_vector()
sparse_vector = vsa.generate_vector(sparse=True)
# No encode() method for arbitrary items
# apple = vsa.encode('apple') # Does not existThe main VSA class providing core operations.
class VSA(CognitiveMemory):
"""Base Vector Symbolic Architecture implementation."""Initialize a VSA instance with the specified configuration.
Generate a random vector of the configured type.
Parameters:
sparse: Whether to generate a sparse vector (overrides config)
Returns:
- NumPy array representing the vector
Example:
apple = vsa.generate_vector()
sparse_vec = vsa.generate_vector(sparse=True)Bind two vectors using the configured binding operation.
Parameters:
x: First vector (numpy array)y: Second vector (numpy array)
Returns:
- Bound vector (numpy array)
Example:
red_apple = vsa.bind(red, apple)Unbind a vector to retrieve the other component.
Parameters:
xy: Bound vector (numpy array)y: Known component (numpy array)
Returns:
- Retrieved vector (numpy array)
Example:
retrieved_apple = vsa.unbind(red_apple, red)Bundle multiple vectors into a single representation.
Parameters:
vectors: List of vectors to bundle (numpy arrays)weights: Optional weights for weighted bundling
Returns:
- Bundled vector (numpy array)
Example:
fruits = vsa.bundle([apple, banana, orange])
weighted = vsa.bundle([v1, v2], weights=[0.7, 0.3])Compute similarity between two vectors.
Parameters:
x: First vector (numpy array)y: Second vector (numpy array)
Returns:
- Similarity score in [-1, 1]
Example:
sim = vsa.similarity(apple, fruits)permute(vector: np.ndarray, permutation: Optional[np.ndarray] = None, shift: Optional[int] = None) -> np.ndarray
Permute elements of a vector.
Parameters:
vector: Vector to permute (numpy array)permutation: Explicit permutation array (optional)shift: Cyclic shift amount (takes precedence over permutation)
Returns:
- Permuted vector (numpy array)
Example:
shifted = vsa.permute(vector, shift=1)
rev_shifted = vsa.permute(shifted, shift=-1)Apply thinning to a vector by randomly zeroing elements.
Parameters:
vector: Vector to thin (numpy array)rate: Thinning rate (0-1), proportion of elements to zero
Returns:
- Thinned vector (numpy array)
Example:
sparse = vsa.thin(dense_vector, rate=0.9) # Zero out 90%, keep 10% of elementsNote: The rate parameter specifies the fraction to zero out, not the sparsity level. Rate=0.9 means 90% zeros, 10% non-zero.
Configuration for VSA instances.
@dataclass
class VSAConfig(MemoryConfig):
"""Configuration for Vector Symbolic Architecture."""
dimension: int = 1000
vector_type: str = 'bipolar'
vsa_type: str = 'map'
binding_method: Optional[str] = None
normalize_result: bool = True
sparsity: float = 0.0
cleanup_threshold: float = 0.3Fields:
dimension: Vector dimensionality (default: 1000)vector_type: Type of vectors ('binary', 'bipolar', 'ternary', 'complex', 'integer')vsa_type: VSA architecture type ('bsc', 'map', 'fhrr', 'hrr', 'sparse', 'custom')binding_method: Binding operation ('xor', 'multiplication', 'convolution', 'map', 'permutation'). If None, uses architecture defaultnormalize_result: Whether to normalize vectors after operations (default: True)sparsity: Sparsity level for sparse vectors (0-1, where 0 is dense)cleanup_threshold: Threshold for cleanup memory (default: 0.3)
VSA works with numpy arrays directly. Vector types are specified in the configuration and determine the internal representation and operations. The generate_random_vector utility function can create vectors of any type:
from cognitive_computing.vsa import generate_random_vector, BinaryVector, BipolarVector
# Generate different vector types
binary_vec = generate_random_vector(1000, BinaryVector)
bipolar_vec = generate_random_vector(1000, BipolarVector)
ternary_vec = generate_random_vector(1000, TernaryVector, sparsity=0.1)
complex_vec = generate_random_vector(1000, ComplexVector)
integer_vec = generate_random_vector(1000, IntegerVector, modulus=256)- Values: {0, 1}
- Default binding: XOR
- Similarity: Hamming distance
- Use case: Hardware-efficient implementations
- Values: {-1, +1}
- Default binding: Multiplication
- Similarity: Cosine similarity
- Use case: General-purpose VSA
- Values: {-1, 0, +1}
- Sparse representation
- Default binding: Multiplication
- Use case: Memory-efficient sparse coding
- Values: Complex numbers on unit circle
- Default binding: Complex multiplication
- Similarity: Complex dot product
- Use case: Frequency domain operations
- Values: Integers modulo N
- Default binding: Modular addition
- Similarity: Modular distance
- Use case: Discrete symbolic operations
Bipolar vectors with values in {-1, +1}.
class BipolarVector(VSAVector):
"""Bipolar vector implementation."""Generate a random bipolar vector.
Convert from binary vector.
Element-wise multiplication.
Normalize to unit length.
Sparse ternary vectors with values in {-1, 0, +1}.
class TernaryVector(VSAVector):
"""Ternary sparse vector implementation."""Generate a random sparse ternary vector.
Parameters:
dimension: Vector dimensionsparsity: Fraction of non-zero elements
Complex vectors with unit magnitude.
class ComplexVector(VSAVector):
"""Complex unit vector implementation."""Generate random complex unit vector.
Complex multiplication (phase addition).
Circular convolution.
Integer vectors with modular arithmetic.
class IntegerVector(VSAVector):
"""Integer modular vector implementation."""Generate random integer vector.
Parameters:
dimension: Vector dimensionmodulus: Modular arithmetic base
XOR binding for binary vectors.
class XORBinding(BindingOperation):
"""XOR binding operation."""
def bind(self, x: BinaryVector, y: BinaryVector) -> BinaryVector
def unbind(self, xy: BinaryVector, y: BinaryVector) -> BinaryVectorElement-wise multiplication for bipolar/complex vectors.
class MultiplicationBinding(BindingOperation):
"""Multiplication binding operation."""
def bind(self, x: VSAVector, y: VSAVector) -> VSAVector
def unbind(self, xy: VSAVector, y: VSAVector) -> VSAVectorCircular convolution binding.
class ConvolutionBinding(BindingOperation):
"""Circular convolution binding."""
def bind(self, x: VSAVector, y: VSAVector) -> VSAVector
def unbind(self, xy: VSAVector, y: VSAVector) -> VSAVectorMultiply-Add-Permute binding.
class MAPBinding(BindingOperation):
"""MAP (Multiply-Add-Permute) binding."""
def __init__(self, dimension: int, selection_ratio: float = 0.5)
def bind(self, x: VSAVector, y: VSAVector) -> VSAVectorPermutation-based binding.
class PermutationBinding(BindingOperation):
"""Permutation-based binding."""
def __init__(self, dimension: int)
def bind(self, x: VSAVector, y: VSAVector) -> VSAVectorEncode data using random indexing.
class RandomIndexingEncoder:
"""Random indexing encoder for text and sequences."""
def __init__(self, vsa: VSA, n_gram_size: int = 3,
window_size: int = 5)Encode text using random indexing.
Encode text as n-grams.
Note: RandomIndexingEncoder handles sequence encoding. There is no separate SequenceEncoder class.
Encode spatial coordinates.
class SpatialEncoder:
"""Encoder for spatial data."""
def __init__(self, vsa: VSA, grid_size: Tuple[int, ...])Encode 2D coordinates.
Encode 3D coordinates.
Encode temporal data.
class TemporalEncoder:
"""Encoder for temporal data."""
def __init__(self, vsa: VSA, max_lag: int = 10)Encode a discrete time point.
Encode a time series.
Encode continuous values as discrete levels.
class LevelEncoder:
"""Encoder for continuous values using levels."""
def __init__(self, vsa: VSA, num_levels: int = 10,
min_value: float = 0.0, max_value: float = 1.0)Encode a continuous value.
Decode to nearest level.
Convert level back to continuous value.
Encode graph structures.
class GraphEncoder:
"""Encoder for graph structures."""
def __init__(self, vsa: VSA)Encode a directed edge.
Encode a path through nodes.
Encode entire graph structure.
class BSC(VSA):
"""Binary Spatter Codes architecture."""
def __init__(self, dimension: int = 10000)Optimized for:
- Hardware implementation
- Minimal memory usage
- XOR binding operations
class MAP(VSA):
"""Multiply-Add-Permute architecture."""
def __init__(self, dimension: int = 10000,
selection_ratio: float = 0.5)Optimized for:
- Noise robustness
- Multiple bindings
- Cognitive modeling
Note: MAP unbinding is approximate. Expect similarity ~0.3 after unbinding due to the permutation additions.
class FHRR(VSA):
"""Fourier Holographic Reduced Representation."""
def __init__(self, dimension: int = 10000)Optimized for:
- Frequency domain operations
- HRR compatibility
- Complex vectors
Note: FHRR uses unit norm vectors (not unit magnitude per element). Expect similarity ~0.35-0.4 after unbinding due to FFT-based convolution.
class SparseVSA(VSA):
"""Sparse Vector Symbolic Architecture."""
def __init__(self, dimension: int = 10000,
sparsity: float = 0.05)Optimized for:
- Memory efficiency
- Large-scale systems
- Biological plausibility
Note: The sparsity parameter represents the fraction of zeros (e.g., 0.95 = 95% zeros, 5% non-zero).
Create a VSA instance with the specified parameters.
def create_vsa(dimension: int,
vector_type: Union[str, VectorType],
vsa_type: Union[str, VSAType],
**kwargs) -> VSA:
"""Create VSA instance with configuration."""Parameters:
dimension: Vector dimensionvector_type: Type of vectors ('binary', 'bipolar', 'ternary', 'complex', 'integer')vsa_type: VSA architecture ('bsc', 'map', 'fhrr', 'hrr', 'sparse', 'custom')**kwargs: Additional configuration parameters
Example:
# Create Binary Spatter Codes
vsa = create_vsa(
dimension=1000,
vector_type='binary',
vsa_type='bsc'
)
# Create MAP architecture
vsa = create_vsa(
dimension=1000,
vector_type='bipolar',
vsa_type='map'
)
# Create custom VSA with specific binding
vsa = create_vsa(
dimension=1000,
vector_type='bipolar',
vsa_type='custom',
binding_method='multiplication'
)Direct instantiation of architecture classes:
# Binary Spatter Codes
bsc = BSC(dimension=1000)
# MAP Architecture
map_arch = MAP(dimension=1000)
# Fourier HRR
fhrr = FHRR(dimension=1000)
# Sparse VSA
sparse = SparseVSA(dimension=1000, sparsity=0.95)Analyze the capacity of a VSA system.
def analyze_capacity(vsa: VSA, num_items: int = 100,
num_trials: int = 10) -> Dict[str, float]:
"""Analyze storage and retrieval capacity."""Returns:
- Dictionary with capacity metrics
Compare different VSA architectures.
def compare_architectures(architectures: List[VSA],
benchmark: str = 'all') -> pd.DataFrame:
"""Compare performance of different architectures."""Parameters:
architectures: List of VSA instancesbenchmark: Type of benchmark ('binding', 'capacity', 'noise', 'all')
Find optimal dimension for given requirements.
def optimize_dimension(num_items: int,
error_rate: float = 0.01) -> int:
"""Calculate optimal dimension for storage requirements."""Plot similarity matrix between vectors.
def plot_similarity_matrix(vectors: List[VSAVector],
labels: Optional[List[str]] = None) -> None:
"""Plot similarity matrix heatmap."""Visualize vectors in 2D/3D space.
def plot_vector_space(vectors: List[VSAVector],
method: str = 'pca',
labels: Optional[List[str]] = None) -> None:
"""Plot vectors in reduced dimensional space."""Parameters:
vectors: List of vectors to plotmethod: Dimensionality reduction ('pca', 'tsne', 'umap')labels: Optional labels for vectors
Visualize binding operation effects.
def plot_binding_operation(x: VSAVector, y: VSAVector,
operation: str = 'multiplication') -> None:
"""Visualize the effect of binding operations."""Base exception for VSA-related errors.
class VSAError(Exception):
"""Base exception for VSA errors."""Raised when vector dimensions don't match.
class DimensionMismatchError(VSAError):
"""Raised when vector dimensions don't match."""Raised when operation not supported for vector type.
class UnsupportedOperationError(VSAError):
"""Raised when operation not supported."""# Default dimensions
DEFAULT_DIMENSION = 1000
MIN_DIMENSION = 100
MAX_DIMENSION = 100000
# Vector type constants
VECTOR_TYPES = ['binary', 'bipolar', 'ternary', 'complex', 'integer']
# Binding method constants
BINDING_METHODS = ['xor', 'multiplication', 'convolution', 'map', 'permutation']
# Architecture names
ARCHITECTURES = ['bsc', 'map', 'fhrr', 'sparse', 'hrr']from typing import TypeVar, Union
# VSA vector type
VSAVectorType = TypeVar('VSAVectorType', bound='VSAVector')
# Numeric types for encoding
Numeric = Union[int, float, complex]
# Item types that can be encoded
Encodable = Union[str, Numeric, tuple, Any]