Skip to main content

JAX-native Vector Symbolic Algebra library

Project description

VSAX: Vector Symbolic Algebra for JAX

PyPI version Python Version License Documentation Code style: ruff

VSAX is a GPU-accelerated, JAX-native Python library for Vector Symbolic Architectures (VSAs). It provides composable symbolic representations using hypervectors, algebraic operations for binding and bundling, and encoding strategies for symbolic and structured data.

๐Ÿ“š New to VSA? Start Learning!

Complete VSA Learning Path โ†’

New comprehensive course covering VSA from foundations to research frontiers:

  • 20 Interactive Lessons - From "Why High Dimensions?" to research frontiers
  • 12 Hands-On Exercises - ~5,000 lines of practical code
  • 5 Progressive Modules - Foundations โ†’ Core Operations โ†’ Applications โ†’ Advanced โ†’ Research
  • ~113,000 Words of content - Self-paced learning for ML practitioners and researchers

Quick Links:

Features

  • ๐Ÿš€ Three VSA Models: FHRR, MAP, and Binary implementations โœ…
  • ๐Ÿญ Factory Functions: One-line model creation with sensible defaults โœ…
  • ๐Ÿ’พ VSAMemory: Dictionary-style symbol management โœ…
  • ๐Ÿ“Š 5 Core Encoders: Scalar, Sequence, Set, Dict, and Graph encoders โœ…
  • ๐ŸŽจ Custom Encoders: Easy-to-extend AbstractEncoder base class โœ…
  • ๐Ÿ” Similarity Metrics: Cosine, dot, and Hamming similarity โœ…
  • โšก Batch Operations: GPU-accelerated vmap operations for parallel processing โœ…
  • ๐Ÿ’พ I/O & Persistence: Save/load basis vectors to JSON โœ…
  • ๐ŸŽฎ GPU Utilities: Device management, benchmarking, CPU/GPU comparison โœ…
  • ๐Ÿ”ง Clifford Operators: Exact, compositional, invertible transformations for reasoning โœ… NEW in v1.1.0
  • ๐Ÿ“ Fractional Power Encoding (FPE): Continuous value encoding using v^r for spatial/function representations โœ… NEW in v1.2.0
  • ๐Ÿ—บ๏ธ Spatial Semantic Pointers (SSP): Continuous spatial encoding with what/where queries โœ… NEW in v1.2.0
  • ๐ŸŽฏ Vector Function Architecture (VFA): Function approximation in RKHS for density estimation, regression, image processing โœ… NEW in v1.2.0
  • ๐Ÿš€ GPU-Accelerated: Built on JAX for automatic GPU acceleration (5-30x speedup)
  • ๐Ÿงฉ Modular Architecture: Clean separation between representations and operations
  • ๐Ÿงฌ Complete Representations: Complex, Real, and Binary hypervectors โœ…
  • โš™๏ธ Full Operation Sets: FFT-based FHRR, MAP, and XOR/majority Binary ops โœ…
  • ๐ŸŽฒ Random Sampling: Sampling utilities for all representation types โœ…
  • ๐Ÿ“š Comprehensive Documentation: Full API docs and examples โœ…
  • ๐Ÿ““ Interactive Tutorials: Jupyter notebooks with real datasets (MNIST, knowledge graphs) โœ… NEW in v0.7.1
  • โœ… 95% Test Coverage: 450 tests ensuring reliability

Installation

From PyPI (Recommended)

pip install vsax

Or with uv:

uv pip install vsax

From Source

Using uv (Recommended)

uv is a fast Python package installer and resolver. Install it first:

# Install uv (Unix/macOS)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install uv (Windows)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

Then install VSAX:

git clone https://github.com/vasanthsarathy/vsax.git
cd vsax

# Create virtual environment and install package
uv venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
uv pip install -e .

Using pip

git clone https://github.com/vasanthsarathy/vsax.git
cd vsax
pip install -e .

Development Installation

Using uv (Recommended)

uv venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
uv pip install -e ".[dev,docs]"

Using pip

pip install -e ".[dev,docs]"

Quick Start

New in v0.6.0: Save and load basis vectors!

Simple Example

from vsax import create_fhrr_model, VSAMemory, DictEncoder, save_basis, load_basis
from vsax.similarity import cosine_similarity
from vsax.utils import vmap_bind

# Create model with factory function (one line!)
model = create_fhrr_model(dim=512)

# Create memory for symbol management
memory = VSAMemory(model)

# Add symbols - automatically samples and stores hypervectors
memory.add_many(["subject", "action", "dog", "run", "cat", "jump"])

