| 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 |