Source code for holovec.spaces.base

"""Base classes for vector spaces in holovec.

This module defines the abstract interface for vector spaces used in
hyperdimensional computing. Each space defines how random vectors are
generated and what similarity metric is appropriate.
"""

from __future__ import annotations

from abc import ABC, abstractmethod
from typing import Optional

from ..backends import Backend, get_backend
from ..backends.base import Array


[docs] class VectorSpace(ABC): """Abstract base class for vector spaces. A vector space defines: - How random vectors are generated - What similarity metric is appropriate - How vectors are normalized - What algebraic operations are natural """
[docs] def __init__(self, dimension: int, backend: Optional[Backend] = None, seed: Optional[int] = None): """Initialize vector space. Args: dimension: Dimensionality of vectors backend: Computational backend to use (defaults to auto-detect) seed: Random seed for reproducibility """ if dimension < 1: raise ValueError(f"Dimension must be positive, got {dimension}") self.dimension = dimension self.backend = backend if backend is not None else get_backend() self.seed = seed
[docs] @abstractmethod def random(self, seed: Optional[int] = None) -> Array: """Generate a random vector in this space. Args: seed: Optional seed for this specific vector Returns: Random vector from the appropriate distribution """ pass
[docs] @abstractmethod def similarity(self, a: Array, b: Array) -> float: """Compute similarity between two vectors. The similarity measure is space-specific: - Cosine similarity for real/complex spaces - Hamming distance for binary/bipolar spaces Args: a: First vector b: Second vector Returns: Similarity score (higher means more similar) """ pass
[docs] @abstractmethod def normalize(self, vec: Array) -> Array: """Normalize a vector according to space conventions. Args: vec: Vector to normalize Returns: Normalized vector """ pass
@property @abstractmethod def dtype(self) -> str: """Return the appropriate dtype for this space.""" pass @property @abstractmethod def space_name(self) -> str: """Return the name of this vector space.""" pass def __repr__(self) -> str: return f"{self.__class__.__name__}(dimension={self.dimension}, backend={self.backend.name})"
class DiscreteSpace(VectorSpace): """Base class for discrete vector spaces (binary, bipolar).""" def similarity(self, a: Array, b: Array) -> float: """Use Hamming-based similarity for discrete spaces. Returns normalized similarity in [0, 1] where: - 1.0 means identical - 0.0 means maximally different """ hamming = self.backend.hamming_distance(a, b) # Normalize to [0, 1] where 1 is most similar return 1.0 - (hamming / self.dimension) class ContinuousSpace(VectorSpace): """Base class for continuous vector spaces (real, complex).""" def similarity(self, a: Array, b: Array) -> float: """Use cosine similarity for continuous spaces. Returns similarity in [-1, 1] where: - 1.0 means same direction - -1.0 means opposite direction - 0.0 means orthogonal """ return self.backend.cosine_similarity(a, b) def normalize(self, vec: Array) -> Array: """L2 normalization for continuous spaces.""" return self.backend.normalize(vec, ord=2)