# Dictionary-style access
dog = memory["dog"]

# Encode structured data with DictEncoder
encoder = DictEncoder(model, memory)
sentence = encoder.encode({"subject": "dog", "action": "run"})

# Bind concepts (circular convolution)
dog_is_animal = model.opset.bind(dog.vec, memory["animal"].vec)

# Unbind to recover original concept (NEW: explicit unbind method)
recovered = model.opset.unbind(dog_is_animal, memory["animal"].vec)
# With FHRR: >99% similarity to original dog vector

# Bundle concepts (sum and normalize)
pets = model.opset.bundle(memory["dog"].vec, memory["cat"].vec)

# NEW: Similarity search
similarity = cosine_similarity(memory["dog"], memory["cat"])
print(f"Dog-Cat similarity: {similarity:.3f}")

# NEW: Batch operations (GPU-accelerated)
import jax.numpy as jnp
nouns = jnp.stack([memory["dog"].vec, memory["cat"].vec])
verbs = jnp.stack([memory["run"].vec, memory["jump"].vec])
actions = vmap_bind(model.opset, nouns, verbs)  # Parallel binding!

# NEW: Save and load basis vectors
save_basis(memory, "my_basis.json")  # Persist to JSON
memory_new = VSAMemory(model)
load_basis(memory_new, "my_basis.json")  # Load from JSON

All Three Models

VSAX supports three VSA models, all with the same simple API:

from vsax import create_fhrr_model, create_map_model, create_binary_model, VSAMemory

# FHRR: Complex hypervectors, >99% unbinding accuracy (with proper sampling)
fhrr = create_fhrr_model(dim=512)

# MAP: Real hypervectors, approximate unbinding
map_model = create_map_model(dim=512)

# Binary: Discrete hypervectors, exact unbinding (XOR self-inverse)
binary = create_binary_model(dim=10000, bipolar=True)

# Same interface for all models!
for model in [fhrr, map_model, binary]:
    memory = VSAMemory(model)
    memory.add("concept")
    vec = memory["concept"]

NEW: Clifford Operators (v1.1.0)

Exact, compositional, invertible transformations for reasoning:

from vsax import create_fhrr_model, VSAMemory
from vsax.operators import create_left_of, create_agent, create_patient
from vsax.similarity import cosine_similarity

model = create_fhrr_model(dim=512)
memory = VSAMemory(model)
memory.add_many(["cup", "plate", "dog", "cat", "chase"])

# Use pre-defined spatial operators
LEFT_OF = create_left_of(512)

# Encode: cup LEFT_OF plate
scene = model.opset.bundle(
    memory["cup"].vec,
    LEFT_OF.apply(memory["plate"]).vec
)

# Query with inverse operator
RIGHT_OF = LEFT_OF.inverse()
answer = LEFT_OF.inverse().apply(model.rep_cls(scene))
# Returns plate with high similarity!

# Use pre-defined semantic operators
AGENT = create_agent(512)
PATIENT = create_patient(512)

# Encode: "dog chases cat"
sentence = model.opset.bundle(
    AGENT.apply(memory["dog"]).vec,
    memory["chase"].vec,
    PATIENT.apply(memory["cat"]).vec
)

# Query: Who is the AGENT?
who = AGENT.inverse().apply(model.rep_cls(sentence))
similarity = cosine_similarity(who.vec, memory["dog"].vec)
print(f"AGENT is 'dog': {similarity:.3f}")  # High similarity!

Pre-defined operators (NEW in Phase 2):

  • Spatial: create_left_of, create_right_of, create_above, create_below, create_in_front_of, create_behind, create_near, create_far
  • Semantic: create_agent, create_patient, create_theme, create_experiencer, create_instrument, create_location, create_goal, create_source

Key features:

  • โœ… Exact inversion: op.inverse().apply(op.apply(v)) recovers original (similarity > 0.999)
  • โœ… Explicit unbinding: Use ops.unbind(bound, b) for clearer unbinding operations
  • โœ… Compositional: Combine operators algebraically with compose()
  • โœ… Typed: Semantic metadata (SPATIAL, SEMANTIC, TEMPORAL, etc.)
  • โœ… Reproducible: Same dimension always produces same operator
  • โœ… FHRR-compatible: Phase-based transformations for complex hypervectors

NEW: Spatial Semantic Pointers (v1.2.0)

Continuous spatial encoding for 2D navigation and spatial reasoning:

from vsax import create_fhrr_model, VSAMemory
from vsax.spatial import SpatialSemanticPointers, SSPConfig

