MCPcopy Create free account
hub / github.com/dblalock/bolt / MockEncoder

Class MockEncoder

python/bolt/bolt_api.py:237–376  ·  view source on GitHub ↗

Stand-in for cpp impl; only for debuging

Source from the content-addressed store, hash-verified

235
236
237class MockEncoder(object):
238 """Stand-in for cpp impl; only for debuging"""
239
240 def __init__(self, nbytes):
241 self._enc_bytes = nbytes
242 self.ncodebooks = 2 * nbytes
243 self._encoder = bolt.BoltEncoder(nbytes)
244
245 def set_centroids(self, centroids):
246 # accept centroids as 2D array like cpp; but we'll need them 3D
247 nrows, ndims = centroids.shape
248 ncentroids = 16
249 codebook_sz = ncentroids * ndims
250
251 self.centroids = np.empty((ncentroids, self.ncodebooks, ndims))
252 for m in range(self.ncodebooks):
253 start_idx = m * ncentroids # start idx of block
254 end_idx = start_idx + ncentroids
255 block = centroids[start_idx:end_idx]
256 self.centroids[:, m, :] = block
257
258 # check whether centroids bridge is broken
259 self._encoder.set_centroids(centroids)
260 raw_centroids = self._encoder.centroids()
261 cpp_centroids = np.full(raw_centroids.shape, -1)
262
263 print "ncentroids, ncodebooks, ndims ", self.centroids.shape
264
265 inbuff = raw_centroids.ravel()
266 outbuff = np.zeros(raw_centroids.size) - 1
267 for m in range(self.ncodebooks):
268 start_idx = m * codebook_sz # start idx of block
269 for i in range(ncentroids): # for each row in block
270 for j in range(ndims): # for each col in block
271 in_idx = start_idx + (ndims * i) + j
272 out_idx = start_idx + (ncentroids * j) + i
273 outbuff[in_idx] = inbuff[out_idx]
274
275 cpp_centroids = outbuff.reshape(centroids.shape)
276
277 # print "py, cpp centroids: "
278 # print centroids[:20]
279 # print cpp_centroids[:20]
280 # print centroids.shape
281 # print cpp_centroids.shape
282
283 assert np.allclose(centroids, cpp_centroids)
284
285 def set_data(self, X):
286 self.X = X
287 self.X_enc = _encode_X_pq(X, self.centroids)
288 ncodebooks = self.centroids.shape[1]
289 enc_offsets = np.arange(ncodebooks, dtype=np.int) * 16
290
291 self._encoder.set_data(X)
292 raw_Xenc = self._encoder.codes()
293 assert 2 * raw_Xenc.shape[1] == ncodebooks
294 cpp_Xenc = np.empty((raw_Xenc.shape[0], ncodebooks), dtype=np.uint8)

Callers 1

fitMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected