def create_pointer(self, attempts=100, unitary=False): """Create a new semantic pointer. This will take into account the randomize and max_similarity parameters from self. """ if self.randomize: count = 0 p = pointer.SemanticPointer(self.dimensions, rng=self.rng) if self.vectors.shape[0] > 0: while count < 100: similarity = np.dot(self.vectors, p.v) if max(similarity) < self.max_similarity: break p = pointer.SemanticPointer(self.dimensions, rng=self.rng) count += 1 else: warnings.warn('Could not create a semantic pointer with ' 'max_similarity=%1.2f (D=%d, M=%d)' % (self.max_similarity, self.dimensions, len(self.pointers))) # Check and make vector unitary if needed if unitary: p.make_unitary() else: index = len(self.pointers) if index >= self.dimensions: raise IndexError('Tried to make more semantic pointers than' + ' dimensions with non-randomized Vocabulary') p = pointer.SemanticPointer(np.eye(self.dimensions)[index]) return p
def identity(self): """Return the identity vector.""" if self._identity is None: v = np.zeros(self.dimensions) v[0] = 1 self._identity = pointer.SemanticPointer(v) return self._identity
def add(self, key, p): """Add a new semantic pointer to the vocabulary. The pointer value can be a `.SemanticPointer` or a vector. """ if self.readonly: raise ReadonlyError(attr='Vocabulary', msg="Cannot add semantic pointer '%s' to " "read-only vocabulary." % key) if not key[0].isupper(): raise SpaParseError( "Semantic pointers must begin with a capital letter.") if not isinstance(p, pointer.SemanticPointer): p = pointer.SemanticPointer(p) if key in self.pointers: raise ValidationError("The semantic pointer %r already exists" % key, attr='pointers', obj=self) self.pointers[key] = p self.keys.append(key) self.vectors = np.vstack([self.vectors, p.v]) # Generate vector pairs if self.include_pairs and len(self.keys) > 1: for k in self.keys[:-1]: self.key_pairs.append('%s*%s' % (k, key)) v = (self.pointers[k] * p).v self.vector_pairs = np.vstack([self.vector_pairs, v])
def create_pointer(self, attempts=100, unitary=False): """Create a new semantic pointer. This will take into account the randomize and max_similarity parameters from self. If a pointer satisfying max_similarity is not generated after the specified number of attempts, the candidate pointer with lowest maximum cosine with all existing pointers is returned. """ if self.randomize: if self.vectors.shape[0] == 0: p = pointer.SemanticPointer(self.dimensions, rng=self.rng) else: p_sim = np.inf for _ in range(attempts): pp = pointer.SemanticPointer(self.dimensions, rng=self.rng) pp_sim = max(np.dot(self.vectors, pp.v)) if pp_sim < p_sim: p = pp p_sim = pp_sim if p_sim < self.max_similarity: break else: warnings.warn( 'Could not create a semantic pointer with ' 'max_similarity=%1.2f (D=%d, M=%d)' % (self.max_similarity, self.dimensions, len(self.pointers))) # Check and make vector unitary if needed if unitary: p.make_unitary() else: index = len(self.pointers) if index >= self.dimensions: raise ValidationError( "Tried to make more semantic pointers than " "dimensions with non-randomized Vocabulary", attr='dimensions', obj=self) p = pointer.SemanticPointer(np.eye(self.dimensions)[index]) return p
def add(self, key, p): """Add a new semantic pointer to the vocabulary. The pointer value can be a SemanticPointer or a vector. """ if not key[0].isupper(): raise KeyError('Semantic pointers must begin with a capital') if not isinstance(p, pointer.SemanticPointer): p = pointer.SemanticPointer(p) if key in self.pointers: raise KeyError("The semantic pointer '%s' already exists" % key) self.pointers[key] = p self.keys.append(key) self.vectors = np.vstack([self.vectors, p.v]) # Generate vector pairs if self.include_pairs and len(self.keys) > 1: for k in self.keys[:-1]: self.key_pairs.append('%s*%s' % (k, key)) v = (self.pointers[k] * p).v self.vector_pairs = np.vstack([self.vector_pairs, v])