model = create_fhrr_model(dim=1024)
memory = VSAMemory(model)

# Create 2D spatial encoder
config = SSPConfig(dim=1024, num_axes=2, axis_names=["X", "Y"])
ssp = SpatialSemanticPointers(model, memory, config)

# Add objects to memory
memory.add_many(["table", "chair", "plant"])

# Bind objects to locations in a 10x10 room
table_at_loc = ssp.bind_object_location("table", [3.0, 7.0])
chair_at_loc = ssp.bind_object_location("chair", [5.0, 7.5])
plant_at_loc = ssp.bind_object_location("plant", [8.0, 3.0])

# Bundle into scene
from vsax.representations import ComplexHypervector
scene_vec = model.opset.bundle(
    table_at_loc.vec,
    model.opset.bundle(chair_at_loc.vec, plant_at_loc.vec)
)
scene = ComplexHypervector(scene_vec)

# Query: What's at location (3.0, 7.0)?
result = ssp.query_location(scene, [3.0, 7.0])
# Returns hypervector similar to "table"!

# Query: Where is the plant?
location_hv = ssp.query_object(scene, "plant")
decoded_location = ssp.decode_location(
    location_hv,
    search_range=[(0, 10), (0, 10)],
    resolution=20
)
# Returns approximately [8.0, 3.0]!

Key features:

  • โœ… Continuous encoding: Positions encoded as X^x โŠ— Y^y using fractional powers
  • โœ… What/Where queries: Both "what is at (x,y)" and "where is X" supported
  • โœ… Scene shifting: Transform entire scenes spatially
  • โœ… Similarity maps: Visualize spatial distributions

NEW: Vector Function Architecture (v1.2.0)

Function approximation in RKHS for density estimation, regression, and image processing:

from vsax import create_fhrr_model, VSAMemory
from vsax.vfa import DensityEstimator, NonlinearRegressor, ImageProcessor
import jax.numpy as jnp

model = create_fhrr_model(dim=2048)

# 1. Density Estimation
estimator = DensityEstimator(model, VSAMemory(model), bandwidth=0.5)
samples = jax.random.normal(jax.random.PRNGKey(42), (100,))
estimator.fit(samples)
density = estimator.evaluate(jnp.array([0.0, 1.0, 2.0]))

# 2. Nonlinear Regression
regressor = NonlinearRegressor(model, VSAMemory(model))
x_train = jnp.linspace(0, 2 * jnp.pi, 50)
y_train = jnp.sin(x_train)
regressor.fit(x_train, y_train)
y_pred = regressor.predict(jnp.array([0.5, 1.0, 1.5]))
r2_score = regressor.score(x_train, y_train)

# 3. Image Processing
processor = ImageProcessor(model, VSAMemory(model))
image = jnp.zeros((16, 16))
image = image.at[4:12, 4:12].set(1.0)  # White square
image_hv = processor.encode(image)
reconstructed = processor.decode(image_hv, shape=(16, 16))

# Blend two images
image2 = jnp.zeros((16, 16))
image2_hv = processor.encode(image2)
blended = processor.blend(image_hv, image2_hv, alpha=0.5)

Key features:

  • โœ… Kernel density estimation: Estimate probability densities from samples
  • โœ… Nonlinear regression: Fit complex functions with scikit-learn-like API
  • โœ… Image encoding: Compact hypervector representation of images
  • โœ… Function arithmetic: Add, scale, shift, and convolve functions
  • โœ… RKHS approximation: Reproducing Kernel Hilbert Space function representation

Advanced: Manual Model Creation

You can still create models manually if you need custom configuration:

from vsax import VSAModel, ComplexHypervector, FHRROperations, sample_complex_random

model = VSAModel(
    dim=512,
    rep_cls=ComplexHypervector,
    opset=FHRROperations(),
    sampler=sample_complex_random
)

See docs/design-spec.md for complete technical specification.

Development Status

Currently in Iteration 6: I/O & Persistence โœ…

Completed

Iteration 1 (v0.1.0): Foundation & Infrastructure โœ…

  • โœ… Core abstract classes (AbstractHypervector, AbstractOpSet)
  • โœ… VSAModel dataclass
  • โœ… Package structure
  • โœ… Testing infrastructure (pytest, coverage)
  • โœ… CI/CD pipeline (GitHub Actions)
  • โœ… Documentation site (MkDocs)
  • โœ… Development tooling (ruff, mypy)

