Source code for nengo.spa.utils
"""These are helper functions to simplify some operations in the SPA module."""
import numpy as np
import nengo
import nengo.utils.numpy as npext
from nengo.exceptions import ValidationError
from nengo.spa.vocab import VocabularyParam
from nengo.utils.compat import is_iterable
[docs]def enable_spa_params(model):
"""Enables the SPA specific parameters on a model.
Parameters
----------
model : Network
Model to activate SPA specific parameters for.
"""
for obj_type in [nengo.Node, nengo.Ensemble]:
model.config[obj_type].set_param(
'vocab', VocabularyParam('vocab', default=None, optional=True))
[docs]def similarity(data, vocab, normalize=False):
"""Return the similarity between some data and the vocabulary.
Computes the dot products between all data vectors and each
vocabulary vector. If ``normalize=True``, normalizes all vectors
to compute the cosine similarity.
Parameters
----------
data: array_like
The data used for comparison.
vocab: Vocabulary or array_like
Vocabulary (or list of vectors) to use to calculate
the similarity values.
normalize : bool, optional (Default: False)
Whether to normalize all vectors, to compute the cosine similarity.
"""
from nengo.spa.vocab import Vocabulary
if isinstance(vocab, Vocabulary):
vectors = vocab.vectors
elif is_iterable(vocab):
vectors = np.array(vocab, copy=False, ndmin=2)
else:
raise ValidationError("%r object is not a valid vocabulary"
% (type(vocab).__name__), attr='vocab')
data = np.array(data, copy=False, ndmin=2)
dots = np.dot(data, vectors.T)
if normalize:
# Zero-norm vectors should return zero, so avoid divide-by-zero error
eps = np.nextafter(0, 1) # smallest float above zero
dnorm = np.maximum(npext.norm(data, axis=1, keepdims=True), eps)
vnorm = np.maximum(npext.norm(vectors, axis=1, keepdims=True), eps)
dots /= dnorm
dots /= vnorm.T
return dots