<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="l00024"></a><spanclass="lineno"> 24</span> <spanclass="comment">/** Index based on a product quantizer. Stored vectors are</span></div>
<divclass="line"><aname="l00025"></a><spanclass="lineno"> 25</span> <spanclass="comment"> * approximated by PQ codes. */</span></div>
<divclass="line"><aname="l00028"></a><spanclass="lineno"> 28</span> <spanclass="comment"> /// The product quantizer used to encode the vectors</span></div>
<divclass="line"><aname="l00036"></a><spanclass="lineno"> 36</span> <spanclass="comment"> * @param d dimensionality of the input vectors</span></div>
<divclass="line"><aname="l00037"></a><spanclass="lineno"> 37</span> <spanclass="comment"> * @param M number of subquantizers</span></div>
<divclass="line"><aname="l00038"></a><spanclass="lineno"> 38</span> <spanclass="comment"> * @param nbits number of bit per subvector index</span></div>
<divclass="line"><aname="l00040"></a><spanclass="lineno"> 40</span> <aclass="code"href="structfaiss_1_1IndexPQ.html">IndexPQ</a> (<spanclass="keywordtype">int</span><aclass="code"href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, <spanclass="comment">///< dimensionality of the input vectors</span></div>
<divclass="line"><aname="l00041"></a><spanclass="lineno"> 41</span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span> M, <spanclass="comment">///< number of subquantizers</span></div>
<divclass="line"><aname="l00042"></a><spanclass="lineno"> 42</span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span> nbits, <spanclass="comment">///< number of bit per subvector index</span></div>
<divclass="line"><aname="l00071"></a><spanclass="lineno"> 71</span> <spanclass="comment"> /// parameters used for the polysemous training</span></div>
<divclass="line"><aname="l00074"></a><spanclass="lineno"> 74</span> <spanclass="comment"> /// how to perform the search in search_core</span></div>
<divclass="line"><aname="l00077"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718"> 77</a></span> <spanclass="comment"></span><aclass="code"href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718">ST_HE</a>, <spanclass="comment">///< Hamming distance on codes</span></div>
<divclass="line"><aname="l00078"></a><spanclass="lineno"><aclass="line"href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6"> 78</a></span> <spanclass="comment"></span><aclass="code"href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6">ST_generalized_HE</a>, <spanclass="comment">///< nb of same codes</span></div>
<divclass="line"><aname="l00086"></a><spanclass="lineno"> 86</span> <spanclass="comment">// just encode the sign of the components, instead of using the PQ encoder</span></div>
<divclass="line"><aname="l00087"></a><spanclass="lineno"> 87</span> <spanclass="comment">// used only for the queries</span></div>
<divclass="line"><aname="l00097"></a><spanclass="lineno"> 97</span> <spanclass="comment"> /// prepare query for a polysemous search, but instead of</span></div>
<divclass="line"><aname="l00098"></a><spanclass="lineno"> 98</span> <spanclass="comment"> /// computing the result, just get the histogram of Hamming</span></div>
<divclass="line"><aname="l00099"></a><spanclass="lineno"> 99</span> <spanclass="comment"> /// distances. May be computed on a provided dataset if xb != NULL</span></div>
<divclass="line"><aname="l00105"></a><spanclass="lineno"> 105</span> <spanclass="comment"> /** compute pairwise distances between queries and database</span></div>
<divclass="line"><aname="l00117"></a><spanclass="lineno"> 117</span> <spanclass="comment">/// statistics are robust to internal threading, but not if</span></div>
<divclass="line"><aname="l00118"></a><spanclass="lineno"> 118</span> <spanclass="comment">/// IndexPQ::search is called by multiple threads</span></div>
<divclass="line"><aname="l00120"></a><spanclass="lineno"> 120</span> <spanclass="keywordtype">size_t</span> nq; <spanclass="comment">// nb of queries run</span></div>
<divclass="line"><aname="l00121"></a><spanclass="lineno"> 121</span> <spanclass="keywordtype">size_t</span> ncode; <spanclass="comment">// nb of codes visited</span></div>
<divclass="line"><aname="l00133"></a><spanclass="lineno"> 133</span> <spanclass="comment">/** Quantizer where centroids are virtual: they are the Cartesian</span></div>
<divclass="line"><aname="l00134"></a><spanclass="lineno"> 134</span> <spanclass="comment"> * product of sub-centroids. */</span></div>
<divclass="line"><aname="l00138"></a><spanclass="lineno"> 138</span> <aclass="code"href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> (<spanclass="keywordtype">int</span><aclass="code"href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, <spanclass="comment">///< dimension of the input vectors</span></div>
<divclass="line"><aname="l00139"></a><spanclass="lineno"> 139</span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span> M, <spanclass="comment">///< number of subquantizers</span></div>
<divclass="line"><aname="l00140"></a><spanclass="lineno"> 140</span> <spanclass="comment"></span><spanclass="keywordtype">size_t</span> nbits); <spanclass="comment">///< number of bit per subvector index</span></div>
<divclass="line"><aname="l00158"></a><spanclass="lineno"> 158</span> <spanclass="comment">/** MultiIndexQuantizer where the PQ assignmnet is performed by sub-indexes</span></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718">faiss::IndexPQ::ST_HE</a></div><divclass="ttdoc">Hamming distance on codes. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00077">IndexPQ.h:77</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_af616e1f3c7bff7f62c2607b8079da43f"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#af616e1f3c7bff7f62c2607b8079da43f">faiss::IndexPQ::do_polysemous_training</a></div><divclass="ttdeci">bool do_polysemous_training</div><divclass="ttdoc">false = standard PQ </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00069">IndexPQ.h:69</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a87898add5ab4d86ba901ca79778fc11e"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a87898add5ab4d86ba901ca79778fc11e">faiss::IndexPQ::train</a></div><divclass="ttdeci">void train(idx_t n, const float *x) override</div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00052">IndexPQ.cpp:52</a></div></div>
<divclass="ttc"id="structfaiss_1_1MultiIndexQuantizer_html_a4808ce22fcc95c7af902b97969f2a90d"><divclass="ttname"><ahref="structfaiss_1_1MultiIndexQuantizer.html#a4808ce22fcc95c7af902b97969f2a90d">faiss::MultiIndexQuantizer::reset</a></div><divclass="ttdeci">void reset() override</div><divclass="ttdoc">removes all elements from the database. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00958">IndexPQ.cpp:958</a></div></div>
<divclass="ttc"id="structfaiss_1_1MultiIndexQuantizer_html_a6fa1d1a295eb2d4377b8de5096ab3ef4"><divclass="ttname"><ahref="structfaiss_1_1MultiIndexQuantizer.html#a6fa1d1a295eb2d4377b8de5096ab3ef4">faiss::MultiIndexQuantizer::train</a></div><divclass="ttdeci">void train(idx_t n, const float *x) override</div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00856">IndexPQ.cpp:856</a></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_1IndexPQ_html_ada06f5db85c91a4c140119a5897c6064"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#ada06f5db85c91a4c140119a5897c6064">faiss::IndexPQ::hamming_distance_histogram</a></div><divclass="ttdeci">void hamming_distance_histogram(idx_t n, const float *x, idx_t nb, const float *xb, long *dist_histogram)</div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00411">IndexPQ.cpp:411</a></div></div>
<divclass="ttc"id="structfaiss_1_1MultiIndexQuantizer2_html_a553b9a33e9be7f231ffdc0ac53c59e7c"><divclass="ttname"><ahref="structfaiss_1_1MultiIndexQuantizer2.html#a553b9a33e9be7f231ffdc0ac53c59e7c">faiss::MultiIndexQuantizer2::train</a></div><divclass="ttdeci">void train(idx_t n, const float *x) override</div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l01010">IndexPQ.cpp:1010</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fe"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fe">faiss::IndexPQ::Search_type_t</a></div><divclass="ttdeci">Search_type_t</div><divclass="ttdoc">how to perform the search in search_core </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00075">IndexPQ.h:75</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42feaef79af61798670a362434b7bc9ced45e"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaef79af61798670a362434b7bc9ced45e">faiss::IndexPQ::ST_polysemous_generalize</a></div><divclass="ttdoc">Filter on generalized Hamming. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00081">IndexPQ.h:81</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_aa7b7cfe0c8dfd37c8a940fd93d12dc88"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">faiss::IndexPQ::pq</a></div><divclass="ttdeci">ProductQuantizer pq</div><divclass="ttdoc">The product quantizer used to encode the vectors. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00029">IndexPQ.h:29</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_ac72c9b93f8fe7e5ec27fbe26bb38a7bf"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#ac72c9b93f8fe7e5ec27fbe26bb38a7bf">faiss::IndexPQ::add</a></div><divclass="ttdeci">void add(idx_t n, const float *x) override</div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00076">IndexPQ.cpp:76</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6">faiss::IndexPQ::ST_generalized_HE</a></div><divclass="ttdoc">nb of same codes </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00078">IndexPQ.h:78</a></div></div>
<divclass="ttc"id="structfaiss_1_1PolysemousTraining_html"><divclass="ttname"><ahref="structfaiss_1_1PolysemousTraining.html">faiss::PolysemousTraining</a></div><divclass="ttdoc">optimizes the order of indices in a ProductQuantizer </div><divclass="ttdef"><b>Definition:</b><ahref="PolysemousTraining_8h_source.html#l00121">PolysemousTraining.h:121</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_aa131767383619bb5848b131502ada9cf"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#aa131767383619bb5848b131502ada9cf">faiss::IndexPQ::hamming_distance_table</a></div><divclass="ttdeci">void hamming_distance_table(idx_t n, const float *x, int32_t *dis) const </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00399">IndexPQ.cpp:399</a></div></div>
<divclass="ttc"id="structfaiss_1_1MultiIndexQuantizer_html_aa72640bcbe2e5d9029954c2fa6633453"><divclass="ttname"><ahref="structfaiss_1_1MultiIndexQuantizer.html#aa72640bcbe2e5d9029954c2fa6633453">faiss::MultiIndexQuantizer::add</a></div><divclass="ttdeci">void add(idx_t n, const float *x) override</div><divclass="ttdoc">add and reset will crash at runtime </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00952">IndexPQ.cpp:952</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a25e17da885cf55d84b176b46f3ad25b1"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a25e17da885cf55d84b176b46f3ad25b1">faiss::IndexPQ::reset</a></div><divclass="ttdeci">void reset() override</div><divclass="ttdoc">removes all elements from the database. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8cpp_source.html#l00107">IndexPQ.cpp:107</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_aff455f2adff6064939494dad6e3017bc"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">faiss::IndexPQ::polysemous_ht</a></div><divclass="ttdeci">int polysemous_ht</div><divclass="ttdoc">Hamming threshold used for polysemy. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00091">IndexPQ.h:91</a></div></div>
<divclass="ttc"id="structfaiss_1_1IndexPQ_html_a820cec27d1ef14bf59fb288b2e143b6a"><divclass="ttname"><ahref="structfaiss_1_1IndexPQ.html#a820cec27d1ef14bf59fb288b2e143b6a">faiss::IndexPQ::polysemous_training</a></div><divclass="ttdeci">PolysemousTraining polysemous_training</div><divclass="ttdoc">parameters used for the polysemous training </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00072">IndexPQ.h:72</a></div></div>
<divclass="ttc"id="structfaiss_1_1MultiIndexQuantizer2_html_a7e5f4079fdca73aeab239d3c85c100da"><divclass="ttname"><ahref="structfaiss_1_1MultiIndexQuantizer2.html#a7e5f4079fdca73aeab239d3c85c100da">faiss::MultiIndexQuantizer2::assign_indexes</a></div><divclass="ttdeci">std::vector< Index * > assign_indexes</div><divclass="ttdoc">M Indexes on d / M dimensions. </div><divclass="ttdef"><b>Definition:</b><ahref="IndexPQ_8h_source.html#l00163">IndexPQ.h:163</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>