def encode(self, vals): dsub = self.ecdat['dsub'] nsubq = self.ecdat['nsubq'] centroids = self.ecdat['centroids'] num_vals = vals.shape[0] codes = np.zeros((num_vals, nsubq), np.uint8) for q in range(nsubq): vsub = vals[:, q*dsub:(q+1)*dsub] codes[:, q] = pq_kmeans_assign(centroids[q], vsub) return codes
def encode(self, vals): # Here `copy()` can ensure that you DONOT modify the vals vals = vals.copy() coa_centroids = self.ecdat['coa_centroids'] cids = pq_kmeans_assign(coa_centroids, vals) vals -= coa_centroids[cids, :] codes = super(IVFPQEncoder, self).encode(vals) return cids, codes
def encode(self, vals): dsub = self.ecdat['dsub'] nsubq = self.ecdat['nsubq'] centroids = self.ecdat['centroids'] num_vals = vals.shape[0] codes = np.zeros((num_vals, nsubq), np.uint8) for q in range(nsubq): vsub = vals[:, q * dsub:(q + 1) * dsub] codes[:, q] = pq_kmeans_assign(centroids[q], vsub) return codes
def build(self, pardic=None): pardic['vals'] = pardic['vals'].copy() # training data vals = pardic['vals'] # the number of coarse centroids coarsek = pardic.get('coarsek', 1024) logging.info('Building coarse quantizer - BEGIN') coa_centroids = kmeans(vals.astype(np.float32), coarsek, niter=100) cids = pq_kmeans_assign(coa_centroids, vals) logging.info('Building coarse quantizer - DONE') pardic['vals'] -= coa_centroids[cids, :] super(IVFPQEncoder, self).build(pardic) self.ecdat['coa_centroids'] = coa_centroids self.ecdat['coarsek'] = coarsek