def test_reset(self): """test IndexNSG.reset()""" d = self.xq.shape[1] metrics = {faiss.METRIC_L2: 'L2', faiss.METRIC_INNER_PRODUCT: 'IP'} metric = faiss.METRIC_L2 flat_index = faiss.IndexFlat(d, metric) flat_index.add(self.xb) Dref, Iref = flat_index.search(self.xq, 1) index = faiss.IndexNSGFlat(d, 16) index.verbose = True index.GK = 32 index.add(self.xb) Dnsg, Insg = index.search(self.xq, 1) recalls = (Iref == Insg).sum() print('metric: {}, nb equal: {}'.format(metrics[metric], recalls)) self.assertGreaterEqual(recalls, 475) self.subtest_connectivity(index, self.xb.shape[0]) index.reset() index.add(self.xb) Dnsg, Insg = index.search(self.xq, 1) recalls = (Iref == Insg).sum() print('metric: {}, nb equal: {}'.format(metrics[metric], recalls)) self.assertGreaterEqual(recalls, 475) self.subtest_connectivity(index, self.xb.shape[0])
def test_order(self): """make sure that output results are sorted""" d = self.xq.shape[1] index = faiss.IndexNSGFlat(d, 32) index.train(self.xb) index.add(self.xb) k = 10 nq = self.xq.shape[0] D, _ = index.search(self.xq, k) indices = np.argsort(D, axis=1) gt = np.arange(0, k)[np.newaxis, :] # [1, k] gt = np.repeat(gt, nq, axis=0) # [nq, k] assert np.array_equal(indices, gt)
def subtest_build(self, knn_graph, thresh, metric=faiss.METRIC_L2): d = self.xq.shape[1] metrics = {faiss.METRIC_L2: 'L2', faiss.METRIC_INNER_PRODUCT: 'IP'} flat_index = faiss.IndexFlat(d, metric) flat_index.add(self.xb) Dref, Iref = flat_index.search(self.xq, 1) index = faiss.IndexNSGFlat(d, 16, metric) index.verbose = True index.build(self.xb, knn_graph) Dnsg, Insg = index.search(self.xq, 1) recalls = (Iref == Insg).sum() print('metric: {}, nb equal: {}'.format(metrics[metric], recalls)) self.assertGreaterEqual(recalls, thresh) self.subtest_connectivity(index, self.xb.shape[0])
if 'kmeans_hnsw' in todo: print("Performing kmeans on sift1M using HNSW assignment") clus = faiss.Clustering(d, 16384) clus.verbose = True clus.niter = 10 index = faiss.IndexHNSWFlat(d, 32) # increase the default efSearch, otherwise the number of empty # clusters is too high. index.hnsw.efSearch = 128 clus.train(xb, index) if 'nsg' in todo: print("Testing NSG Flat") index = faiss.IndexNSGFlat(d, 32) index.build_type = 1 # training is not needed # this is the default, higher is more accurate and slower to # construct print("add") # to see progress index.verbose = True index.add(xb) print("search") for search_L in -1, 16, 32, 64, 128, 256: print("search_L", search_L, end=' ') index.nsg.search_L = search_L