<divclass="line"><aname="l00002"></a><spanclass="lineno"> 2</span> <spanclass="comment"> * Copyright (c) Facebook, Inc. and its affiliates.</span></div>
<divclass="line"><aname="l00004"></a><spanclass="lineno"> 4</span> <spanclass="comment"> * This source code is licensed under the MIT license found in the</span></div>
<divclass="line"><aname="l00005"></a><spanclass="lineno"> 5</span> <spanclass="comment"> * LICENSE file in the root directory of this source tree.</span></div>
<divclass="line"><aname="l00026"></a><spanclass="lineno"> 26</span> <spanclass="comment">/** Encapsulates a quantizer object for the IndexIVF</span></div>
<divclass="line"><aname="l00028"></a><spanclass="lineno"> 28</span> <spanclass="comment"> * The class isolates the fields that are independent of the storage</span></div>
<divclass="line"><aname="l00029"></a><spanclass="lineno"> 29</span> <spanclass="comment"> * of the lists (especially training)</span></div>
<divclass="line"><aname="l00032"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1Level1Quantizer.html#a3cf99e2ee92b8558a066f821efab95d5"> 32</a></span> <aclass="code"href="structfaiss_1_1Index.html">Index</a> * <aclass="code"href="structfaiss_1_1Level1Quantizer.html#a3cf99e2ee92b8558a066f821efab95d5">quantizer</a>; <spanclass="comment">///< quantizer that maps vectors to inverted lists</span></div>
<divclass="line"><aname="l00033"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1Level1Quantizer.html#a1c4fc9d874d9492ee0ea27a5be388fa7"> 33</a></span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1Level1Quantizer.html#a1c4fc9d874d9492ee0ea27a5be388fa7">nlist</a>; <spanclass="comment">///< number of possible key values</span></div>
<divclass="line"><aname="l00036"></a><spanclass="lineno"> 36</span> <spanclass="comment"> * = 0: use the quantizer as index in a kmeans training</span></div>
<divclass="line"><aname="l00037"></a><spanclass="lineno"> 37</span> <spanclass="comment"> * = 1: just pass on the training set to the train() of the quantizer</span></div>
<divclass="line"><aname="l00038"></a><spanclass="lineno"> 38</span> <spanclass="comment"> * = 2: kmeans training on a flat index + add the centroids to the quantizer</span></div>
<divclass="line"><aname="l00043"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1Level1Quantizer.html#abb7097ed40b15ba0af08af6d03608f72"> 43</a></span> <aclass="code"href="structfaiss_1_1ClusteringParameters.html">ClusteringParameters</a><aclass="code"href="structfaiss_1_1Level1Quantizer.html#abb7097ed40b15ba0af08af6d03608f72">cp</a>; <spanclass="comment">///< to override default clustering params</span></div>
<divclass="line"><aname="l00044"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1Level1Quantizer.html#a45d29dd6a5c53789c08e5ceb3f63d989"> 44</a></span> <spanclass="comment"></span><aclass="code"href="structfaiss_1_1Index.html">Index</a> *<aclass="code"href="structfaiss_1_1Level1Quantizer.html#a45d29dd6a5c53789c08e5ceb3f63d989">clustering_index</a>; <spanclass="comment">///< to override index used during clustering</span></div>
<divclass="line"><aname="l00046"></a><spanclass="lineno"> 46</span> <spanclass="comment"> /// Trains the quantizer and calls train_residual to train sub-quantizers</span></div>
<divclass="line"><aname="l00047"></a><spanclass="lineno"> 47</span> <spanclass="comment"></span><spanclass="keywordtype">void</span><aclass="code"href="structfaiss_1_1Level1Quantizer.html#a0069a6ee1e32c2e0c1c7df9a95740dd4">train_q1</a> (<spanclass="keywordtype">size_t</span> n, <spanclass="keyword">const</span><spanclass="keywordtype">float</span> *x, <spanclass="keywordtype">bool</span> verbose,</div>
<divclass="line"><aname="l00061"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IVFSearchParameters.html#a1183c0b7d9ffd5154b32765175f2a9cc"> 61</a></span> <spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1IVFSearchParameters.html#a1183c0b7d9ffd5154b32765175f2a9cc">nprobe</a>; <spanclass="comment">///< number of probes at query time</span></div>
<divclass="line"><aname="l00062"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IVFSearchParameters.html#ac3e01728f6376ad727340525b2138782"> 62</a></span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1IVFSearchParameters.html#ac3e01728f6376ad727340525b2138782">max_codes</a>; <spanclass="comment">///< max nb of codes to visit to do a query</span></div>
<divclass="line"><aname="l00072"></a><spanclass="lineno"> 72</span> <spanclass="comment"> * In the inverted file, the quantizer (an Index instance) provides a</span></div>
<divclass="line"><aname="l00073"></a><spanclass="lineno"> 73</span> <spanclass="comment"> * quantization index for each vector to be added. The quantization</span></div>
<divclass="line"><aname="l00074"></a><spanclass="lineno"> 74</span> <spanclass="comment"> * index maps to a list (aka inverted list or posting list), where the</span></div>
<divclass="line"><aname="l00075"></a><spanclass="lineno"> 75</span> <spanclass="comment"> * id of the vector is stored.</span></div>
<divclass="line"><aname="l00077"></a><spanclass="lineno"> 77</span> <spanclass="comment"> * The inverted list object is required only after trainng. If none is</span></div>
<divclass="line"><aname="l00078"></a><spanclass="lineno"> 78</span> <spanclass="comment"> * set externally, an ArrayInvertedLists is used automatically.</span></div>
<divclass="line"><aname="l00080"></a><spanclass="lineno"> 80</span> <spanclass="comment"> * At search time, the vector to be searched is also quantized, and</span></div>
<divclass="line"><aname="l00081"></a><spanclass="lineno"> 81</span> <spanclass="comment"> * only the list corresponding to the quantization index is</span></div>
<divclass="line"><aname="l00082"></a><spanclass="lineno"> 82</span> <spanclass="comment"> * searched. This speeds up the search by making it</span></div>
<divclass="line"><aname="l00083"></a><spanclass="lineno"> 83</span> <spanclass="comment"> * non-exhaustive. This can be relaxed using multi-probe search: a few</span></div>
<divclass="line"><aname="l00084"></a><spanclass="lineno"> 84</span> <spanclass="comment"> * (nprobe) quantization indices are selected and several inverted</span></div>
<divclass="line"><aname="l00085"></a><spanclass="lineno"> 85</span> <spanclass="comment"> * lists are visited.</span></div>
<divclass="line"><aname="l00087"></a><spanclass="lineno"> 87</span> <spanclass="comment"> * Sub-classes implement a post-filtering of the index that refines</span></div>
<divclass="line"><aname="l00088"></a><spanclass="lineno"> 88</span> <spanclass="comment"> * the distance estimation from the query to databse vectors.</span></div>
<divclass="line"><aname="l00095"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f"> 95</a></span> <spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>; <spanclass="comment">///< code size per vector in bytes</span></div>
<divclass="line"><aname="l00097"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58"> 97</a></span> <spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>; <spanclass="comment">///< number of probes at query time</span></div>
<divclass="line"><aname="l00098"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IndexIVF.html#a7f2dd34f66f8770acba74a0a591fa4a8"> 98</a></span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span><aclass="code"href="structfaiss_1_1IndexIVF.html#a7f2dd34f66f8770acba74a0a591fa4a8">max_codes</a>; <spanclass="comment">///< max nb of codes to visit to do a query</span></div>
<divclass="line"><aname="l00100"></a><spanclass="lineno"> 100</span> <spanclass="comment"> /** Parallel mode determines how queries are parallelized with OpenMP</span></div>
<divclass="line"><aname="l00108"></a><spanclass="lineno"> 108</span> <spanclass="comment"> /// map for direct access to the elements. Enables reconstruct().</span></div>
<divclass="line"><aname="l00112"></a><spanclass="lineno"> 112</span> <spanclass="comment"> /** The Inverted file takes a quantizer (an Index) on input,</span></div>
<divclass="line"><aname="l00113"></a><spanclass="lineno"> 113</span> <spanclass="comment"> * which implements the function mapping a vector to a list</span></div>
<divclass="line"><aname="l00114"></a><spanclass="lineno"> 114</span> <spanclass="comment"> * identifier. The pointer is borrowed: the quantizer should not</span></div>
<divclass="line"><aname="l00115"></a><spanclass="lineno"> 115</span> <spanclass="comment"> * be deleted while the IndexIVF is in use.</span></div>
<divclass="line"><aname="l00123"></a><spanclass="lineno"> 123</span> <spanclass="comment"> /// Trains the quantizer and calls train_residual to train sub-quantizers</span></div>
<divclass="line"><aname="l00124"></a><spanclass="lineno"> 124</span> <spanclass="comment"></span><spanclass="keywordtype">void</span><aclass="code"href="structfaiss_1_1IndexIVF.html#a7a1d5eec194db0977b2318c6ed6a2b86">train</a>(idx_t n, <spanclass="keyword">const</span><spanclass="keywordtype">float</span>* x) <spanclass="keyword">override</span>;</div>
<divclass="line"><aname="l00132"></a><spanclass="lineno"> 132</span> <spanclass="comment"> /** Encodes a set of vectors as they would appear in the inverted lists</span></div>
<divclass="line"><aname="l00134"></a><spanclass="lineno"> 134</span> <spanclass="comment"> * @param list_nos inverted list ids as returned by the</span></div>
<divclass="line"><aname="l00135"></a><spanclass="lineno"> 135</span> <spanclass="comment"> * quantizer (size n). -1s are ignored.</span></div>
<divclass="line"><aname="l00138"></a><spanclass="lineno"> 138</span> <spanclass="keyword">virtual</span><spanclass="keywordtype">void</span><aclass="code"href="structfaiss_1_1IndexIVF.html#a2f16f939a418d8e58ff43f4ee0dc17cc">encode_vectors</a>(idx_t n, <spanclass="keyword">const</span><spanclass="keywordtype">float</span>* x,</div>
<divclass="line"><aname="l00142"></a><spanclass="lineno"> 142</span> <spanclass="comment"> /// Sub-classes that encode the residuals can train their encoders here</span></div>
<divclass="line"><aname="l00143"></a><spanclass="lineno"> 143</span> <spanclass="comment"> /// does nothing by default</span></div>
<divclass="line"><aname="l00144"></a><spanclass="lineno"> 144</span> <spanclass="comment"></span><spanclass="keyword">virtual</span><spanclass="keywordtype">void</span><aclass="code"href="structfaiss_1_1IndexIVF.html#a567ef760fd09d09ce2ee4f4e6c2d7280">train_residual</a> (idx_t n, <spanclass="keyword">const</span><spanclass="keywordtype">float</span> *x);</div>
<divclass="line"><aname="l00146"></a><spanclass="lineno"> 146</span> <spanclass="comment"> /** search a set of vectors, that are pre-quantized by the IVF</span></div>
<divclass="line"><aname="l00147"></a><spanclass="lineno"> 147</span> <spanclass="comment"> * quantizer. Fill in the corresponding heaps with the query</span></div>
<divclass="line"><aname="l00148"></a><spanclass="lineno"> 148</span> <spanclass="comment"> * results. The default implementation uses InvertedListScanners</span></div>
<divclass="line"><aname="l00149"></a><spanclass="lineno"> 149</span> <spanclass="comment"> * to do the search.</span></div>
<divclass="line"><aname="l00159"></a><spanclass="lineno"> 159</span> <spanclass="comment"> * @param store_pairs store inv list index + inv list offset</span></div>
<divclass="line"><aname="l00160"></a><spanclass="lineno"> 160</span> <spanclass="comment"> * instead in upper/lower 32 bit of result,</span></div>
<divclass="line"><aname="l00161"></a><spanclass="lineno"> 161</span> <spanclass="comment"> * instead of ids (used for reranking).</span></div>
<divclass="line"><aname="l00162"></a><spanclass="lineno"> 162</span> <spanclass="comment"> * @param params used to override the object's search parameters</span></div>
<divclass="line"><aname="l00172"></a><spanclass="lineno"> 172</span> <spanclass="comment"> /** assign the vectors, then call search_preassign */</span></div>
<divclass="line"><aname="l00173"></a><spanclass="lineno"> 173</span> <spanclass="keywordtype">void</span><aclass="code"href="structfaiss_1_1IndexIVF.html#ae2fd47b7d52603659e269aa8f6abb613">search</a> (idx_t n, <spanclass="keyword">const</span><spanclass="keywordtype">float</span> *x, idx_t k,</div>
<divclass="line"><aname="l00183"></a><spanclass="lineno"> 183</span> <spanclass="comment"> /// get a scanner for this index (store_pairs means ignore labels)</span></div>
<divclass="line"><aname="l00189"></a><spanclass="lineno"> 189</span> <spanclass="comment"> /** Reconstruct a subset of the indexed vectors.</span></div>
<divclass="line"><aname="l00200"></a><spanclass="lineno"> 200</span> <spanclass="comment"> /** Similar to search, but also reconstructs the stored vectors (or an</span></div>
<divclass="line"><aname="l00201"></a><spanclass="lineno"> 201</span> <spanclass="comment"> * approximation in the case of lossy coding) for the search results.</span></div>
<divclass="line"><aname="l00203"></a><spanclass="lineno"> 203</span> <spanclass="comment"> * Overrides default implementation to avoid having to maintain direct_map</span></div>
<divclass="line"><aname="l00204"></a><spanclass="lineno"> 204</span> <spanclass="comment"> * and instead fetch the code offsets through the `store_pairs` flag in</span></div>
<divclass="line"><aname="l00213"></a><spanclass="lineno"> 213</span> <spanclass="comment"> /** Reconstruct a vector given the location in terms of (inv list index +</span></div>
<divclass="line"><aname="l00214"></a><spanclass="lineno"> 214</span> <spanclass="comment"> * inv list offset) instead of the id.</span></div>
<divclass="line"><aname="l00216"></a><spanclass="lineno"> 216</span> <spanclass="comment"> * Useful for reconstructing when the direct_map is not maintained and</span></div>
<divclass="line"><aname="l00217"></a><spanclass="lineno"> 217</span> <spanclass="comment"> * the inv list offset is computed by search_preassigned() with</span></div>
<divclass="line"><aname="l00228"></a><spanclass="lineno"> 228</span> <spanclass="comment"> /** check that the two indexes are compatible (ie, they are</span></div>
<divclass="line"><aname="l00229"></a><spanclass="lineno"> 229</span> <spanclass="comment"> * trained in the same way and have the same</span></div>
<divclass="line"><aname="l00233"></a><spanclass="lineno"> 233</span> <spanclass="comment"> /** moves the entries from another dataset to self. On output,</span></div>
<divclass="line"><aname="l00234"></a><spanclass="lineno"> 234</span> <spanclass="comment"> * other is empty. add_id is added to all moved ids (for</span></div>
<divclass="line"><aname="l00235"></a><spanclass="lineno"> 235</span> <spanclass="comment"> * sequential ids, this would be this->ntotal */</span></div>
<divclass="line"><aname="l00238"></a><spanclass="lineno"> 238</span> <spanclass="comment"> /** copy a subset of the entries index to the other index</span></div>
<divclass="line"><aname="l00240"></a><spanclass="lineno"> 240</span> <spanclass="comment"> * if subset_type == 0: copies ids in [a1, a2)</span></div>
<divclass="line"><aname="l00241"></a><spanclass="lineno"> 241</span> <spanclass="comment"> * if subset_type == 1: copies ids if id % a1 == a2</span></div>
<divclass="line"><aname="l00242"></a><spanclass="lineno"> 242</span> <spanclass="comment"> * if subset_type == 2: copies inverted lists such that a1</span></div>
<divclass="line"><aname="l00243"></a><spanclass="lineno"> 243</span> <spanclass="comment"> * elements are left before and a2 elements are after</span></div>
<divclass="line"><aname="l00255"></a><spanclass="lineno"> 255</span> <spanclass="comment"> * @param new_maintain_direct_map if true, create a direct map,</span></div>
<divclass="line"><aname="l00260"></a><spanclass="lineno"> 260</span> <spanclass="comment"> /// replace the inverted lists, old one is deallocated if own_invlists</span></div>
<divclass="line"><aname="l00268"></a><spanclass="lineno"> 268</span> <spanclass="comment">/** Object that handles a query. The inverted lists to scan are</span></div>
<divclass="line"><aname="l00269"></a><spanclass="lineno"> 269</span> <spanclass="comment"> * provided externally. The object has a lot of state, but</span></div>
<divclass="line"><aname="l00270"></a><spanclass="lineno"> 270</span> <spanclass="comment"> * distance_to_code and scan_codes can be called in multiple</span></div>
<divclass="line"><aname="l00279"></a><spanclass="lineno"> 279</span> <spanclass="comment"> /// following codes come from this inverted list</span></div>
<divclass="line"><aname="l00282"></a><spanclass="lineno"> 282</span> <spanclass="comment"> /// compute a single query-to-code distance</span></div>
<divclass="line"><aname="l00285"></a><spanclass="lineno"> 285</span> <spanclass="comment"> /** scan a set of codes, compute distances to current query and</span></div>
<divclass="line"><aname="l00286"></a><spanclass="lineno"> 286</span> <spanclass="comment"> * update heap of results if necessary.</span></div>
<divclass="line"><aname="l00293"></a><spanclass="lineno"> 293</span> <spanclass="comment"> * @param k heap size</span></div>
<divclass="line"><aname="l00294"></a><spanclass="lineno"> 294</span> <spanclass="comment"> * @return number of heap updates performed</span></div>
<divclass="line"><aname="l00302"></a><spanclass="lineno"> 302</span> <spanclass="comment"> /** scan a set of codes, compute distances to current query and</span></div>
<divclass="line"><aname="l00303"></a><spanclass="lineno"> 303</span> <spanclass="comment"> * update results if distances are below radius</span></div>
<divclass="line"><aname="l00318"></a><spanclass="lineno"> 318</span> <spanclass="keywordtype">size_t</span> nq; <spanclass="comment">// nb of queries run</span></div>
<divclass="line"><aname="l00319"></a><spanclass="lineno"> 319</span> <spanclass="keywordtype">size_t</span> nlist; <spanclass="comment">// nb of inverted lists scanned</span></div>
<divclass="line"><aname="l00320"></a><spanclass="lineno"> 320</span> <spanclass="keywordtype">size_t</span> ndis; <spanclass="comment">// nb of distancs computed</span></div>
<divclass="line"><aname="l00321"></a><spanclass="lineno"> 321</span> <spanclass="keywordtype">size_t</span> nheap_updates; <spanclass="comment">// nb of times the heap was updated</span></div>
<divclass="line"><aname="l00322"></a><spanclass="lineno"> 322</span> <spanclass="keywordtype">double</span> quantization_time; <spanclass="comment">// time spent quantizing vectors (in ms)</span></div>
<divclass="line"><aname="l00323"></a><spanclass="lineno"> 323</span> <spanclass="keywordtype">double</span> search_time; <spanclass="comment">// time spent searching lists (in ms)</span></div>
<divclass="ttc"id="structfaiss_1_1RangeQueryResult_html"><divclass="ttname"><ahref="structfaiss_1_1RangeQueryResult.html">faiss::RangeQueryResult</a></div><divclass="ttdoc">result structure for a single query </div><divclass="ttdef"><b>Definition:</b><ahref="AuxIndexStructures_8h_source.html#l00138">AuxIndexStructures.h:138</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_affed235eadf27a13d753ee4d33a1dc58"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">faiss::IndexIVF::nprobe</a></div><divclass="ttdeci">size_t nprobe</div><divclass="ttdoc">number of probes at query time </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00097">IndexIVF.h:97</a></div></div>
<divclass="ttc"id="structfaiss_1_1Index_html_a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c"><divclass="ttname"><ahref="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">faiss::Index::assign</a></div><divclass="ttdeci">void assign(idx_t n, const float *x, idx_t *labels, idx_t k=1)</div><divclass="ttdef"><b>Definition:</b><ahref="Index_8cpp_source.html#l00034">Index.cpp:34</a></div></div>
<divclass="ttc"id="structfaiss_1_1InvertedLists_html_a9bd256053ee360473842105460fe285f"><divclass="ttname"><ahref="structfaiss_1_1InvertedLists.html#a9bd256053ee360473842105460fe285f">faiss::InvertedLists::list_size</a></div><divclass="ttdeci">virtual size_t list_size(size_t list_no) const =0</div><divclass="ttdoc">get the size of a list </div></div>
<divclass="ttc"id="structfaiss_1_1Index_html_ad3f0d3071f987baabbdd3da4500c87ea"><divclass="ttname"><ahref="structfaiss_1_1Index.html#ad3f0d3071f987baabbdd3da4500c87ea">faiss::Index::idx_t</a></div><divclass="ttdeci">long idx_t</div><divclass="ttdoc">all indices are this type </div><divclass="ttdef"><b>Definition:</b><ahref="Index_8h_source.html#l00062">Index.h:62</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a7a1d5eec194db0977b2318c6ed6a2b86"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a7a1d5eec194db0977b2318c6ed6a2b86">faiss::IndexIVF::train</a></div><divclass="ttdeci">void train(idx_t n, const float *x) override</div><divclass="ttdoc">Trains the quantizer and calls train_residual to train sub-quantizers. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00688">IndexIVF.cpp:688</a></div></div>
<divclass="ttc"id="structfaiss_1_1InvertedListScanner_html_ae801ea7ba0086a05ace3b779c3acf305"><divclass="ttname"><ahref="structfaiss_1_1InvertedListScanner.html#ae801ea7ba0086a05ace3b779c3acf305">faiss::InvertedListScanner::set_list</a></div><divclass="ttdeci">virtual void set_list(idx_t list_no, float coarse_dis)=0</div><divclass="ttdoc">following codes come from this inverted list </div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a14e75169bddcd0251134821416b060a1"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a14e75169bddcd0251134821416b060a1">faiss::IndexIVF::add_with_ids</a></div><divclass="ttdeci">void add_with_ids(idx_t n, const float *x, const idx_t *xids) override</div><divclass="ttdoc">default implementation that calls encode_vectors </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00149">IndexIVF.cpp:149</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_abdf74276df83acf76023f105516fe881"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#abdf74276df83acf76023f105516fe881">faiss::IndexIVF::get_InvertedListScanner</a></div><divclass="ttdeci">virtual InvertedListScanner * get_InvertedListScanner(bool store_pairs=false) const </div><divclass="ttdoc">get a scanner for this index (store_pairs means ignore labels) </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00556">IndexIVF.cpp:556</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a4eb943aeb7df30d44ad9b665452bfcf7"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a4eb943aeb7df30d44ad9b665452bfcf7">faiss::IndexIVF::replace_invlists</a></div><divclass="ttdeci">void replace_invlists(InvertedLists *il, bool own=false)</div><divclass="ttdoc">replace the inverted lists, old one is deallocated if own_invlists </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00735">IndexIVF.cpp:735</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a47a3b7665e9d2be41c6d3b2e9144b73f"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a47a3b7665e9d2be41c6d3b2e9144b73f">faiss::IndexIVF::reset</a></div><divclass="ttdeci">void reset() override</div><divclass="ttdoc">removes all elements from the database. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00640">IndexIVF.cpp:640</a></div></div>
<divclass="ttc"id="structfaiss_1_1Level1Quantizer_html_a45d29dd6a5c53789c08e5ceb3f63d989"><divclass="ttname"><ahref="structfaiss_1_1Level1Quantizer.html#a45d29dd6a5c53789c08e5ceb3f63d989">faiss::Level1Quantizer::clustering_index</a></div><divclass="ttdeci">Index * clustering_index</div><divclass="ttdoc">to override index used during clustering </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00044">IndexIVF.h:44</a></div></div>
<divclass="ttc"id="structfaiss_1_1Level1Quantizer_html_a0069a6ee1e32c2e0c1c7df9a95740dd4"><divclass="ttname"><ahref="structfaiss_1_1Level1Quantizer.html#a0069a6ee1e32c2e0c1c7df9a95740dd4">faiss::Level1Quantizer::train_q1</a></div><divclass="ttdeci">void train_q1(size_t n, const float *x, bool verbose, MetricType metric_type)</div><divclass="ttdoc">Trains the quantizer and calls train_residual to train sub-quantizers. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00060">IndexIVF.cpp:60</a></div></div>
<divclass="ttc"id="structfaiss_1_1IVFSearchParameters_html_a1183c0b7d9ffd5154b32765175f2a9cc"><divclass="ttname"><ahref="structfaiss_1_1IVFSearchParameters.html#a1183c0b7d9ffd5154b32765175f2a9cc">faiss::IVFSearchParameters::nprobe</a></div><divclass="ttdeci">size_t nprobe</div><divclass="ttdoc">number of probes at query time </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00061">IndexIVF.h:61</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_aa0e8fc5e04cbd8e0dde61f98bc7dd0bc"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#aa0e8fc5e04cbd8e0dde61f98bc7dd0bc">faiss::IndexIVF::invlists</a></div><divclass="ttdeci">InvertedLists * invlists</div><divclass="ttdoc">Acess to the actual data. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00092">IndexIVF.h:92</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a821002a9d3a1a74dc8d6f6072eca4075"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a821002a9d3a1a74dc8d6f6072eca4075">faiss::IndexIVF::add</a></div><divclass="ttdeci">void add(idx_t n, const float *x) override</div><divclass="ttdoc">Calls add_with_ids with NULL ids. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8cpp_source.html#l00143">IndexIVF.cpp:143</a></div></div>
<divclass="ttc"id="structfaiss_1_1IVFSearchParameters_html_ac3e01728f6376ad727340525b2138782"><divclass="ttname"><ahref="structfaiss_1_1IVFSearchParameters.html#ac3e01728f6376ad727340525b2138782">faiss::IVFSearchParameters::max_codes</a></div><divclass="ttdeci">size_t max_codes</div><divclass="ttdoc">max nb of codes to visit to do a query </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00062">IndexIVF.h:62</a></div></div>
<divclass="ttc"id="structfaiss_1_1Level1Quantizer_html_a3cf99e2ee92b8558a066f821efab95d5"><divclass="ttname"><ahref="structfaiss_1_1Level1Quantizer.html#a3cf99e2ee92b8558a066f821efab95d5">faiss::Level1Quantizer::quantizer</a></div><divclass="ttdeci">Index * quantizer</div><divclass="ttdoc">quantizer that maps vectors to inverted lists </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00032">IndexIVF.h:32</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a7f2dd34f66f8770acba74a0a591fa4a8"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a7f2dd34f66f8770acba74a0a591fa4a8">faiss::IndexIVF::max_codes</a></div><divclass="ttdeci">size_t max_codes</div><divclass="ttdoc">max nb of codes to visit to do a query </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00098">IndexIVF.h:98</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_aedd0c14b5654295b291638ec7f9f9517"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#aedd0c14b5654295b291638ec7f9f9517">faiss::IndexIVF::maintain_direct_map</a></div><divclass="ttdeci">bool maintain_direct_map</div><divclass="ttdoc">map for direct access to the elements. Enables reconstruct(). </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00109">IndexIVF.h:109</a></div></div>
<divclass="ttc"id="structfaiss_1_1Level1Quantizer_html_ab688c629cd42122d73517078b87f483d"><divclass="ttname"><ahref="structfaiss_1_1Level1Quantizer.html#ab688c629cd42122d73517078b87f483d">faiss::Level1Quantizer::own_fields</a></div><divclass="ttdeci">bool own_fields</div><divclass="ttdoc">whether object owns the quantizer </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00041">IndexIVF.h:41</a></div></div>
<divclass="ttc"id="structfaiss_1_1InvertedListScanner_html_a97cab8fbf8203bdda6c42fc4b8f92319"><divclass="ttname"><ahref="structfaiss_1_1InvertedListScanner.html#a97cab8fbf8203bdda6c42fc4b8f92319">faiss::InvertedListScanner::set_query</a></div><divclass="ttdeci">virtual void set_query(const float *query_vector)=0</div><divclass="ttdoc">from now on we handle this query. </div></div>
<divclass="ttc"id="structfaiss_1_1Level1Quantizer_html_a1c4fc9d874d9492ee0ea27a5be388fa7"><divclass="ttname"><ahref="structfaiss_1_1Level1Quantizer.html#a1c4fc9d874d9492ee0ea27a5be388fa7">faiss::Level1Quantizer::nlist</a></div><divclass="ttdeci">size_t nlist</div><divclass="ttdoc">number of possible key values </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00033">IndexIVF.h:33</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexIVF_html_a46d1aeddb60643c5b3f096147c3e028f"><divclass="ttname"><ahref="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">faiss::IndexIVF::code_size</a></div><divclass="ttdeci">size_t code_size</div><divclass="ttdoc">code size per vector in bytes </div><divclass="ttdef"><b>Definition:</b><ahref="IndexIVF_8h_source.html#l00095">IndexIVF.h:95</a></div></div>
<divclass="ttc"id="namespacefaiss_html_afd12191c638da74760ff397cf319752c"><divclass="ttname"><ahref="namespacefaiss.html#afd12191c638da74760ff397cf319752c">faiss::MetricType</a></div><divclass="ttdeci">MetricType</div><divclass="ttdoc">Some algorithms support both an inner product version and a L2 search version. </div><divclass="ttdef"><b>Definition:</b><ahref="Index_8h_source.html#l00044">Index.h:44</a></div></div>