ps = faiss.ParameterSpace() ps.initialize(index) # make sure queries are in RAM xq = xq.astype('float32').copy() # a static C++ object that collects statistics about searches ivfpq_stats = faiss.cvar.indexIVFPQ_stats if parametersets == ['autotune'] or parametersets == ['autotuneMT']: if parametersets == ['autotune']: faiss.omp_set_num_threads(1) # setup the Criterion object: optimize for 1-R@1 crit = faiss.OneRecallAtRCriterion(nq, 1) # by default, the criterion will request only 1 NN crit.nnn = 100 crit.set_groundtruth(None, gt.astype('int64')) # then we let Faiss find the optimal parameters by itself print("exploring operating points") t0 = time.time() op = ps.explore(index, xq, crit) print("Done in %.3f s, available OPs:" % (time.time() - t0)) # opv is a C++ vector, so it cannot be accessed like a Python array opv = op.optimal_pts print("%-40s 1-R@1 time" % "Parameters") for i in range(opv.size()):
xt = fvecs_read("sift1M/sift_learn.fvecs") xb = fvecs_read("sift1M/sift_base.fvecs") xq = fvecs_read("sift1M/sift_query.fvecs") d = xt.shape[1] print "load GT" gt = ivecs_read("sift1M/sift_groundtruth.ivecs") gt = gt.astype('int64') k = gt.shape[1] print "prepare criterion" # criterion = 1-recall at 1 crit = faiss.OneRecallAtRCriterion(xq.shape[0], 1) crit.set_groundtruth(None, gt) crit.nnn = k # indexes that are useful when there is no limitation on memory usage unlimited_mem_keys = [ "IMI2x10,Flat", "IMI2x11,Flat", "IVF4096,Flat", "IVF16384,Flat", "PCA64,IMI2x10,Flat" ] # memory limited to 16 bytes / vector keys_mem_16 = [ 'IMI2x10,PQ16', 'IVF4096,PQ16', 'IMI2x10,PQ8+8', 'OPQ16_64,IMI2x10,PQ16' ] # limited to 32 bytes / vector