IndexIVFPQ_8h_source.html 76.5 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>Faiss: /data/users/matthijs/github_faiss/faiss/IndexIVFPQ.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Faiss
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Friends</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">/data/users/matthijs/github_faiss/faiss/IndexIVFPQ.h</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * Copyright (c) 2015-present, Facebook, Inc.</span></div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> * All rights reserved.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * This source code is licensed under the BSD+Patents license found in the</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * LICENSE file in the root directory of this source tree.</span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">// Copyright 2004-present Facebook. All Rights Reserved.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">// -*- c++ -*-</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#ifndef FAISS_INDEX_IVFPQ_H</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define FAISS_INDEX_IVFPQ_H</span></div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &quot;IndexIVF.h&quot;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &quot;IndexPQ.h&quot;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="keyword">namespace </span>faiss {</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;</div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment">/** Inverted file with Product Quantizer encoding. Each residual</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * vector is encoded as a product quantizer code.</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html">   29</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a>: <a class="code" href="structfaiss_1_1IndexIVF.html">IndexIVF</a> {</div>
<div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">   30</a></span>&#160;    <span class="keywordtype">bool</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>;              <span class="comment">///&lt; Encode residual or plain vector?</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">   31</a></span>&#160;<span class="comment"></span>    <span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a>;     <span class="comment">///&lt; if by_residual, build precompute tables</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">   32</a></span>&#160;<span class="comment"></span>    <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>;           <span class="comment">///&lt; produces the codes</span></div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">   34</a></span>&#160;    <span class="keywordtype">bool</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">do_polysemous_training</a>;   <span class="comment">///&lt; reorder PQ centroids after training?</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">   35</a></span>&#160;<span class="comment"></span>    <a class="code" href="structfaiss_1_1PolysemousTraining.html">PolysemousTraining</a> *<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">polysemous_training</a>; <span class="comment">///&lt; if NULL, use default</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="comment">// search-time parameters</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">   38</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">scan_table_threshold</a>;   <span class="comment">///&lt; use table computation or on-the-fly?</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">   39</a></span>&#160;<span class="comment"></span>    <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a>;              <span class="comment">///&lt; max nb of codes to visit to do a query</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">   40</a></span>&#160;<span class="comment"></span>    <span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">polysemous_ht</a>;             <span class="comment">///&lt; Hamming thresh for polysemous filtering</span></div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment">    /// if use_precompute_table</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment">    /// size nlist * pq.M * pq.ksub</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">   45</a></span>&#160;<span class="comment"></span>    std::vector &lt;float&gt; <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>;</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> (</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;            <a class="code" href="structfaiss_1_1Index.html">Index</a> * <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>, <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>,</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;            <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits_per_idx);</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a981c2748bfbd9b018494f119279a0342">add_with_ids</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x, <span class="keyword">const</span> <span class="keywordtype">long</span>* xids = <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        <span class="keyword">override</span>;</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="comment">    /// same as add_core, also:</span></div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">    /// - output 2nd level residuals if residuals_2 != NULL</span></div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment">    /// - use precomputed list numbers if precomputed_idx != NULL</span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b">add_core_o</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x,</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;                     <span class="keyword">const</span> <span class="keywordtype">long</span> *xids, <span class="keywordtype">float</span> *residuals_2,</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;                     <span class="keyword">const</span> <span class="keywordtype">long</span> *precomputed_idx = <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment">    /// trains the product quantizer</span></div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#af6565a5d8bab7be3df19c50d235bd662">train_residual</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="comment">    /// same as train_residual, also output 2nd level residuals</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917">train_residual_o</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, <span class="keywordtype">float</span> *residuals_2);</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="comment">    /** Reconstruct a subset of the indexed vectors</span></div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;<span class="comment">     *</span></div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="comment">     * @param i0     first vector to reconstruct</span></div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="comment">     * @param ni     nb of vectors to reconstruct</span></div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment">     * @param recons output array of reconstructed vectors, size ni * d</span></div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1df10e9e5f4ff0dabf283f19ad94bbd4">reconstruct_n</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i0, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> ni, <span class="keywordtype">float</span>* recons) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a28ce697b1381eb7e7d7d25774a25e175">reconstruct</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> key, <span class="keywordtype">float</span>* recons) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="comment">    /** Find exact duplicates in the dataset.</span></div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="comment">     *</span></div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="comment">     * the duplicates are returned in pre-allocated arrays (see the</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="comment">     * max sizes).</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="comment">     *</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="comment">     * @params lims   limits between groups of duplicates</span></div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="comment">     *                (max size ntotal / 2 + 1)</span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment">     * @params ids    ids[lims[i]] : ids[lims[i+1]-1] is a group of</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment">     *                duplicates (max size ntotal)</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="comment">     * @return n      number of groups found</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#aee355b57acde203a3caed46a93e16a3c">find_duplicates</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *<a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>, <span class="keywordtype">size_t</span> *lims) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    <span class="comment">// map a vector to a binary code knowning the index</span></div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    <span class="keywordtype">void</span> encode (<span class="keywordtype">long</span> key, <span class="keyword">const</span> <span class="keywordtype">float</span> * x, uint8_t * code) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;<span class="comment">    /** Encode multiple vectors</span></div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="comment">     *</span></div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="comment">     * @param n       nb vectors to encode</span></div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="comment">     * @param keys    posting list ids for those vectors (size n)</span></div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment">     * @param x       vectors (size n * d)</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment">     * @param codes   output codes (size n * code_size)</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="comment">     * @param compute_keys  if false, assume keys are precomputed,</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="comment">     *                      otherwise compute them</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1ae6cdd996bbd398fa4e87646c8f3ba6">encode_multiple</a> (<span class="keywordtype">size_t</span> n, <span class="keywordtype">long</span> *keys,</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;                          <span class="keyword">const</span> <span class="keywordtype">float</span> * x, uint8_t * codes,</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;                          <span class="keywordtype">bool</span> compute_keys = <span class="keyword">false</span>) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment">    /// inverse of encode_multiple</span></div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ae1fb0cc3051dec8e322a78c443f8fc9a">decode_multiple</a> (<span class="keywordtype">size_t</span> n, <span class="keyword">const</span> <span class="keywordtype">long</span> *keys,</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;                          <span class="keyword">const</span> uint8_t * xcodes, <span class="keywordtype">float</span> * x) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02">search_preassigned</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;                             <span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *<a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a>,</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;                             <span class="keyword">const</span> <span class="keywordtype">float</span> *centroid_dis,</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                             <span class="keywordtype">float</span> *distances, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *labels,</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                             <span class="keywordtype">bool</span> store_pairs) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="comment">    /// build precomputed table</span></div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ad99c215aeaf92e995cb97f4044c4d267">precompute_table</a> ();</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> ();</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;};</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="comment">/// statistics are robust to internal threading, but not if</span></div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="comment">/// IndexIVFPQ::search_preassigned is called by multiple threads</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQStats.html">  128</a></span>&#160;<span class="comment"></span><span class="keyword">struct </span><a class="code" href="structfaiss_1_1IndexIVFPQStats.html">IndexIVFPQStats</a> {</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    <span class="keywordtype">size_t</span> nq;       <span class="comment">// nb of queries run</span></div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordtype">size_t</span> nlist;    <span class="comment">// nb of inverted lists scanned</span></div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordtype">size_t</span> ncode;    <span class="comment">// nb of codes visited</span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;    <span class="keywordtype">size_t</span> nrefine;  <span class="comment">// nb of refines (IVFPQR)</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="keywordtype">size_t</span> n_hamming_pass;</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="comment">// nb of passed Hamming distance tests (for polysemous)</span></div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="comment">// timings measured with the CPU RTC</span></div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="comment">// on all threads</span></div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="keywordtype">size_t</span> assign_cycles;</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keywordtype">size_t</span> search_cycles;</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <span class="keywordtype">size_t</span> refine_cycles; <span class="comment">// only for IVFPQR</span></div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    <span class="comment">// single thread (double-counted with search_cycles)</span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="keywordtype">size_t</span> init_query_cycles;</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="keywordtype">size_t</span> init_list_cycles;</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    <span class="keywordtype">size_t</span> scan_cycles;</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="keywordtype">size_t</span> heap_cycles;</div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQStats.html">IndexIVFPQStats</a> () {reset (); }</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="keywordtype">void</span> reset ();</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;};</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment">// global var that collects them all</span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="keyword">extern</span> <a class="code" href="structfaiss_1_1IndexIVFPQStats.html">IndexIVFPQStats</a> indexIVFPQ_stats;</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment">/** Index with an additional level of PQ refinement */</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html">  159</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structfaiss_1_1IndexIVFPQR.html">IndexIVFPQR</a>: <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> {</div>
<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">  160</a></span>&#160;    <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>;           <span class="comment">///&lt; 3rd level quantizer</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">  161</a></span>&#160;<span class="comment"></span>    std::vector &lt;uint8_t&gt; <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>;   <span class="comment">///&lt; corresponding codes</span></div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="comment"></span><span class="comment"></span></div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<span class="comment">    /// factor between k requested in search and the k requested from the IVFPQ</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a0b02a4151ceacc070352f8b15cc0ee0b">  164</a></span>&#160;<span class="comment"></span>    <span class="keywordtype">float</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a0b02a4151ceacc070352f8b15cc0ee0b">k_factor</a>;</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQR.html">IndexIVFPQR</a> (</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;            <a class="code" href="structfaiss_1_1Index.html">Index</a> * <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>, <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>,</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;            <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits_per_idx,</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;            <span class="keywordtype">size_t</span> M_refine, <span class="keywordtype">size_t</span> nbits_per_idx_refine);</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#ae0e979a014a9defe2254e9543657b075">reset</a>() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="keywordtype">long</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#acc5eeeeb8ac8d2581ef07947932d9f6c">remove_ids</a>(<span class="keyword">const</span> <a class="code" href="structfaiss_1_1IDSelector.html">IDSelector</a>&amp; sel) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="comment">    /// trains the two product quantizers</span></div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a68ed7cae5bec89fcdcb6a1d2addbd5a8">train_residual</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4b6154a5194d574d037ba78c137a2fa5">add_with_ids</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x, <span class="keyword">const</span> <span class="keywordtype">long</span>* xids) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment">    /// same as add_with_ids, but optionally use the precomputed list ids</span></div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a186b746f22b65ddf416b1e821b0866ec">add_core</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, <span class="keyword">const</span> <span class="keywordtype">long</span> *xids,</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                     <span class="keyword">const</span> <span class="keywordtype">long</span> *precomputed_idx = <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a0f0d8fc6b2c6aa2431c1730111a3b22a">reconstruct_n</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i0, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> ni, <span class="keywordtype">float</span>* recons) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a31a1fec2a88b410ea96ce5be7d527be9">merge_from</a> (<a class="code" href="structfaiss_1_1IndexIVF.html">IndexIVF</a> &amp;other, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> add_id) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;</div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a3e982ee6f1a3a025148270701867d04f">search</a>(</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;        <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n,</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">float</span>* x,</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;        <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;        <span class="keywordtype">float</span>* distances,</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;        <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a>* labels) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQR.html">IndexIVFPQR</a>();</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;};</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="comment">/** Index with 32-bit ids and flat tables. Must be constructed from an</span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="comment"> *  exisiting IndexIVFPQ. Cannot be copy-constructed/assigned. The</span></div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="comment"> *  actual data is stored in the compact_* tables, the ids and codes</span></div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="comment"> *  tables are not used.  */</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html">  204</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structfaiss_1_1IndexIVFPQCompact.html">IndexIVFPQCompact</a>: <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> {</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="keyword">explicit</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html">IndexIVFPQCompact</a> (<span class="keyword">const</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> &amp;other);</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="comment">    /// how were the compact tables allocated?</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70">  209</a></span>&#160;<span class="comment"></span>    <span class="keyword">enum</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70">Alloc_type_t</a> {</div>
<div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a3d58d7b26146791f0fe34b35a9b0fd95">  210</a></span>&#160;        <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a3d58d7b26146791f0fe34b35a9b0fd95">Alloc_type_none</a>,     <span class="comment">///&lt; alloc from outside</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6">  211</a></span>&#160;<span class="comment"></span>        <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6">Alloc_type_new</a>,      <span class="comment">///&lt; was allocated with new</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a38c1b1ed9ebdbd4b0047be13080094bb">  212</a></span>&#160;<span class="comment"></span>        <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a38c1b1ed9ebdbd4b0047be13080094bb">Alloc_type_mmap</a>      <span class="comment">///&lt; was mmapped</span></div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="comment"></span>    };</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70">Alloc_type_t</a> alloc_type;</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div>
<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">  217</a></span>&#160;    uint32_t *<a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a>;        <span class="comment">///&lt; size nlist + 1</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">  218</a></span>&#160;<span class="comment"></span>    uint32_t *<a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a>;   <span class="comment">///&lt; size ntotal</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">  219</a></span>&#160;<span class="comment"></span>    uint8_t *<a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a>;  <span class="comment">///&lt; size ntotal * code_size</span></div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    <span class="comment">// file and buffer this was mmapped (will be unmapped when object</span></div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="comment">// is deleted)</span></div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="keywordtype">char</span> * mmap_buffer;</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="keywordtype">long</span> mmap_length;</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ada9e5292194ee1be42d122037fbf2502">search_preassigned</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;                             <span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *<a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a>,</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;                             <span class="keyword">const</span> <span class="keywordtype">float</span> *centroid_dis,</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;                             <span class="keywordtype">float</span> *distances, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *labels,</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;                             <span class="keywordtype">bool</span> store_pairs) <span class="keyword">const override</span>;</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="comment">    /// the three following functions will fail at runtime</span></div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ade7b46bbbcaf244ad680104380afb1b8">add</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a>, <span class="keyword">const</span> <span class="keywordtype">float</span>*) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a8f5eccfb4d5e4098ff6c00acb3bc40a1">reset</a>() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a0ef8132fae22a50616fe1201c8b20588">train</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a>, <span class="keyword">const</span> <span class="keywordtype">float</span>*) <span class="keyword">override</span>;</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    ~<a class="code" href="structfaiss_1_1IndexIVFPQCompact.html">IndexIVFPQCompact</a>() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html">IndexIVFPQCompact</a> ();</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;};</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;} <span class="comment">// namespace faiss</span></div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;</div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_a1fa62ed464c15768479c92646ed484c7"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">faiss::IndexIVFPQCompact::compact_ids</a></div><div class="ttdeci">uint32_t * compact_ids</div><div class="ttdoc">size ntotal </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00218">IndexIVFPQ.h:218</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVF_html"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00045">IndexIVF.h:45</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_aaaf53cae0e47baf3fb1199ce4d789694"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">faiss::IndexIVFPQCompact::compact_codes</a></div><div class="ttdeci">uint8_t * compact_codes</div><div class="ttdoc">size ntotal * code_size </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00219">IndexIVFPQ.h:219</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_ad99c215aeaf92e995cb97f4044c4d267"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#ad99c215aeaf92e995cb97f4044c4d267">faiss::IndexIVFPQ::precompute_table</a></div><div class="ttdeci">void precompute_table()</div><div class="ttdoc">build precomputed table </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00356">IndexIVFPQ.cpp:356</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a31a1fec2a88b410ea96ce5be7d527be9"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a31a1fec2a88b410ea96ce5be7d527be9">faiss::IndexIVFPQR::merge_from</a></div><div class="ttdeci">void merge_from(IndexIVF &amp;other, idx_t add_id) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01275">IndexIVFPQ.cpp:1275</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a28ce697b1381eb7e7d7d25774a25e175"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a28ce697b1381eb7e7d7d25774a25e175">faiss::IndexIVFPQ::reconstruct</a></div><div class="ttdeci">void reconstruct(idx_t key, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00303">IndexIVFPQ.cpp:303</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html">faiss::IndexIVFPQR</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00159">IndexIVFPQ.h:159</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a4a80540e7cdfb3e43712ffb93e083a7c"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">faiss::IndexIVFPQR::refine_pq</a></div><div class="ttdeci">ProductQuantizer refine_pq</div><div class="ttdoc">3rd level quantizer </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00160">IndexIVFPQ.h:160</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a2b14cbb5acb3fc28a4df8fde3f5567cd"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">faiss::IndexIVFPQ::polysemous_training</a></div><div class="ttdeci">PolysemousTraining * polysemous_training</div><div class="ttdoc">if NULL, use default </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00035">IndexIVFPQ.h:35</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ade7b46bbbcaf244ad680104380afb1b8"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ade7b46bbbcaf244ad680104380afb1b8">faiss::IndexIVFPQCompact::add</a></div><div class="ttdeci">void add(idx_t, const float *) override</div><div class="ttdoc">the three following functions will fail at runtime </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01371">IndexIVFPQ.cpp:1371</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQStats_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQStats.html">faiss::IndexIVFPQStats</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00128">IndexIVFPQ.h:128</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a0f0d8fc6b2c6aa2431c1730111a3b22a"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a0f0d8fc6b2c6aa2431c1730111a3b22a">faiss::IndexIVFPQR::reconstruct_n</a></div><div class="ttdeci">void reconstruct_n(idx_t i0, idx_t ni, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01256">IndexIVFPQ.cpp:1256</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ada9e5292194ee1be42d122037fbf2502"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ada9e5292194ee1be42d122037fbf2502">faiss::IndexIVFPQCompact::search_preassigned</a></div><div class="ttdeci">void search_preassigned(idx_t n, const float *x, idx_t k, const idx_t *assign, const float *centroid_dis, float *distances, idx_t *labels, bool store_pairs) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01401">IndexIVFPQ.cpp:1401</a></div></div>
<div class="ttc" id="structfaiss_1_1Index_html_a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c"><div class="ttname"><a href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">faiss::Index::assign</a></div><div class="ttdeci">void assign(idx_t n, const float *x, idx_t *labels, idx_t k=1)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00023">Index.cpp:23</a></div></div>
<div class="ttc" id="structfaiss_1_1IDSelector_html"><div class="ttname"><a href="structfaiss_1_1IDSelector.html">faiss::IDSelector</a></div><div class="ttdef"><b>Definition:</b> <a href="AuxIndexStructures_8h_source.html#l00052">AuxIndexStructures.h:52</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ab2698c5d65644a171c53ffe39e420b70a38c1b1ed9ebdbd4b0047be13080094bb"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a38c1b1ed9ebdbd4b0047be13080094bb">faiss::IndexIVFPQCompact::Alloc_type_mmap</a></div><div class="ttdoc">was mmapped </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00212">IndexIVFPQ.h:212</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_ae1fb0cc3051dec8e322a78c443f8fc9a"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#ae1fb0cc3051dec8e322a78c443f8fc9a">faiss::IndexIVFPQ::decode_multiple</a></div><div class="ttdeci">void decode_multiple(size_t n, const long *keys, const uint8_t *xcodes, float *x) const </div><div class="ttdoc">inverse of encode_multiple </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00169">IndexIVFPQ.cpp:169</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a4e06f04853dcb424dc393de5f641e917"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917">faiss::IndexIVFPQ::train_residual_o</a></div><div class="ttdeci">void train_residual_o(idx_t n, const float *x, float *residuals_2)</div><div class="ttdoc">same as train_residual, also output 2nd level residuals </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00071">IndexIVFPQ.cpp:71</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a9d5373633df7a9bec4de69400b9adeed"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">faiss::IndexIVFPQ::do_polysemous_training</a></div><div class="ttdeci">bool do_polysemous_training</div><div class="ttdoc">reorder PQ centroids after training? </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00034">IndexIVFPQ.h:34</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a7430fc4fa030c96497abced3b68358d4"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">faiss::IndexIVFPQ::scan_table_threshold</a></div><div class="ttdeci">size_t scan_table_threshold</div><div class="ttdoc">use table computation or on-the-fly? </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00038">IndexIVFPQ.h:38</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a68ed7cae5bec89fcdcb6a1d2addbd5a8"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a68ed7cae5bec89fcdcb6a1d2addbd5a8">faiss::IndexIVFPQR::train_residual</a></div><div class="ttdeci">void train_residual(idx_t n, const float *x) override</div><div class="ttdoc">trains the two product quantizers </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01124">IndexIVFPQ.cpp:1124</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a186b746f22b65ddf416b1e821b0866ec"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a186b746f22b65ddf416b1e821b0866ec">faiss::IndexIVFPQR::add_core</a></div><div class="ttdeci">void add_core(idx_t n, const float *x, const long *xids, const long *precomputed_idx=nullptr)</div><div class="ttdoc">same as add_with_ids, but optionally use the precomputed list ids </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01148">IndexIVFPQ.cpp:1148</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_a146ccc5a05aed1d2e96df8c1d3f7663d"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">faiss::IndexIVFPQCompact::limits</a></div><div class="ttdeci">uint32_t * limits</div><div class="ttdoc">size nlist + 1 </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00217">IndexIVFPQ.h:217</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a9b310195d610c3e326471b3758206b59"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">faiss::IndexIVFPQ::precomputed_table</a></div><div class="ttdeci">std::vector&lt; float &gt; precomputed_table</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00045">IndexIVFPQ.h:45</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a3093a0a3e128eafce6e0583b75e9662e"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">faiss::IndexIVFPQ::polysemous_ht</a></div><div class="ttdeci">int polysemous_ht</div><div class="ttdoc">Hamming thresh for polysemous filtering. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00040">IndexIVFPQ.h:40</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_ae0e979a014a9defe2254e9543657b075"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#ae0e979a014a9defe2254e9543657b075">faiss::IndexIVFPQR::reset</a></div><div class="ttdeci">void reset() override</div><div class="ttdoc">removes all elements from the database. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01115">IndexIVFPQ.cpp:1115</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a981c2748bfbd9b018494f119279a0342"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a981c2748bfbd9b018494f119279a0342">faiss::IndexIVFPQ::add_with_ids</a></div><div class="ttdeci">void add_with_ids(idx_t n, const float *x, const long *xids=nullptr) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00186">IndexIVFPQ.cpp:186</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html">faiss::IndexIVFPQCompact</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00204">IndexIVFPQ.h:204</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVF_html_af16d325f5bef22b2e5f90ceea796e80d"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">faiss::IndexIVF::ids</a></div><div class="ttdeci">std::vector&lt; std::vector&lt; long &gt; &gt; ids</div><div class="ttdoc">Inverted lists for indexes. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00055">IndexIVF.h:55</a></div></div>
<div class="ttc" id="structfaiss_1_1Index_html_a2a002388d2c081c2dbab8508dcefe73d"><div class="ttname"><a href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">faiss::Index::d</a></div><div class="ttdeci">int d</div><div class="ttdoc">vector dimension </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00064">Index.h:64</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a4b40cc7a70dff41196a3b8769586667a"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">faiss::IndexIVF::quantizer</a></div><div class="ttdeci">Index * quantizer</div><div class="ttdoc">quantizer that maps vectors to inverted lists </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00049">IndexIVF.h:49</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a77501995b3671e377102d2db1a93ade4"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">faiss::IndexIVFPQ::max_codes</a></div><div class="ttdeci">size_t max_codes</div><div class="ttdoc">max nb of codes to visit to do a query </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00039">IndexIVFPQ.h:39</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ab2698c5d65644a171c53ffe39e420b70"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70">faiss::IndexIVFPQCompact::Alloc_type_t</a></div><div class="ttdeci">Alloc_type_t</div><div class="ttdoc">how were the compact tables allocated? </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00209">IndexIVFPQ.h:209</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a588bd0b733c8db18eaeb7bc287afd16e"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">faiss::IndexIVFPQR::refine_codes</a></div><div class="ttdeci">std::vector&lt; uint8_t &gt; refine_codes</div><div class="ttdoc">corresponding codes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00161">IndexIVFPQ.h:161</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_af6565a5d8bab7be3df19c50d235bd662"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#af6565a5d8bab7be3df19c50d235bd662">faiss::IndexIVFPQ::train_residual</a></div><div class="ttdeci">void train_residual(idx_t n, const float *x) override</div><div class="ttdoc">trains the product quantizer </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00065">IndexIVFPQ.cpp:65</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html">faiss::IndexIVFPQ</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00029">IndexIVFPQ.h:29</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a1ae6cdd996bbd398fa4e87646c8f3ba6"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a1ae6cdd996bbd398fa4e87646c8f3ba6">faiss::IndexIVFPQ::encode_multiple</a></div><div class="ttdeci">void encode_multiple(size_t n, long *keys, const float *x, uint8_t *codes, bool compute_keys=false) const </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00150">IndexIVFPQ.cpp:150</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_a0ef8132fae22a50616fe1201c8b20588"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#a0ef8132fae22a50616fe1201c8b20588">faiss::IndexIVFPQCompact::train</a></div><div class="ttdeci">void train(idx_t, const float *) override</div><div class="ttdoc">Trains the quantizer and calls train_residual to train sub-quantizers. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01379">IndexIVFPQ.cpp:1379</a></div></div>
<div class="ttc" id="structfaiss_1_1Index_html_a040c6aed1f224f3ea7bf58eebc0c31a4"><div class="ttname"><a href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">faiss::Index::idx_t</a></div><div class="ttdeci">long idx_t</div><div class="ttdoc">all indices are this type </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00062">Index.h:62</a></div></div>
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html">faiss::PolysemousTraining</a></div><div class="ttdoc">optimizes the order of indices in a ProductQuantizer </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00125">PolysemousTraining.h:125</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_afd13b471df293ae5a6e895704c69a4c3"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">faiss::IndexIVFPQ::by_residual</a></div><div class="ttdeci">bool by_residual</div><div class="ttdoc">Encode residual or plain vector? </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00030">IndexIVFPQ.h:30</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ab2698c5d65644a171c53ffe39e420b70a3d58d7b26146791f0fe34b35a9b0fd95"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a3d58d7b26146791f0fe34b35a9b0fd95">faiss::IndexIVFPQCompact::Alloc_type_none</a></div><div class="ttdoc">alloc from outside </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00210">IndexIVFPQ.h:210</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a007303be116c8da65b6d058e3fc77d16"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">faiss::IndexIVFPQ::pq</a></div><div class="ttdeci">ProductQuantizer pq</div><div class="ttdoc">produces the codes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00032">IndexIVFPQ.h:32</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVF_html_ab38fde4c923abefc4185eb7450b5b95b"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">faiss::IndexIVF::nlist</a></div><div class="ttdeci">size_t nlist</div><div class="ttdoc">number of possible key values </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00046">IndexIVF.h:46</a></div></div>
<div class="ttc" id="structfaiss_1_1Index_html"><div class="ttname"><a href="structfaiss_1_1Index.html">faiss::Index</a></div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00060">Index.h:60</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a1df10e9e5f4ff0dabf283f19ad94bbd4"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a1df10e9e5f4ff0dabf283f19ad94bbd4">faiss::IndexIVFPQ::reconstruct_n</a></div><div class="ttdeci">void reconstruct_n(idx_t i0, idx_t ni, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00274">IndexIVFPQ.cpp:274</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_ac0cb8421b9885d691696d2ff4f76894b"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b">faiss::IndexIVFPQ::add_core_o</a></div><div class="ttdeci">void add_core_o(idx_t n, const float *x, const long *xids, float *residuals_2, const long *precomputed_idx=nullptr)</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00192">IndexIVFPQ.cpp:192</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_acc5eeeeb8ac8d2581ef07947932d9f6c"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#acc5eeeeb8ac8d2581ef07947932d9f6c">faiss::IndexIVFPQR::remove_ids</a></div><div class="ttdeci">long remove_ids(const IDSelector &amp;sel) override</div><div class="ttdoc">Dataset manipulation functions. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01288">IndexIVFPQ.cpp:1288</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a150a37cf3e8a7e37cb8dab1d5678bc02"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02">faiss::IndexIVFPQ::search_preassigned</a></div><div class="ttdeci">void search_preassigned(idx_t n, const float *x, idx_t k, const idx_t *assign, const float *centroid_dis, float *distances, idx_t *labels, bool store_pairs) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l00931">IndexIVFPQ.cpp:931</a></div></div>
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html">faiss::ProductQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00025">ProductQuantizer.h:25</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_a8f5eccfb4d5e4098ff6c00acb3bc40a1"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#a8f5eccfb4d5e4098ff6c00acb3bc40a1">faiss::IndexIVFPQCompact::reset</a></div><div class="ttdeci">void reset() override</div><div class="ttdoc">removes all elements from the database. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01375">IndexIVFPQ.cpp:1375</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQCompact_html_ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6">faiss::IndexIVFPQCompact::Alloc_type_new</a></div><div class="ttdoc">was allocated with new </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00211">IndexIVFPQ.h:211</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a4b6154a5194d574d037ba78c137a2fa5"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a4b6154a5194d574d037ba78c137a2fa5">faiss::IndexIVFPQR::add_with_ids</a></div><div class="ttdeci">void add_with_ids(idx_t n, const float *x, const long *xids) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01144">IndexIVFPQ.cpp:1144</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a3e982ee6f1a3a025148270701867d04f"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a3e982ee6f1a3a025148270701867d04f">faiss::IndexIVFPQR::search</a></div><div class="ttdeci">void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01167">IndexIVFPQ.cpp:1167</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_aee355b57acde203a3caed46a93e16a3c"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#aee355b57acde203a3caed46a93e16a3c">faiss::IndexIVFPQ::find_duplicates</a></div><div class="ttdeci">size_t find_duplicates(idx_t *ids, size_t *lims) const </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01059">IndexIVFPQ.cpp:1059</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQR_html_a0b02a4151ceacc070352f8b15cc0ee0b"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQR.html#a0b02a4151ceacc070352f8b15cc0ee0b">faiss::IndexIVFPQR::k_factor</a></div><div class="ttdeci">float k_factor</div><div class="ttdoc">factor between k requested in search and the k requested from the IVFPQ </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00164">IndexIVFPQ.h:164</a></div></div>
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a1c66ff073c18a1edbe8444c24d870583"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">faiss::IndexIVFPQ::use_precomputed_table</a></div><div class="ttdeci">int use_precomputed_table</div><div class="ttdoc">if by_residual, build precompute tables </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00031">IndexIVFPQ.h:31</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.5
</small></address>
</body>
</html>