def get_invlist(invlists, l): """ returns the inverted lists content as a pair of (list_ids, list_codes). The codes are reshaped to a proper size """ invlists = faiss.downcast_InvertedLists(invlists) ls = invlists.list_size(l) list_ids = np.zeros(ls, dtype='int64') ids = codes = None try: ids = invlists.get_ids(l) if ls > 0: faiss.memcpy(faiss.swig_ptr(list_ids), ids, list_ids.nbytes) codes = invlists.get_codes(l) if invlists.code_size != faiss.InvertedLists.INVALID_CODE_SIZE: list_codes = np.zeros((ls, invlists.code_size), dtype='uint8') else: # it's a BlockInvertedLists npb = invlists.n_per_block bs = invlists.block_size ls_round = (ls + npb - 1) // npb list_codes = np.zeros((ls_round, bs // npb, npb), dtype='uint8') if ls > 0: faiss.memcpy(faiss.swig_ptr(list_codes), codes, list_codes.nbytes) finally: if ids is not None: invlists.release_ids(l, ids) if codes is not None: invlists.release_codes(l, codes) return list_ids, list_codes
def test_equiv_pq(self): ds = datasets.SyntheticDataset(32, 2000, 200, 4) index = faiss.index_factory(32, "IVF1,PQ16x4np") index.by_residual = False # force coarse quantizer index.quantizer.add(np.zeros((1, 32), dtype='float32')) index.train(ds.get_train()) index.add(ds.get_database()) Dref, Iref = index.search(ds.get_queries(), 4) index_pq = faiss.index_factory(32, "PQ16x4np") index_pq.pq = index.pq index_pq.is_trained = True index_pq.codes = faiss.downcast_InvertedLists( index.invlists).codes.at(0) index_pq.ntotal = index.ntotal Dnew, Inew = index_pq.search(ds.get_queries(), 4) np.testing.assert_array_equal(Iref, Inew) np.testing.assert_array_equal(Dref, Dnew) index_pq2 = faiss.IndexPQFastScan(index_pq) index_pq2.implem = 12 Dref, Iref = index_pq2.search(ds.get_queries(), 4) index2 = faiss.IndexIVFPQFastScan(index) index2.implem = 12 Dnew, Inew = index2.search(ds.get_queries(), 4) np.testing.assert_array_equal(Iref, Inew) np.testing.assert_array_equal(Dref, Dnew)
def get_ids(invlists, list_no: int): invlists = faiss.downcast_InvertedLists(invlists) ls = invlists.list_size(list_no) list_ids = np.zeros(ls, dtype='int64') ids = None origin_ids = None try: ids = invlists.get_ids(list_no) origin_ids = np.array(faiss.rev_swig_ptr(ids, ls)) except Exception as e: print("get_ids failed ", e) finally: if ids is not None: invlists.release_ids(list_no, ids) return origin_ids
index = faiss.read_index( fname, faiss.IO_FLAG_MMAP | faiss.IO_FLAG_READ_ONLY) except RuntimeError as e: print('could not load %s: %s' % (fname, e)) return fname, None print(" %d entries" % index.ntotal) return fname, index index0 = None for _, index in pool.imap(load_index, args.inputs): if index is None: continue index_ivf = faiss.extract_index_ivf(index) il = faiss.downcast_InvertedLists(index_ivf.invlists) index_ivf.invlists = None il.this.own() ils_dont_dealloc.append(il) if (args.l0, args.l1) != (0, -1): print('restricting to lists %d:%d' % (args.l0, args.l1)) # il = faiss.SliceInvertedLists(il, args.l0, args.l1) il.crop_invlists(args.l0, args.l1) ils_dont_dealloc.append(il) ils.push_back(il) if index0 is None: index0 = index print("loaded %d invlists" % ils.size())
def set_prefetch_nthread(self, nt): for idx in self.indexes: il = faiss.downcast_InvertedLists( faiss.extract_index_ivf(idx).invlists) il.prefetch_nthread il.prefetch_nthread = nt