Iteration 2 (v0.2.0): All 3 Representations + All 3 OpSets โœ…

  • โœ… ComplexHypervector, RealHypervector, BinaryHypervector
  • โœ… FHRROperations, MAPOperations, BinaryOperations
  • โœ… Sampling utilities (sample_random, sample_complex_random, sample_binary_random)
  • โœ… 175 comprehensive tests with 96% coverage
  • โœ… Full integration tests for all model combinations

Iteration 3 (v0.3.0): VSAMemory + Factory Functions โœ…

  • โœ… VSAMemory class - dictionary-style symbol management
  • โœ… Factory functions (create_fhrr_model, create_map_model, create_binary_model)
  • โœ… Utility functions (coerce_to_array, validation helpers)
  • โœ… 230 tests with 89% coverage
  • โœ… Comprehensive documentation guides

Iteration 4 (v0.4.0): Encoders + Examples โœ… FIRST USABLE RELEASE!

  • โœ… ScalarEncoder - Numeric values with power encoding
  • โœ… SequenceEncoder - Ordered sequences (lists, tuples)
  • โœ… SetEncoder - Unordered collections (sets)
  • โœ… DictEncoder - Key-value pairs (dictionaries)
  • โœ… GraphEncoder - Graph structures (edge lists)
  • โœ… AbstractEncoder - Base class for custom encoders
  • โœ… Complete integration examples for all 3 models
  • โœ… Custom encoder examples (DateEncoder, ColorEncoder)
  • โœ… 280+ tests with 92%+ coverage

Iteration 5 (v0.5.0): Similarity Metrics & Utilities โœ…

  • โœ… Cosine, dot, and Hamming similarity functions
  • โœ… Batch operations with JAX vmap (vmap_bind, vmap_bundle, vmap_similarity)
  • โœ… Visualization utilities (pretty_repr, format_similarity_results)
  • โœ… GPU-accelerated similarity search
  • โœ… Comprehensive examples (similarity_search.py, batch_operations.py)
  • โœ… 319 tests with 95%+ coverage

Iteration 6 (v0.6.0): I/O & Persistence โœ…

  • โœ… save_basis() and load_basis() functions
  • โœ… JSON serialization for all 3 models
  • โœ… Round-trip vector preservation
  • โœ… Dimension and type validation
  • โœ… Comprehensive tests (339 tests, 96% coverage)
  • โœ… Complete examples and documentation

Coming Next

Iteration 7 (v1.0.0): Full Documentation & Production Release

  • Complete API documentation
  • Tutorial notebooks
  • Production-ready v1.0.0 release

See todo.md for the complete development roadmap.

Documentation

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines.

Development

Run tests:

pytest

Run tests with coverage:

pytest --cov=vsax --cov-report=term-missing

Type checking:

mypy vsax

Linting:

ruff check vsax tests

Build documentation:

mkdocs serve

License

VSAX is released under the MIT License. See LICENSE for details.

Citation

If you use VSAX in your research, please cite:

@software{vsax2025,
  title = {VSAX: Vector Symbolic Algebra for JAX},
  author = {Sarathy, Vasanth},
  year = {2025},
  url = {https://github.com/vasanthsarathy/vsax},
  version = {1.3.0}
}

Acknowledgments

VSAX is built on JAX and inspired by the VSA/HDC research community.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vsax-1.3.1.tar.gz (72.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vsax-1.3.1-py3-none-any.whl (84.4 kB view details)

Uploaded Python 3

File details

Details for the file vsax-1.3.1.tar.gz.

File metadata

  • Download URL: vsax-1.3.1.tar.gz
  • Upload date:
  • Size: 72.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vsax-1.3.1.tar.gz
Algorithm Hash digest
SHA256 a3fbc6973da548860d10c67534e596461f0af25ff9d50218ef2bc464e000a9bc
MD5 b13a216fde0be2d79090b9f3e3eab3bc
BLAKE2b-256 feca3391907f9ed103d5ca2ae7ebee1c597bcc51b0fd4b489037d2f5482187d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsax-1.3.1.tar.gz:

Publisher: publish.yml on vasanthsarathy/vsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vsax-1.3.1-py3-none-any.whl.

File metadata

  • Download URL: vsax-1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 84.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vsax-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7aa40234ebaf6eae3ba5500ccf967fb053b049de97a04d77259f269ebbe85db7
MD5 37234d2a61ee09a680cf5947366e7d1e
BLAKE2b-256 2bcdb40d19cae0cf5cd0a0f2b36f70de931a1e9ba0b52e5ae4489dbab1c75659

See more details on using hashes here.

Provenance

The following attestation bundles were made for vsax-1.3.1-py3-none-any.whl:

Publisher: publish.yml on vasanthsarathy/vsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page