mirror of
https://github.com/facebookresearch/faiss.git
synced 2025-06-03 21:54:02 +08:00
various bugfixes from github issues kmean with some frozen centroids GPU better tiling for large flat datasets default AVX for vector ops
1738 lines
293 KiB
HTML
1738 lines
293 KiB
HTML
<!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.cpp 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 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 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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </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.cpp</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright (c) 2015-present, Facebook, Inc.</span></div>
|
|
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * All rights reserved.</span></div>
|
|
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <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> <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> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div>
|
|
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">/* Copyright 2004-present Facebook. All Rights Reserved.</span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> Inverted list structure.</span></div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">*/</span></div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "IndexIVFPQ.h"</span></div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div>
|
|
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include <cmath></span></div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include <cstdio></span></div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <cassert></span></div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> </div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <sys/mman.h></span></div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include "Heap.h"</span></div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include "utils.h"</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include "Clustering.h"</span></div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "IndexFlat.h"</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include "hamming.h"</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "FaissAssert.h"</span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "AuxIndexStructures.h"</span></div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="keyword">namespace </span>faiss {</div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"> * IndexIVFPQ implementation</span></div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> IndexIVFPQ::IndexIVFPQ (Index * quantizer, <span class="keywordtype">size_t</span> d, <span class="keywordtype">size_t</span> nlist,</div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits_per_idx):</div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  IndexIVF (quantizer, d, nlist, METRIC_L2),</div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  pq (d, M, nbits_per_idx)</div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> {</div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  FAISS_THROW_IF_NOT (nbits_per_idx <= 8);</div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a> = pq.code_size;</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  by_residual = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  use_precomputed_table = 0;</div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  scan_table_threshold = 0;</div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  max_codes = 0; <span class="comment">// means unlimited</span></div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  polysemous_training = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  do_polysemous_training = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  polysemous_ht = 0;</div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> }</div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#af6565a5d8bab7be3df19c50d235bd662"> 65</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#af6565a5d8bab7be3df19c50d235bd662">IndexIVFPQ::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)</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> {</div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917">train_residual_o</a> (n, x, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> }</div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917"> 71</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917">IndexIVFPQ::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="l00072"></a><span class="lineno"> 72</span> {</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x_in = x;</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> </div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  x = <a class="code" href="namespacefaiss.html#a14884d253128c7af5891a65082ad7dc6">fvecs_maybe_subsample</a> (</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, (<span class="keywordtype">size_t</span>*)&n, <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a993e0a035248faad6e292a5ef9af1953">max_points_per_centroid</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>,</div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  x, <a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>, <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a509c65e2ebe6ecabebd163ecb03c5579">seed</a>);</div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del_x (x_in == x ? <span class="keyword">nullptr</span> : x);</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> </div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *trainset;</div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del_residuals;</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordflow">if</span>(<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>) printf(<span class="stringliteral">"computing residuals\n"</span>);</div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> * <a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a> = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> [n]; <span class="comment">// assignement to coarse centroids</span></div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<idx_t></a> del (assign);</div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a> (n, x, assign);</div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordtype">float</span> *residuals = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  del_residuals.set (residuals);</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (x + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, residuals+i*d, assign[i]);</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  trainset = residuals;</div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  trainset = x;</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  }</div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>)</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  printf (<span class="stringliteral">"training %zdx%zd product quantizer on %ld vectors in %dD\n"</span>,</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>, <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, n, <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a1e4056fa3938ed8c9fe701e90d94ad95">verbose</a> = <a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>;</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.train (n, trainset);</div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div>
|
|
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">do_polysemous_training</a>) {</div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>)</div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  printf(<span class="stringliteral">"doing polysemous training for PQ\n"</span>);</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <a class="code" href="structfaiss_1_1PolysemousTraining.html">PolysemousTraining</a> default_pt;</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <a class="code" href="structfaiss_1_1PolysemousTraining.html">PolysemousTraining</a> *pt = <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">polysemous_training</a>;</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordflow">if</span> (!pt) pt = &default_pt;</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  pt-><a class="code" href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82">optimize_pq_for_hamming</a> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>, n, trainset);</div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="comment">// prepare second-level residuals for refine PQ</span></div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">if</span> (residuals_2) {</div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  uint8_t *train_codes = <span class="keyword">new</span> uint8_t [<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> * n];</div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<uint8_t></a> del (train_codes);</div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (trainset, train_codes, n);</div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xx = trainset + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">float</span> * res = residuals_2 + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (train_codes + i * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, res);</div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; j++)</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  res[j] = xx[j] - res[j];</div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  }</div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ad99c215aeaf92e995cb97f4044c4d267">precompute_table</a> ();</div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  }</div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span> }</div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> </div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">/* produce a binary signature based on the residual vector */</span></div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="keywordtype">void</span> IndexIVFPQ::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="l00137"></a><span class="lineno"> 137</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordtype">float</span> residual_vec[<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (x, residual_vec, key);</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">compute_code</a> (residual_vec, code);</div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  }</div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">else</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">compute_code</a> (x, code);</div>
|
|
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> }</div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> </div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a1ae6cdd996bbd398fa4e87646c8f3ba6"> 150</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1ae6cdd996bbd398fa4e87646c8f3ba6">IndexIVFPQ::encode_multiple</a> (<span class="keywordtype">size_t</span> n, <span class="keywordtype">long</span> *keys,</div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x, uint8_t * xcodes,</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordtype">bool</span> compute_keys)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keywordflow">if</span> (compute_keys)</div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a> (n, x, keys);</div>
|
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div>
|
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordtype">float</span> *residuals = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del (residuals);</div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// TODO: parallelize?</span></div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (x + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, residuals + i * d, keys[i]);</div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (residuals, xcodes, n);</div>
|
|
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, xcodes, n);</div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  }</div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span> }</div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#ae1fb0cc3051dec8e322a78c443f8fc9a"> 169</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ae1fb0cc3051dec8e322a78c443f8fc9a">IndexIVFPQ::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="l00170"></a><span class="lineno"> 170</span>  <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="l00171"></a><span class="lineno"> 171</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (xcodes, x, n);</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  std::vector<float> centroid (<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">reconstruct</a> (keys[i], centroid.data());</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordtype">float</span> *xi = x + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; j++) {</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  xi [j] += centroid [j];</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  }</div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  }</div>
|
|
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> }</div>
|
|
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a981c2748bfbd9b018494f119279a0342"> 186</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a981c2748bfbd9b018494f119279a0342">IndexIVFPQ::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)</div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> {</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b">add_core_o</a> (n, x, xids, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> }</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b"> 192</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b">IndexIVFPQ::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, <span class="keyword">const</span> <span class="keywordtype">long</span> *xids,</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordtype">float</span> *residuals_2, <span class="keyword">const</span> <span class="keywordtype">long</span> *precomputed_idx)</div>
|
|
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> {</div>
|
|
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordtype">double</span> t0 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> ();</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> * idx;</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<long></a> del_idx;</div>
|
|
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> </div>
|
|
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">if</span> (precomputed_idx) {</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  idx = precomputed_idx;</div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordtype">long</span> * idx0 = <span class="keyword">new</span> <span class="keywordtype">long</span> [n];</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  del_idx.set (idx0);</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a> (n, x, idx0);</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  idx = idx0;</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div>
|
|
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div>
|
|
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordtype">double</span> t1 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> ();</div>
|
|
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  uint8_t * xcodes = <span class="keyword">new</span> uint8_t [n * <a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>];</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<uint8_t></a> del_xcodes (xcodes);</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> </div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *to_encode = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del_to_encode;</div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div>
|
|
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordtype">float</span> *residuals = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="comment">// TODO: parallelize?</span></div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">if</span> (idx[i] < 0)</div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  memset (residuals + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>, 0, <span class="keyword">sizeof</span>(*residuals) * d);</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (</div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  x + i * d, residuals + i * d, idx[i]);</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  to_encode = residuals;</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  del_to_encode.set (to_encode);</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  to_encode = x;</div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  }</div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (to_encode, xcodes, n);</div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordtype">double</span> t2 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> ();</div>
|
|
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="comment">// TODO: parallelize?</span></div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordtype">size_t</span> n_ignore = 0;</div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> key = idx[i];</div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">if</span> (key < 0) {</div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  n_ignore ++;</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">if</span> (residuals_2)</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  memset (residuals_2, 0, <span class="keyword">sizeof</span>(*residuals_2) * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  }</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> <span class="keywordtype">id</span> = xids ? xids[i] : <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> + i;</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[key].push_back (<span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  uint8_t *code = xcodes + i * <a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>;</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>; j++)</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  codes[key].push_back (code[j]);</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">if</span> (residuals_2) {</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordtype">float</span> *res2 = residuals_2 + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xi = to_encode + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code, res2);</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; j++)</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  res2[j] = xi[j] - res2[j];</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  }</div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVF.html#aedd0c14b5654295b291638ec7f9f9517">maintain_direct_map</a>)</div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  direct_map.push_back (key << 32 | (<a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[key].size() - 1));</div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordtype">double</span> t3 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> ();</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">if</span>(<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>) {</div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordtype">char</span> comment[100] = {0};</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (n_ignore > 0)</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  snprintf (comment, 100, <span class="stringliteral">"(%ld vectors ignored)"</span>, n_ignore);</div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  printf(<span class="stringliteral">" add_core times: %.3f %.3f %.3f %s\n"</span>,</div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  t1 - t0, t2 - t1, t3 - t2, comment);</div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  }</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> += n;</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span> }</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span> </div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a1df10e9e5f4ff0dabf283f19ad94bbd4"> 274</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1df10e9e5f4ff0dabf283f19ad94bbd4">IndexIVFPQ::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</span></div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  FAISS_THROW_IF_NOT (ni == 0 || (i0 >= 0 && i0 + ni <= <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>));</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  std::vector<float> centroid (<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> key = 0; key < <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; key++) {</div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keyword">const</span> std::vector<long> & idlist = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[key];</div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keyword">const</span> uint8_t * code_line = codes[key].data();</div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> ofs = 0; ofs < idlist.size(); ofs++) {</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = idlist[ofs];</div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">if</span> (!(<span class="keywordtype">id</span> >= i0 && <span class="keywordtype">id</span> < i0 + ni)) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordtype">float</span> *r = recons + <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> * (<span class="keywordtype">id</span> - i0);</div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a>) {</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">reconstruct</a> (key, centroid.data());</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code_line + ofs * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, r);</div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; j++) {</div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  r[j] += centroid[j];</div>
|
|
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  }</div>
|
|
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code_line + ofs * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, r);</div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span> }</div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span> </div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a28ce697b1381eb7e7d7d25774a25e175"> 302</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a28ce697b1381eb7e7d7d25774a25e175">IndexIVFPQ::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</span></div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  FAISS_THROW_IF_NOT (direct_map.size() == <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>);</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordtype">int</span> list_no = direct_map[key] >> 32;</div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keywordtype">int</span> ofs = direct_map[key] & 0xffffffff;</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span> </div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">reconstruct</a> (list_no, recons);</div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keyword">const</span> uint8_t * code = &(codes[list_no][ofs * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>]);</div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span> </div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordtype">float</span> * out = recons + m * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * cent = <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, code[m]);</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>; i++) {</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  out[i] += cent[i];</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  }</div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span> }</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span> </div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span> </div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="comment">/** Precomputed tables for residuals</span></div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span> <span class="comment"> * During IVFPQ search with by_residual, we compute</span></div>
|
|
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="comment"> * d = || x - y_C - y_R ||^2</span></div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment"> * where x is the query vector, y_C the coarse centroid, y_R the</span></div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment"> * refined PQ centroid. The expression can be decomposed as:</span></div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment"> * d = || x - y_C ||^2 + || y_R ||^2 + 2 * (y_C|y_R) - 2 * (x|y_R)</span></div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment"> * --------------- --------------------------- -------</span></div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment"> * term 1 term 2 term 3</span></div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="comment"> * When using multiprobe, we use the following decomposition:</span></div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="comment"> * - term 1 is the distance to the coarse centroid, that is computed</span></div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="comment"> * during the 1st stage search.</span></div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="comment"> * - term 2 can be precomputed, as it does not involve x. However,</span></div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment"> * because of the PQ, it needs nlist * M * ksub storage. This is why</span></div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="comment"> * use_precomputed_table is off by default</span></div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="comment"> * - term 3 is the classical non-residual distance table.</span></div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="comment"> * Since y_R defined by a product quantizer, it is split across</span></div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="comment"> * subvectors and stored separately for each subvector. If the coarse</span></div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span> <span class="comment"> * quantizer is a MultiIndexQuantizer then the table can be stored</span></div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="comment"> * more compactly.</span></div>
|
|
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="comment"> * At search time, the tables for term 2 and term 3 are added up. This</span></div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="comment"> * is faster when the length of the lists is > ksub * M.</span></div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#ad99c215aeaf92e995cb97f4044c4d267"> 356</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ad99c215aeaf92e995cb97f4044c4d267">IndexIVFPQ::precompute_table</a> ()</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span> {</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> == 0) { <span class="comment">// then choose the type of table</span></div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  fprintf(stderr, <span class="stringliteral">"IndexIVFPQ::precompute_table: WARN precomputed "</span></div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="stringliteral">"tables not needed for inner product quantizers\n"</span>);</div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  }</div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> *miq =</div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span><a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> *<span class="keyword">></span> (<a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>);</div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">if</span> (miq && <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> % miq->pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> == 0)</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> = 2;</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> = 1;</div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  } <span class="comment">// otherwise assume user has set appropriate flag on input</span></div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span> </div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>) {</div>
|
|
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  printf (<span class="stringliteral">"precomputing IVFPQ tables type %d\n"</span>,</div>
|
|
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a>);</div>
|
|
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  }</div>
|
|
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span> </div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="comment">// squared norms of the PQ centroids</span></div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  std::vector<float> r_norms (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, NAN);</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++)</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; j++)</div>
|
|
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  r_norms [m * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> + j] =</div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <a class="code" href="namespacefaiss.html#a7a49180ebf10e643217bbce5862c7f84">fvec_norm_L2sqr</a> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, j), <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>);</div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span> </div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> == 1) {</div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>.resize (<a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>);</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  std::vector<float> centroid (<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; i++) {</div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">reconstruct</a> (i, centroid.data());</div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> </div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">float</span> *tab = &<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>[i * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>];</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.compute_inner_prod_table (centroid.data(), tab);</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="namespacefaiss.html#a40328c31abd0bbba5bd95d7de951e847">fvec_madd</a> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, r_norms.data(), 2.0, tab, tab);</div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  }</div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> == 2) {</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> *miq =</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span><a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> *<span class="keyword">></span> (<a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>);</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  FAISS_THROW_IF_NOT (miq);</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> &cpq = miq->pq;</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> % cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> == 0);</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>.resize(cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>);</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="comment">// reorder PQ centroid table</span></div>
|
|
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  std::vector<float> centroids (<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> * cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, NAN);</div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span> </div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++) {</div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  memcpy (centroids.data() + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> + m * cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>,</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, i),</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keyword">sizeof</span> (*centroids.data()) * cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>);</div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  }</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  }</div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.compute_inner_prod_tables (cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, centroids.data (),</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>.data ());</div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < cpq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++) {</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordtype">float</span> *tab = &<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a>[i * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>];</div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="namespacefaiss.html#a40328c31abd0bbba5bd95d7de951e847">fvec_madd</a> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, r_norms.data(), 2.0, tab, tab);</div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  }</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div>
|
|
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  }</div>
|
|
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span> }</div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span> </div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span> <span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="keyword">static</span> uint64_t get_cycles () {</div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  uint32_t high, low;</div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keyword">asm</span> <span class="keyword">volatile</span>(<span class="stringliteral">"rdtsc \n\t"</span></div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  : <span class="stringliteral">"=a"</span> (low),</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="stringliteral">"=d"</span> (high));</div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">return</span> ((uint64_t)high << 32) | (low);</div>
|
|
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span> }</div>
|
|
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div>
|
|
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span> <span class="preprocessor">#define TIC t0 = get_cycles()</span></div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span> <span class="preprocessor"></span><span class="preprocessor">#define TOC get_cycles () - t0</span></div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span> <span class="comment">/** QueryTables manages the various ways of searching an</span></div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span> <span class="comment"> * IndexIVFPQ. The code contains a lot of branches, depending on:</span></div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span> <span class="comment"> * - metric_type: are we computing L2 or Inner product similarity?</span></div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span> <span class="comment"> * - by_residual: do we encode raw vectors or residuals?</span></div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span> <span class="comment"> * - use_precomputed_table: are x_R|x_C tables precomputed?</span></div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="comment"> * - polysemous_ht: are we filtering with polysemous codes?</span></div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span> <span class="keyword">struct </span>QueryTables {</div>
|
|
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span> </div>
|
|
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="comment"> * General data from the IVFPQ</span></div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span> </div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keyword">const</span> IndexIVFPQ & ivfpq;</div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="comment">// copied from IndexIVFPQ for easier access</span></div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordtype">int</span> d;</div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keyword">const</span> ProductQuantizer & pq;</div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <a class="code" href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">MetricType</a> metric_type;</div>
|
|
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordtype">bool</span> by_residual;</div>
|
|
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordtype">int</span> use_precomputed_table;</div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// pre-allocated data buffers</span></div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordtype">float</span> * sim_table, * sim_table_2;</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordtype">float</span> * residual_vec, *decoded_vec;</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span> </div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="comment">// single data buffer</span></div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  std::vector<float> mem;</div>
|
|
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span> </div>
|
|
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// for table pointers</span></div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  std::vector<const float *> sim_table_ptrs;</div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span> </div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keyword">explicit</span> QueryTables (<span class="keyword">const</span> IndexIVFPQ & ivfpq):</div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  ivfpq(ivfpq),</div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  d(ivfpq.d),</div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  pq (ivfpq.pq),</div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  metric_type (ivfpq.metric_type),</div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  by_residual (ivfpq.by_residual),</div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  use_precomputed_table (ivfpq.use_precomputed_table)</div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  {</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  mem.resize (pq.ksub * pq.M * 2 + d *2);</div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  sim_table = mem.data();</div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  sim_table_2 = sim_table + pq.ksub * pq.M;</div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  residual_vec = sim_table_2 + pq.ksub * pq.M;</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  decoded_vec = residual_vec + d;</div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span> </div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="comment">// for polysemous</span></div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">if</span> (ivfpq.polysemous_ht != 0) {</div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  q_code.resize (pq.code_size);</div>
|
|
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div>
|
|
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  init_list_cycles = 0;</div>
|
|
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  sim_table_ptrs.resize (pq.M);</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  }</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span> </div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span> <span class="comment"> * What we do when query is known</span></div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="comment">// field specific to query</span></div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * qi;</div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="comment">// query-specific intialization</span></div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keywordtype">void</span> init_query (<span class="keyword">const</span> <span class="keywordtype">float</span> * qi) {</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  this->qi = qi;</div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">if</span> (metric_type == METRIC_INNER_PRODUCT)</div>
|
|
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  init_query_IP ();</div>
|
|
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  init_query_L2 ();</div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordflow">if</span> (!by_residual && ivfpq.polysemous_ht != 0)</div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  pq.compute_code (qi, q_code.data());</div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  }</div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span> </div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">void</span> init_query_IP () {</div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="comment">// precompute some tables specific to the query qi</span></div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  pq.compute_inner_prod_table (qi, sim_table);</div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="comment">// we compute negated inner products for use with the maxheap</span></div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < pq.ksub * pq.M; i++) {</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  sim_table[i] = - sim_table[i];</div>
|
|
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  }</div>
|
|
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  }</div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span> </div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordtype">void</span> init_query_L2 () {</div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">if</span> (!by_residual) {</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  pq.compute_distance_table (qi, sim_table);</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (use_precomputed_table) {</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  pq.compute_inner_prod_table (qi, sim_table_2);</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div>
|
|
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  }</div>
|
|
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div>
|
|
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span> <span class="comment"> * When inverted list is known: prepare computations</span></div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span> </div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">// fields specific to list</span></div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> key;</div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordtype">float</span> coarse_dis;</div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  std::vector<uint8_t> q_code;</div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span> </div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  uint64_t init_list_cycles;</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span> <span class="comment"> /// once we know the query and the centroid, we can prepare the</span></div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="comment"> /// sim_table that will be used for accumulation</span></div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment"> /// and dis0, the initial value</span></div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="comment"></span> <span class="keywordtype">float</span> precompute_list_tables () {</div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">float</span> dis0 = 0;</div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  uint64_t t0; TIC;</div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">if</span> (by_residual) {</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">if</span> (metric_type == METRIC_INNER_PRODUCT)</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  dis0 = precompute_list_tables_IP ();</div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  dis0 = precompute_list_tables_L2 ();</div>
|
|
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  }</div>
|
|
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  init_list_cycles += TOC;</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">return</span> dis0;</div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  }</div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span> </div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordtype">float</span> precompute_list_table_pointers () {</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordtype">float</span> dis0 = 0;</div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  uint64_t t0; TIC;</div>
|
|
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">if</span> (by_residual) {</div>
|
|
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (metric_type == METRIC_INNER_PRODUCT)</div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  FAISS_THROW_MSG (<span class="stringliteral">"not implemented"</span>);</div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  dis0 = precompute_list_table_pointers_L2 ();</div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  }</div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  init_list_cycles += TOC;</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">return</span> dis0;</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  }</div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span> </div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span> <span class="comment"> * compute tables for inner prod</span></div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span> </div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">float</span> precompute_list_tables_IP ()</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  {</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="comment">// prepare the sim_table that will be used for accumulation</span></div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="comment">// and dis0, the initial value</span></div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  ivfpq.quantizer->reconstruct (key, decoded_vec);</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="comment">// decoded_vec = centroid</span></div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="keywordtype">float</span> dis0 = -fvec_inner_product (qi, decoded_vec, d);</div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span> </div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (ivfpq.polysemous_ht) {</div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < d; i++) {</div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  residual_vec [i] = qi[i] - decoded_vec[i];</div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  pq.compute_code (residual_vec, q_code.data());</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  }</div>
|
|
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">return</span> dis0;</div>
|
|
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  }</div>
|
|
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span> </div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span> <span class="comment"> * compute tables for L2 distance</span></div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span> </div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordtype">float</span> precompute_list_tables_L2 ()</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  {</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordtype">float</span> dis0 = 0;</div>
|
|
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span> </div>
|
|
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordflow">if</span> (use_precomputed_table == 0) {</div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  ivfpq.quantizer->compute_residual (qi, residual_vec, key);</div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  pq.compute_distance_table (residual_vec, sim_table);</div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (use_precomputed_table == 1) {</div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  dis0 = coarse_dis;</div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span> </div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <a class="code" href="namespacefaiss.html#a40328c31abd0bbba5bd95d7de951e847">fvec_madd</a> (pq.M * pq.ksub,</div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  &ivfpq.precomputed_table [key * pq.ksub * pq.M],</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  -2.0, sim_table_2,</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  sim_table);</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (use_precomputed_table == 2) {</div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  dis0 = coarse_dis;</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="keyword">const</span> MultiIndexQuantizer *miq =</div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>MultiIndexQuantizer *<span class="keyword">></span> (ivfpq.quantizer);</div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  FAISS_THROW_IF_NOT (miq);</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="keyword">const</span> ProductQuantizer &cpq = miq->pq;</div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keywordtype">int</span> Mf = pq.M / cpq.M;</div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *qtab = sim_table_2; <span class="comment">// query-specific table</span></div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordtype">float</span> *ltab = sim_table; <span class="comment">// (output) list-specific table</span></div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> </div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordtype">long</span> k = key;</div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cm = 0; cm < cpq.M; cm++) {</div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="comment">// compute PQ index</span></div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordtype">int</span> ki = k & ((uint64_t(1) << cpq.nbits) - 1);</div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  k >>= cpq.nbits;</div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> </div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="comment">// get corresponding table</span></div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *pc = &ivfpq.precomputed_table</div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  [(ki * pq.M + cm * Mf) * pq.ksub];</div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span> </div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  if (ivfpq.polysemous_ht == 0) {</div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">// sum up with query-specific table</span></div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <a class="code" href="namespacefaiss.html#a40328c31abd0bbba5bd95d7de951e847">fvec_madd</a> (Mf * pq.ksub,</div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  pc,</div>
|
|
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  -2.0, qtab,</div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  ltab);</div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  ltab += Mf * pq.ksub;</div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  qtab += Mf * pq.ksub;</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = cm * Mf; m < (cm + 1) * Mf; m++) {</div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  q_code[m] = <a class="code" href="namespacefaiss.html#a9da63b8bb84460f5e8ccf8e17622cc7a">fvec_madd_and_argmin</a></div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  (pq.ksub, pc, -2, qtab, ltab);</div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  pc += pq.ksub;</div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  ltab += pq.ksub;</div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  qtab += pq.ksub;</div>
|
|
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div>
|
|
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  }</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> </div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  }</div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span> </div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keywordflow">return</span> dis0;</div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  }</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span> </div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordtype">float</span> precompute_list_table_pointers_L2 ()</div>
|
|
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  {</div>
|
|
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordtype">float</span> dis0 = 0;</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span> </div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (use_precomputed_table == 1) {</div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  dis0 = coarse_dis;</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * s = &ivfpq.precomputed_table [key * pq.ksub * pq.M];</div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.M; m++) {</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  sim_table_ptrs [m] = s;</div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  s += pq.ksub;</div>
|
|
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  }</div>
|
|
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (use_precomputed_table == 2) {</div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  dis0 = coarse_dis;</div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> </div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">const</span> MultiIndexQuantizer *miq =</div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>MultiIndexQuantizer *<span class="keyword">></span> (ivfpq.quantizer);</div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  FAISS_THROW_IF_NOT (miq);</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="keyword">const</span> ProductQuantizer &cpq = miq->pq;</div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordtype">int</span> Mf = pq.M / cpq.M;</div>
|
|
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span> </div>
|
|
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordtype">long</span> k = key;</div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordtype">int</span> m0 = 0;</div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cm = 0; cm < cpq.M; cm++) {</div>
|
|
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordtype">int</span> ki = k & ((uint64_t(1) << cpq.nbits) - 1);</div>
|
|
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  k >>= cpq.nbits;</div>
|
|
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div>
|
|
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *pc = &ivfpq.precomputed_table</div>
|
|
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  [(ki * pq.M + cm * Mf) * pq.ksub];</div>
|
|
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> </div>
|
|
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  for (<span class="keywordtype">int</span> m = m0; m < m0 + Mf; m++) {</div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  sim_table_ptrs [m] = pc;</div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  pc += pq.ksub;</div>
|
|
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div>
|
|
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  m0 += Mf;</div>
|
|
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  }</div>
|
|
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  FAISS_THROW_MSG (<span class="stringliteral">"need precomputed tables"</span>);</div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  }</div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span> </div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">if</span> (ivfpq.polysemous_ht) {</div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  FAISS_THROW_MSG (<span class="stringliteral">"not implemented"</span>);</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="comment">// Not clear that it makes sense to implemente this,</span></div>
|
|
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="comment">// because it costs M * ksub, which is what we wanted to</span></div>
|
|
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="comment">// avoid with the tables pointers.</span></div>
|
|
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  }</div>
|
|
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span> </div>
|
|
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">return</span> dis0;</div>
|
|
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div>
|
|
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div>
|
|
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> </div>
|
|
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span> };</div>
|
|
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span> </div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span> <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span> <span class="comment"> * Scaning the codes.</span></div>
|
|
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span> <span class="comment"> * The scanning functions call their favorite precompute_*</span></div>
|
|
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span> <span class="comment"> * function to precompute the tables they need.</span></div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> <span class="keyword">template</span> <<span class="keyword">typename</span> IDType></div>
|
|
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span> <span class="keyword">struct </span>InvertedListScanner: QueryTables {</div>
|
|
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div>
|
|
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keyword">const</span> uint8_t * __restrict list_codes;</div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keyword">const</span> IDType * list_ids;</div>
|
|
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordtype">size_t</span> list_size;</div>
|
|
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span> </div>
|
|
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keyword">explicit</span> InvertedListScanner (<span class="keyword">const</span> IndexIVFPQ & ivfpq):</div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  QueryTables (ivfpq)</div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  {</div>
|
|
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  FAISS_THROW_IF_NOT (pq.byte_per_idx == 1);</div>
|
|
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  n_hamming_pass = 0;</div>
|
|
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  }</div>
|
|
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span> <span class="comment"> /// list_specific intialization</span></div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span> <span class="comment"></span> <span class="keywordtype">void</span> init_list (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> key, <span class="keywordtype">float</span> coarse_dis,</div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="keywordtype">size_t</span> list_size_in, <span class="keyword">const</span> IDType *list_ids_in,</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="keyword">const</span> uint8_t *list_codes_in) {</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  this->key = key;</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  this->coarse_dis = coarse_dis;</div>
|
|
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  list_size = list_size_in;</div>
|
|
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  list_codes = list_codes_in;</div>
|
|
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  list_ids = list_ids_in;</div>
|
|
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  }</div>
|
|
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div>
|
|
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span> <span class="comment"> * Scaning the codes: simple PQ scan.</span></div>
|
|
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span> <span class="comment"> /// version of the scan where we use precomputed tables</span></div>
|
|
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span> <span class="comment"></span> <span class="keywordtype">void</span> scan_list_with_table (</div>
|
|
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> * heap_sim, <span class="keywordtype">long</span> * heap_ids, <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  {</div>
|
|
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordtype">float</span> dis0 = precompute_list_tables ();</div>
|
|
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span> </div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < list_size; j++) {</div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span> </div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="keywordtype">float</span> dis = dis0;</div>
|
|
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *tab = sim_table;</div>
|
|
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span> </div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < pq.M; m++) {</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  dis += tab[*list_codes++];</div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  tab += pq.ksub;</div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div>
|
|
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span> </div>
|
|
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keywordflow">if</span> (dis < heap_sim[0]) {</div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  maxheap_pop (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (key << 32 | j) : list_ids[j];</div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  maxheap_push (k, heap_sim, heap_ids, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</div>
|
|
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  }</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  }</div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span> </div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> <span class="comment"> /// tables are not precomputed, but pointers are provided to the</span></div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span> <span class="comment"> /// relevant X_c|x_r tables</span></div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span> <span class="comment"></span> <span class="keywordtype">void</span> scan_list_with_pointer (</div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> * heap_sim, <span class="keywordtype">long</span> * heap_ids, <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  {</div>
|
|
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span> </div>
|
|
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordtype">float</span> dis0 = precompute_list_table_pointers ();</div>
|
|
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span> </div>
|
|
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < list_size; j++) {</div>
|
|
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div>
|
|
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keywordtype">float</span> dis = dis0;</div>
|
|
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *tab = sim_table_2;</div>
|
|
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span> </div>
|
|
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < pq.M; m++) {</div>
|
|
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordtype">int</span> ci = *list_codes++;</div>
|
|
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  dis += sim_table_ptrs [m][ci] - 2 * tab [ci];</div>
|
|
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  tab += pq.ksub;</div>
|
|
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  }</div>
|
|
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div>
|
|
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="keywordflow">if</span> (dis < heap_sim[0]) {</div>
|
|
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  maxheap_pop (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (key << 32 | j) : list_ids[j];</div>
|
|
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  maxheap_push (k, heap_sim, heap_ids, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  }</div>
|
|
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  }</div>
|
|
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span> </div>
|
|
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  }</div>
|
|
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span> <span class="comment"> /// nothing is precomputed: access residuals on-the-fly</span></div>
|
|
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span> <span class="comment"></span> <span class="keywordtype">void</span> scan_on_the_fly_dist (</div>
|
|
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> * heap_sim, <span class="keywordtype">long</span> * heap_ids, <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  {</div>
|
|
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span> </div>
|
|
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">if</span> (by_residual && use_precomputed_table) {</div>
|
|
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  scan_list_with_pointer (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  }</div>
|
|
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span> </div>
|
|
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dvec;</div>
|
|
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keywordtype">float</span> dis0 = 0;</div>
|
|
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span> </div>
|
|
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keywordflow">if</span> (by_residual) {</div>
|
|
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">if</span> (metric_type == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  ivfpq.quantizer->reconstruct (key, residual_vec);</div>
|
|
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  dis0 = fvec_inner_product (residual_vec, qi, d);</div>
|
|
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  ivfpq.quantizer->compute_residual (qi, residual_vec, key);</div>
|
|
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  }</div>
|
|
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  dvec = residual_vec;</div>
|
|
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  dvec = qi;</div>
|
|
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  dis0 = 0;</div>
|
|
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  }</div>
|
|
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span> </div>
|
|
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < list_size; j++) {</div>
|
|
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span> </div>
|
|
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  pq.decode (list_codes, decoded_vec);</div>
|
|
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  list_codes += pq.code_size;</div>
|
|
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span> </div>
|
|
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordtype">float</span> dis;</div>
|
|
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="keywordflow">if</span> (metric_type == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  dis = -dis0 - fvec_inner_product (decoded_vec, qi, d);</div>
|
|
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  dis = <a class="code" href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">fvec_L2sqr</a> (decoded_vec, dvec, d);</div>
|
|
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div>
|
|
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div>
|
|
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="keywordflow">if</span> (dis < heap_sim[0]) {</div>
|
|
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  maxheap_pop (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (key << 32 | j) : list_ids[j];</div>
|
|
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  maxheap_push (k, heap_sim, heap_ids, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  }</div>
|
|
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  }</div>
|
|
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  }</div>
|
|
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span> </div>
|
|
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="comment">/*****************************************************</span></div>
|
|
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span> <span class="comment"> * Scanning codes with polysemous filtering</span></div>
|
|
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span> <span class="comment"> *****************************************************/</span></div>
|
|
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span> </div>
|
|
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="comment">// code for the query</span></div>
|
|
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="keywordtype">size_t</span> n_hamming_pass;</div>
|
|
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span> </div>
|
|
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span> </div>
|
|
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keyword">template</span> <<span class="keyword">class</span> HammingComputer></div>
|
|
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keywordtype">void</span> scan_list_polysemous_hc (</div>
|
|
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> * heap_sim, <span class="keywordtype">long</span> * heap_ids, <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  {</div>
|
|
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordtype">float</span> dis0 = precompute_list_tables ();</div>
|
|
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="keywordtype">int</span> ht = ivfpq.polysemous_ht;</div>
|
|
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span> </div>
|
|
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="keywordtype">int</span> code_size = pq.code_size;</div>
|
|
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span> </div>
|
|
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  HammingComputer hc (q_code.data(), code_size);</div>
|
|
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span> </div>
|
|
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < list_size; j++) {</div>
|
|
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keyword">const</span> uint8_t *b_code = list_codes;</div>
|
|
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordtype">int</span> hd = hc.hamming (b_code);</div>
|
|
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keywordflow">if</span> (hd < ht) {</div>
|
|
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  n_hamming_pass ++;</div>
|
|
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div>
|
|
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordtype">float</span> dis = dis0;</div>
|
|
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *tab = sim_table;</div>
|
|
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span> </div>
|
|
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < pq.M; m++) {</div>
|
|
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  dis += tab[*b_code++];</div>
|
|
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  tab += pq.ksub;</div>
|
|
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  }</div>
|
|
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span> </div>
|
|
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="keywordflow">if</span> (dis < heap_sim[0]) {</div>
|
|
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  maxheap_pop (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (key << 32 | j) : list_ids[j];</div>
|
|
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  maxheap_push (k, heap_sim, heap_ids, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  }</div>
|
|
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  }</div>
|
|
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  list_codes += code_size;</div>
|
|
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  }</div>
|
|
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  }</div>
|
|
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span> </div>
|
|
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keywordtype">void</span> scan_list_polysemous (</div>
|
|
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> * heap_sim, <span class="keywordtype">long</span> * heap_ids, <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  {</div>
|
|
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keywordflow">switch</span> (pq.code_size) {</div>
|
|
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span> <span class="preprocessor">#define HANDLE_CODE_SIZE(cs) \</span></div>
|
|
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span> <span class="preprocessor"> case cs: \</span></div>
|
|
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span> <span class="preprocessor"> scan_list_polysemous_hc <HammingComputer ## cs> \</span></div>
|
|
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span> <span class="preprocessor"> (k, heap_sim, heap_ids, store_pairs); \</span></div>
|
|
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span> <span class="preprocessor"> break</span></div>
|
|
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span> <span class="preprocessor"></span> HANDLE_CODE_SIZE(4);</div>
|
|
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  HANDLE_CODE_SIZE(8);</div>
|
|
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  HANDLE_CODE_SIZE(16);</div>
|
|
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  HANDLE_CODE_SIZE(20);</div>
|
|
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  HANDLE_CODE_SIZE(32);</div>
|
|
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  HANDLE_CODE_SIZE(64);</div>
|
|
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span> <span class="preprocessor">#undef HANDLE_CODE_SIZE</span></div>
|
|
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span> <span class="preprocessor"></span> <span class="keywordflow">default</span>:</div>
|
|
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="keywordflow">if</span> (pq.code_size % 8 == 0)</div>
|
|
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  scan_list_polysemous_hc <HammingComputerM8></div>
|
|
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  scan_list_polysemous_hc <HammingComputerM4></div>
|
|
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  }</div>
|
|
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  }</div>
|
|
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span> </div>
|
|
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span> };</div>
|
|
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span> </div>
|
|
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> </div>
|
|
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span> </div>
|
|
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span> </div>
|
|
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span> } <span class="comment">// anonymous namespace</span></div>
|
|
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span> </div>
|
|
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span> </div>
|
|
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span> IndexIVFPQStats indexIVFPQ_stats;</div>
|
|
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div>
|
|
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="keywordtype">void</span> IndexIVFPQStats::reset () {</div>
|
|
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  memset (<span class="keyword">this</span>, 0, <span class="keyword">sizeof</span> (*<span class="keyword">this</span>));</div>
|
|
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span> }</div>
|
|
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span> </div>
|
|
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span> </div>
|
|
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span> </div>
|
|
<div class="line"><a name="l00931"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02"> 931</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02">IndexIVFPQ::search_preassigned</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> nx, <span class="keyword">const</span> <span class="keywordtype">float</span> *qx, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
|
|
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *keys,</div>
|
|
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *coarse_dis,</div>
|
|
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <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="l00935"></a><span class="lineno"> 935</span>  <span class="keywordtype">bool</span> store_pairs)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_maxheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  size_t(nx), size_t(k),</div>
|
|
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  labels, distances</div>
|
|
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  };</div>
|
|
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div>
|
|
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="preprocessor">#pragma omp parallel</span></div>
|
|
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  InvertedListScanner<long> qt (*<span class="keyword">this</span>);</div>
|
|
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keywordtype">size_t</span> stats_nlist = 0;</div>
|
|
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordtype">size_t</span> stats_ncode = 0;</div>
|
|
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  uint64_t init_query_cycles = 0;</div>
|
|
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  uint64_t scan_cycles = 0;</div>
|
|
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  uint64_t heap_cycles = 0;</div>
|
|
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> </div>
|
|
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="preprocessor">#pragma omp for</span></div>
|
|
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nx; i++) {</div>
|
|
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *qi = qx + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> * keysi = keys + i * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *coarse_dis_i = coarse_dis + i * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="keywordtype">float</span> * heap_sim = res.<a class="code" href="structfaiss_1_1HeapArray.html#ae97911f6f85d152a5b45e459063b6858">get_val</a> (i);</div>
|
|
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordtype">long</span> * heap_ids = res.<a class="code" href="structfaiss_1_1HeapArray.html#af6aa57addaa1bc754d09a2a08be4df49">get_ids</a> (i);</div>
|
|
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span> </div>
|
|
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  uint64_t t0;</div>
|
|
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  TIC;</div>
|
|
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  maxheap_heapify (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  heap_cycles += TOC;</div>
|
|
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span> </div>
|
|
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  TIC;</div>
|
|
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  qt.init_query (qi);</div>
|
|
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  init_query_cycles += TOC;</div>
|
|
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span> </div>
|
|
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  <span class="keywordtype">size_t</span> nscan = 0;</div>
|
|
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span> </div>
|
|
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> ik = 0; ik < <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>; ik++) {</div>
|
|
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordtype">long</span> key = keysi[ik]; <span class="comment">/* select the list */</span></div>
|
|
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordflow">if</span> (key < 0) {</div>
|
|
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="comment">// not enough centroids for multiprobe</span></div>
|
|
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  }</div>
|
|
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  FAISS_THROW_IF_NOT_FMT (</div>
|
|
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  key < (<span class="keywordtype">long</span>) <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>,</div>
|
|
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  <span class="stringliteral">"Invalid key=%ld at ik=%ld nlist=%ld\n"</span>,</div>
|
|
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  key, ik, nlist);</div>
|
|
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span> </div>
|
|
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordtype">size_t</span> list_size = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[key].size();</div>
|
|
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  stats_nlist ++;</div>
|
|
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  nscan += list_size;</div>
|
|
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span> </div>
|
|
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">if</span> (list_size == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span> </div>
|
|
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  qt.init_list (key, coarse_dis_i[ik],</div>
|
|
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  list_size, <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[key].data(),</div>
|
|
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  codes[key].data());</div>
|
|
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span> </div>
|
|
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  TIC;</div>
|
|
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">polysemous_ht</a> > 0) {</div>
|
|
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  qt.scan_list_polysemous</div>
|
|
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (list_size > <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">scan_table_threshold</a>) {</div>
|
|
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  qt.scan_list_with_table (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  qt.scan_on_the_fly_dist (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  }</div>
|
|
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  scan_cycles += TOC;</div>
|
|
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> </div>
|
|
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a> && nscan >= <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a>) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  }</div>
|
|
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  stats_ncode += nscan;</div>
|
|
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  TIC;</div>
|
|
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  maxheap_reorder (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> </div>
|
|
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < k; j++)</div>
|
|
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  heap_sim[j] = -heap_sim[j];</div>
|
|
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  }</div>
|
|
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  heap_cycles += TOC;</div>
|
|
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div>
|
|
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> </div>
|
|
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="preprocessor">#pragma omp critical</span></div>
|
|
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  indexIVFPQ_stats.n_hamming_pass += qt.n_hamming_pass;</div>
|
|
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  indexIVFPQ_stats.nlist += stats_nlist;</div>
|
|
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  indexIVFPQ_stats.ncode += stats_ncode;</div>
|
|
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div>
|
|
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  indexIVFPQ_stats.init_query_cycles += init_query_cycles;</div>
|
|
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  indexIVFPQ_stats.init_list_cycles += qt.init_list_cycles;</div>
|
|
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  indexIVFPQ_stats.scan_cycles += scan_cycles - qt.init_list_cycles;</div>
|
|
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  indexIVFPQ_stats.heap_cycles += heap_cycles;</div>
|
|
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  }</div>
|
|
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span> </div>
|
|
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  }</div>
|
|
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  indexIVFPQ_stats.nq += nx;</div>
|
|
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> }</div>
|
|
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> </div>
|
|
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> </div>
|
|
<div class="line"><a name="l01032"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#a6310771a6e161e0bb4c46719550895f8"> 1032</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a6310771a6e161e0bb4c46719550895f8">IndexIVFPQ::search_and_reconstruct</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="l01033"></a><span class="lineno"> 1033</span>  <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="l01034"></a><span class="lineno"> 1034</span>  <span class="keywordtype">float</span> *reconstructed)</div>
|
|
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> {</div>
|
|
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  <span class="keywordtype">long</span> * idx = <span class="keyword">new</span> <span class="keywordtype">long</span> [n * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>];</div>
|
|
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<long></a> del (idx);</div>
|
|
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <span class="keywordtype">float</span> * coarse_dis = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>];</div>
|
|
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del2 (coarse_dis);</div>
|
|
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> </div>
|
|
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">search</a> (n, x, <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>, coarse_dis, idx);</div>
|
|
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> </div>
|
|
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02">search_preassigned</a> (n, x, k, idx, coarse_dis,</div>
|
|
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  distances, labels, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> </div>
|
|
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> j = 0; j < k; j++) {</div>
|
|
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  <span class="keywordtype">long</span> ij = i * k + j;</div>
|
|
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> res = labels[ij];</div>
|
|
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="keywordtype">float</span> *recons = reconstructed + d * (ij);</div>
|
|
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">if</span> (res < 0) {</div>
|
|
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="comment">// fill with NaNs</span></div>
|
|
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  memset(recons, -1, <span class="keyword">sizeof</span>(*recons) * d);</div>
|
|
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordtype">int</span> list_no = res >> 32;</div>
|
|
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <span class="keywordtype">int</span> ofs = res & 0xffffffff;</div>
|
|
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  labels[ij] = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no][ofs];</div>
|
|
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> </div>
|
|
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">reconstruct</a> (list_no, recons);</div>
|
|
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="keyword">const</span> uint8_t * code = &(codes[list_no][ofs * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>]);</div>
|
|
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div>
|
|
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="keywordtype">float</span> * out = recons + m * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * cent = <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, code[m]);</div>
|
|
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> l = 0; l < <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>; l++) {</div>
|
|
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  out[l] += cent[l];</div>
|
|
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  }</div>
|
|
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  }</div>
|
|
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  }</div>
|
|
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  }</div>
|
|
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  }</div>
|
|
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> </div>
|
|
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> }</div>
|
|
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> </div>
|
|
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </div>
|
|
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> </div>
|
|
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> </div>
|
|
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> </div>
|
|
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> IndexIVFPQ::IndexIVFPQ ()</div>
|
|
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> {</div>
|
|
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  <span class="comment">// initialize some runtime values</span></div>
|
|
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> = 0;</div>
|
|
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">scan_table_threshold</a> = 0;</div>
|
|
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">do_polysemous_training</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">polysemous_ht</a> = 0;</div>
|
|
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a> = 0;</div>
|
|
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">polysemous_training</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> }</div>
|
|
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> </div>
|
|
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> </div>
|
|
<div class="line"><a name="l01091"></a><span class="lineno"><a class="line" href="structfaiss_1_1CodeCmp.html"> 1091</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1CodeCmp.html">CodeCmp</a> {</div>
|
|
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="keyword">const</span> uint8_t *tab;</div>
|
|
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  <span class="keywordtype">size_t</span> code_size;</div>
|
|
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  <span class="keywordtype">bool</span> operator () (<span class="keywordtype">int</span> a, <span class="keywordtype">int</span> b)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <span class="keywordflow">return</span> cmp (a, b) > 0;</div>
|
|
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  }</div>
|
|
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <span class="keywordtype">int</span> cmp (<span class="keywordtype">int</span> a, <span class="keywordtype">int</span> b)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <span class="keywordflow">return</span> memcmp (tab + a * code_size, tab + b * code_size,</div>
|
|
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  code_size);</div>
|
|
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  }</div>
|
|
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> };</div>
|
|
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span> </div>
|
|
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> </div>
|
|
<div class="line"><a name="l01104"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQ.html#aee355b57acde203a3caed46a93e16a3c"> 1104</a></span> <span class="keywordtype">size_t</span> <a class="code" href="structfaiss_1_1IndexIVFPQ.html#aee355b57acde203a3caed46a93e16a3c">IndexIVFPQ::find_duplicates</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *dup_ids, <span class="keywordtype">size_t</span> *lims)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="keywordtype">size_t</span> ngroup = 0;</div>
|
|
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  lims[0] = 0;</div>
|
|
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> list_no = 0; list_no < <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; list_no++) {</div>
|
|
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  <span class="keywordtype">size_t</span> n = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no].size();</div>
|
|
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  std::vector<int> ord (n);</div>
|
|
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) ord[i] = i;</div>
|
|
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <a class="code" href="structfaiss_1_1CodeCmp.html">CodeCmp</a> cs = { codes[list_no].data(), code_size };</div>
|
|
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  std::sort (ord.begin(), ord.end(), cs);</div>
|
|
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> </div>
|
|
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *list_ids = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no].data();</div>
|
|
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  <span class="keywordtype">int</span> prev = -1; <span class="comment">// all elements from prev to i-1 are equal</span></div>
|
|
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="keywordflow">if</span> (prev >= 0 && cs.cmp (ord [prev], ord [i]) == 0) {</div>
|
|
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <span class="comment">// same as previous => remember</span></div>
|
|
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <span class="keywordflow">if</span> (prev + 1 == i) { <span class="comment">// start new group</span></div>
|
|
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  ngroup++;</div>
|
|
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  lims[ngroup] = lims[ngroup - 1];</div>
|
|
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  dup_ids [lims [ngroup]++] = list_ids [ord [prev]];</div>
|
|
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  }</div>
|
|
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  dup_ids [lims [ngroup]++] = list_ids [ord [i]];</div>
|
|
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  } <span class="keywordflow">else</span> { <span class="comment">// not same as previous.</span></div>
|
|
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  prev = i;</div>
|
|
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  }</div>
|
|
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  }</div>
|
|
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  }</div>
|
|
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keywordflow">return</span> ngroup;</div>
|
|
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> }</div>
|
|
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span> </div>
|
|
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span> </div>
|
|
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> </div>
|
|
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> </div>
|
|
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span> <span class="comment"> * IndexIVFPQR implementation</span></div>
|
|
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span> </div>
|
|
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> IndexIVFPQR::IndexIVFPQR (</div>
|
|
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> * quantizer, <span class="keywordtype">size_t</span> d, <span class="keywordtype">size_t</span> nlist,</div>
|
|
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits_per_idx,</div>
|
|
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  <span class="keywordtype">size_t</span> M_refine, <span class="keywordtype">size_t</span> nbits_per_idx_refine):</div>
|
|
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html">IndexIVFPQ</a> (quantizer, d, nlist, M, nbits_per_idx),</div>
|
|
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  refine_pq (d, M_refine, nbits_per_idx_refine),</div>
|
|
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  k_factor (4)</div>
|
|
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> {</div>
|
|
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> }</div>
|
|
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
|
|
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> IndexIVFPQR::IndexIVFPQR ():</div>
|
|
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  k_factor (1)</div>
|
|
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> {</div>
|
|
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> }</div>
|
|
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> </div>
|
|
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> </div>
|
|
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span> </div>
|
|
<div class="line"><a name="l01160"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#ae0e979a014a9defe2254e9543657b075"> 1160</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#ae0e979a014a9defe2254e9543657b075">IndexIVFPQR::reset</a>()</div>
|
|
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> {</div>
|
|
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a47a3b7665e9d2be41c6d3b2e9144b73f">IndexIVFPQ::reset</a>();</div>
|
|
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.clear();</div>
|
|
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> }</div>
|
|
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div>
|
|
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div>
|
|
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> </div>
|
|
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> </div>
|
|
<div class="line"><a name="l01169"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a68ed7cae5bec89fcdcb6a1d2addbd5a8"> 1169</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a68ed7cae5bec89fcdcb6a1d2addbd5a8">IndexIVFPQR::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)</div>
|
|
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> {</div>
|
|
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> </div>
|
|
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <span class="keywordtype">float</span> * residual_2 = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter <float></a> del(residual_2);</div>
|
|
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> </div>
|
|
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a4e06f04853dcb424dc393de5f641e917">train_residual_o</a> (n, x, residual_2);</div>
|
|
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> </div>
|
|
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>)</div>
|
|
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  printf (<span class="stringliteral">"training %zdx%zd 2nd level PQ quantizer on %ld %dD-vectors\n"</span>,</div>
|
|
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>, <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>, n, d);</div>
|
|
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div>
|
|
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a993e0a035248faad6e292a5ef9af1953">max_points_per_centroid</a> = 1000;</div>
|
|
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.verbose = <a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>;</div>
|
|
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div>
|
|
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.train (n, residual_2);</div>
|
|
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> </div>
|
|
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> }</div>
|
|
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> </div>
|
|
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> </div>
|
|
<div class="line"><a name="l01189"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a4b6154a5194d574d037ba78c137a2fa5"> 1189</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4b6154a5194d574d037ba78c137a2fa5">IndexIVFPQR::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) {</div>
|
|
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a186b746f22b65ddf416b1e821b0866ec">add_core</a> (n, x, xids, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> }</div>
|
|
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
|
|
<div class="line"><a name="l01193"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a186b746f22b65ddf416b1e821b0866ec"> 1193</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a186b746f22b65ddf416b1e821b0866ec">IndexIVFPQR::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="l01194"></a><span class="lineno"> 1194</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> *precomputed_idx) {</div>
|
|
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div>
|
|
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  <span class="keywordtype">float</span> * residual_2 = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter <float></a> del(residual_2);</div>
|
|
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> </div>
|
|
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n0 = <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> </div>
|
|
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#ac0cb8421b9885d691696d2ff4f76894b">add_core_o</a> (n, x, xids, residual_2, precomputed_idx);</div>
|
|
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div>
|
|
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.resize (<a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>);</div>
|
|
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> </div>
|
|
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (</div>
|
|
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  residual_2, &<a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>[n0 * <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>], n);</div>
|
|
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> </div>
|
|
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> </div>
|
|
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> }</div>
|
|
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> </div>
|
|
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> </div>
|
|
<div class="line"><a name="l01212"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a3e982ee6f1a3a025148270701867d04f"> 1212</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a3e982ee6f1a3a025148270701867d04f">IndexIVFPQR::search</a> (</div>
|
|
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <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="l01214"></a><span class="lineno"> 1214</span>  <span class="keywordtype">float</span> *distances, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *labels)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="keywordtype">long</span> * idx = <span class="keyword">new</span> <span class="keywordtype">long</span> [n * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>];</div>
|
|
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<long></a> del (idx);</div>
|
|
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="keywordtype">float</span> * L1_dis = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>];</div>
|
|
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del2 (L1_dis);</div>
|
|
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  uint64_t t0;</div>
|
|
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  TIC;</div>
|
|
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">search</a> (n, x, <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>, L1_dis, idx);</div>
|
|
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  indexIVFPQ_stats.assign_cycles += TOC;</div>
|
|
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> </div>
|
|
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  TIC;</div>
|
|
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="keywordtype">size_t</span> k_coarse = long(k * <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a0b02a4151ceacc070352f8b15cc0ee0b">k_factor</a>);</div>
|
|
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *coarse_labels = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> [k_coarse * n];</div>
|
|
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<idx_t></a> del3 (coarse_labels);</div>
|
|
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  { <span class="comment">// query with quantizer levels 1 and 2.</span></div>
|
|
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="keywordtype">float</span> *coarse_distances = <span class="keyword">new</span> <span class="keywordtype">float</span> [k_coarse * n];</div>
|
|
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(coarse_distances);</div>
|
|
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span> </div>
|
|
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a150a37cf3e8a7e37cb8dab1d5678bc02">search_preassigned</a> (n, x, k_coarse,</div>
|
|
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  idx, L1_dis, coarse_distances, coarse_labels,</div>
|
|
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  }</div>
|
|
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> </div>
|
|
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> </div>
|
|
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  indexIVFPQ_stats.search_cycles += TOC;</div>
|
|
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div>
|
|
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  TIC;</div>
|
|
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> </div>
|
|
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="comment">// 3rd level refinement</span></div>
|
|
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <span class="keywordtype">size_t</span> n_refine = 0;</div>
|
|
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> <span class="preprocessor">#pragma omp parallel reduction(+ : n_refine)</span></div>
|
|
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  <span class="comment">// tmp buffers</span></div>
|
|
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  <span class="keywordtype">float</span> *residual_1 = <span class="keyword">new</span> <span class="keywordtype">float</span> [2 * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del (residual_1);</div>
|
|
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  <span class="keywordtype">float</span> *residual_2 = residual_1 + <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> <span class="preprocessor">#pragma omp for</span></div>
|
|
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xq = x + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> * shortlist = coarse_labels + k_coarse * i;</div>
|
|
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordtype">float</span> * heap_sim = distances + k * i;</div>
|
|
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="keywordtype">long</span> * heap_ids = labels + k * i;</div>
|
|
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  maxheap_heapify (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> </div>
|
|
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < k_coarse; j++) {</div>
|
|
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <span class="keywordtype">long</span> sl = shortlist[j];</div>
|
|
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span> </div>
|
|
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <span class="keywordflow">if</span> (sl == -1) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span> </div>
|
|
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordtype">int</span> list_no = sl >> 32;</div>
|
|
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keywordtype">int</span> ofs = sl & 0xffffffff;</div>
|
|
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> </div>
|
|
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  assert (list_no >= 0 && list_no < <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>);</div>
|
|
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  assert (ofs >= 0 && ofs < <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no].size());</div>
|
|
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> </div>
|
|
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <span class="comment">// 1st level residual</span></div>
|
|
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (xq, residual_1, list_no);</div>
|
|
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span> </div>
|
|
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="comment">// 2nd level residual</span></div>
|
|
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  <span class="keyword">const</span> uint8_t * l2code = &codes[list_no][ofs * <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (l2code, residual_2);</div>
|
|
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> l = 0; l < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; l++)</div>
|
|
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  residual_2[l] = residual_1[l] - residual_2[l];</div>
|
|
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span> </div>
|
|
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  <span class="comment">// 3rd level residual's approximation</span></div>
|
|
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> <span class="keywordtype">id</span> = <a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no][ofs];</div>
|
|
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  assert (0 <= <span class="keywordtype">id</span> && <span class="keywordtype">id</span> < <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>);</div>
|
|
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (&<a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a> [<span class="keywordtype">id</span> * <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>],</div>
|
|
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  residual_1);</div>
|
|
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> </div>
|
|
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="keywordtype">float</span> dis = <a class="code" href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">fvec_L2sqr</a> (residual_1, residual_2, d);</div>
|
|
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> </div>
|
|
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <span class="keywordflow">if</span> (dis < heap_sim[0]) {</div>
|
|
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  maxheap_pop (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  maxheap_push (k, heap_sim, heap_ids, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  }</div>
|
|
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  n_refine ++;</div>
|
|
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  }</div>
|
|
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  maxheap_reorder (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  }</div>
|
|
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  }</div>
|
|
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  indexIVFPQ_stats.nrefine += n_refine;</div>
|
|
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  indexIVFPQ_stats.refine_cycles += TOC;</div>
|
|
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> }</div>
|
|
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> </div>
|
|
<div class="line"><a name="l01301"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a0f0d8fc6b2c6aa2431c1730111a3b22a"> 1301</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a0f0d8fc6b2c6aa2431c1730111a3b22a">IndexIVFPQR::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</span></div>
|
|
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  std::vector<float> r3 (d);</div>
|
|
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> </div>
|
|
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1df10e9e5f4ff0dabf283f19ad94bbd4">IndexIVFPQ::reconstruct_n</a> (i0, ni, recons);</div>
|
|
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span> </div>
|
|
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i = i0; i < i0 + ni; i++) {</div>
|
|
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  <span class="keywordtype">float</span> *r = recons + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (&<a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a> [i * <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a4a80540e7cdfb3e43712ffb93e083a7c">refine_pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>], r3.data());</div>
|
|
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div>
|
|
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>; j++)</div>
|
|
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  r[j] += r3[j];</div>
|
|
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> </div>
|
|
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  }</div>
|
|
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> </div>
|
|
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span> }</div>
|
|
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> </div>
|
|
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span> </div>
|
|
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span> </div>
|
|
<div class="line"><a name="l01320"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#a31a1fec2a88b410ea96ce5be7d527be9"> 1320</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a31a1fec2a88b410ea96ce5be7d527be9">IndexIVFPQR::merge_from</a> (<a class="code" href="structfaiss_1_1IndexIVF.html">IndexIVF</a> &other_in, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> add_id)</div>
|
|
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> {</div>
|
|
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html">IndexIVFPQR</a> *other = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1IndexIVFPQR.html">IndexIVFPQR</a> *<span class="keyword">></span> (&other_in);</div>
|
|
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  FAISS_THROW_IF_NOT(other);</div>
|
|
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> </div>
|
|
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a0f22cc237c30c935df5b6560aecf8f01">IndexIVF::merge_from</a> (other_in, add_id);</div>
|
|
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> </div>
|
|
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.insert (<a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.end(),</div>
|
|
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  other-><a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.begin(),</div>
|
|
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  other-><a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.end());</div>
|
|
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  other-><a class="code" href="structfaiss_1_1IndexIVFPQR.html#a588bd0b733c8db18eaeb7bc287afd16e">refine_codes</a>.clear();</div>
|
|
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> }</div>
|
|
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span> </div>
|
|
<div class="line"><a name="l01333"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQR.html#acc5eeeeb8ac8d2581ef07947932d9f6c"> 1333</a></span> <span class="keywordtype">long</span> <a class="code" href="structfaiss_1_1IndexIVFPQR.html#acc5eeeeb8ac8d2581ef07947932d9f6c">IndexIVFPQR::remove_ids</a>(<span class="keyword">const</span> <a class="code" href="structfaiss_1_1IDSelector.html">IDSelector</a>& <span class="comment">/*sel*/</span>) {</div>
|
|
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  FAISS_THROW_MSG(<span class="stringliteral">"not implemented"</span>);</div>
|
|
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> }</div>
|
|
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span> </div>
|
|
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> <span class="comment"> * IndexIVFPQCompact implementation</span></div>
|
|
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span> </div>
|
|
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span> IndexIVFPQCompact::IndexIVFPQCompact ()</div>
|
|
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> {</div>
|
|
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  alloc_type = <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a3d58d7b26146791f0fe34b35a9b0fd95">Alloc_type_none</a>;</div>
|
|
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span> }</div>
|
|
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> </div>
|
|
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span> </div>
|
|
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> IndexIVFPQCompact::IndexIVFPQCompact (<span class="keyword">const</span> IndexIVFPQ &other)</div>
|
|
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> {</div>
|
|
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  FAISS_THROW_IF_NOT_MSG (other.ntotal < (1UL << 31),</div>
|
|
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <span class="stringliteral">"IndexIVFPQCompact cannot store more than 2G images"</span>);</div>
|
|
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span> </div>
|
|
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="comment">// here it would be more convenient to just use the</span></div>
|
|
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="comment">// copy-constructor, but it would copy the lists as well: too much</span></div>
|
|
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="comment">// overhead...</span></div>
|
|
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> </div>
|
|
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="comment">// copy fields from Index</span></div>
|
|
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  d = other.d;</div>
|
|
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = other.ntotal;</div>
|
|
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  <a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a> = other.verbose;</div>
|
|
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = other.is_trained;</div>
|
|
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  <a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> = other.metric_type;</div>
|
|
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> </div>
|
|
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="comment">// copy fields from IndexIVF (except ids)</span></div>
|
|
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a> = other.nlist;</div>
|
|
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a> = other.nprobe;</div>
|
|
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a> = other.quantizer;</div>
|
|
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a28c248ae6a2b0991c012ab7abe13574a">quantizer_trains_alone</a> = other.quantizer_trains_alone;</div>
|
|
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#aed2e9757ad5f3c234fd8ad60175a2a73">own_fields</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  direct_map = other.direct_map;</div>
|
|
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> </div>
|
|
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="comment">// copy fields from IndexIVFPQ (except codes)</span></div>
|
|
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#afd13b471df293ae5a6e895704c69a4c3">by_residual</a> = other.by_residual;</div>
|
|
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a1c66ff073c18a1edbe8444c24d870583">use_precomputed_table</a> = other.use_precomputed_table;</div>
|
|
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9b310195d610c3e326471b3758206b59">precomputed_table</a> = other.precomputed_table;</div>
|
|
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  code_size = other.code_size;</div>
|
|
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a007303be116c8da65b6d058e3fc77d16">pq</a> = other.pq;</div>
|
|
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a9d5373633df7a9bec4de69400b9adeed">do_polysemous_training</a> = other.do_polysemous_training;</div>
|
|
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a2b14cbb5acb3fc28a4df8fde3f5567cd">polysemous_training</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span> </div>
|
|
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">scan_table_threshold</a> = other.scan_table_threshold;</div>
|
|
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a> = other.max_codes;</div>
|
|
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">polysemous_ht</a> = other.polysemous_ht;</div>
|
|
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> </div>
|
|
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="comment">//allocate</span></div>
|
|
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  alloc_type = <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6">Alloc_type_new</a>;</div>
|
|
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a> = <span class="keyword">new</span> uint32_t [<a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a> + 1];</div>
|
|
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a> = <span class="keyword">new</span> uint32_t [<a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>];</div>
|
|
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a> = <span class="keyword">new</span> uint8_t [<a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * <a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>];</div>
|
|
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> </div>
|
|
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> </div>
|
|
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="comment">// copy content from other</span></div>
|
|
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="keywordtype">size_t</span> ofs = 0;</div>
|
|
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < <a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; i++) {</div>
|
|
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a> [i] = ofs;</div>
|
|
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="keyword">const</span> std::vector<long> &other_ids = other.ids[i];</div>
|
|
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < other_ids.size(); j++) {</div>
|
|
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = other_ids[j];</div>
|
|
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  FAISS_THROW_IF_NOT_MSG (<span class="keywordtype">id</span> < (1UL << 31),</div>
|
|
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  <span class="stringliteral">"IndexIVFPQCompact cannot store ids > 2G"</span>);</div>
|
|
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a>[ofs + j] = id;</div>
|
|
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  }</div>
|
|
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  memcpy (<a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a> + ofs * code_size,</div>
|
|
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  other.codes[i].data(),</div>
|
|
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  other.codes[i].size());</div>
|
|
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  ofs += other_ids.size();</div>
|
|
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  }</div>
|
|
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  FAISS_THROW_IF_NOT (ofs == <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>);</div>
|
|
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a> [<a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>] = ofs;</div>
|
|
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span> </div>
|
|
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> }</div>
|
|
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> </div>
|
|
<div class="line"><a name="l01416"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ade7b46bbbcaf244ad680104380afb1b8"> 1416</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ade7b46bbbcaf244ad680104380afb1b8">IndexIVFPQCompact::add</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a>, <span class="keyword">const</span> <span class="keywordtype">float</span> *) {</div>
|
|
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  FAISS_THROW_MSG (<span class="stringliteral">"cannot add to an IndexIVFPQCompact"</span>);</div>
|
|
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> }</div>
|
|
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> </div>
|
|
<div class="line"><a name="l01420"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#a8f5eccfb4d5e4098ff6c00acb3bc40a1"> 1420</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a8f5eccfb4d5e4098ff6c00acb3bc40a1">IndexIVFPQCompact::reset</a> () {</div>
|
|
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  FAISS_THROW_MSG (<span class="stringliteral">"cannot reset an IndexIVFPQCompact"</span>);</div>
|
|
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> }</div>
|
|
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span> </div>
|
|
<div class="line"><a name="l01424"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#a0ef8132fae22a50616fe1201c8b20588"> 1424</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a0ef8132fae22a50616fe1201c8b20588">IndexIVFPQCompact::train</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a>, <span class="keyword">const</span> <span class="keywordtype">float</span> *) {</div>
|
|
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  FAISS_THROW_MSG (<span class="stringliteral">"cannot train an IndexIVFPQCompact"</span>);</div>
|
|
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span> }</div>
|
|
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> </div>
|
|
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span> </div>
|
|
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span> </div>
|
|
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div>
|
|
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> IndexIVFPQCompact::~IndexIVFPQCompact ()</div>
|
|
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> {</div>
|
|
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keywordflow">if</span> (alloc_type == <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70acf2d6ba8878a2778383adc32593ba8e6">Alloc_type_new</a>) {</div>
|
|
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="keyword">delete</span> [] <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a>;</div>
|
|
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="keyword">delete</span> [] <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a>;</div>
|
|
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="keyword">delete</span> [] <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a>;</div>
|
|
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (alloc_type == <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ab2698c5d65644a171c53ffe39e420b70a38c1b1ed9ebdbd4b0047be13080094bb">Alloc_type_mmap</a>) {</div>
|
|
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  munmap (mmap_buffer, mmap_length);</div>
|
|
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> </div>
|
|
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  }</div>
|
|
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span> </div>
|
|
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> }</div>
|
|
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> </div>
|
|
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> </div>
|
|
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> </div>
|
|
<div class="line"><a name="l01446"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFPQCompact.html#ada9e5292194ee1be42d122037fbf2502"> 1446</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#ada9e5292194ee1be42d122037fbf2502">IndexIVFPQCompact::search_preassigned</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> nx, <span class="keyword">const</span> <span class="keywordtype">float</span> *qx, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
|
|
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *keys,</div>
|
|
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *coarse_dis,</div>
|
|
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <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="l01450"></a><span class="lineno"> 1450</span>  <span class="keywordtype">bool</span> store_pairs)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_maxheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  size_t(nx), size_t(k),</div>
|
|
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  labels, distances</div>
|
|
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  };</div>
|
|
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> </div>
|
|
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> <span class="preprocessor">#pragma omp parallel</span></div>
|
|
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  InvertedListScanner<uint32_t> qt (*<span class="keyword">this</span>);</div>
|
|
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="keywordtype">size_t</span> stats_nlist = 0;</div>
|
|
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  <span class="keywordtype">size_t</span> stats_ncode = 0;</div>
|
|
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  uint64_t init_query_cycles = 0;</div>
|
|
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  uint64_t scan_cycles = 0;</div>
|
|
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  uint64_t heap_cycles = 0;</div>
|
|
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> </div>
|
|
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="preprocessor">#pragma omp for</span></div>
|
|
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nx; i++) {</div>
|
|
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *qi = qx + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> * keysi = keys + i * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *coarse_dis_i = coarse_dis + i * <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordtype">float</span> * heap_sim = res.<a class="code" href="structfaiss_1_1HeapArray.html#ae97911f6f85d152a5b45e459063b6858">get_val</a> (i);</div>
|
|
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <span class="keywordtype">long</span> * heap_ids = res.<a class="code" href="structfaiss_1_1HeapArray.html#af6aa57addaa1bc754d09a2a08be4df49">get_ids</a> (i);</div>
|
|
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> </div>
|
|
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  uint64_t t0;</div>
|
|
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  TIC;</div>
|
|
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  maxheap_heapify (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  heap_cycles += TOC;</div>
|
|
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span> </div>
|
|
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  TIC;</div>
|
|
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  qt.init_query (qi);</div>
|
|
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  init_query_cycles += TOC;</div>
|
|
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> </div>
|
|
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <span class="keywordtype">size_t</span> nscan = 0;</div>
|
|
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span> </div>
|
|
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> ik = 0; ik < <a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>; ik++) {</div>
|
|
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="keywordtype">long</span> key = keysi[ik]; <span class="comment">/* select the list */</span></div>
|
|
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  <span class="keywordflow">if</span> (key < 0) {</div>
|
|
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  <span class="comment">// not enough centroids for multiprobe</span></div>
|
|
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  }</div>
|
|
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  <span class="keywordflow">if</span> (key >= (<span class="keywordtype">long</span>) nlist) {</div>
|
|
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  fprintf (stderr, <span class="stringliteral">"Invalid key=%ld nlist=%ld\n"</span>, key, nlist);</div>
|
|
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  <span class="keywordflow">throw</span>;</div>
|
|
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  }</div>
|
|
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  <span class="keywordtype">size_t</span> list_size = <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a>[key + 1] - <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a146ccc5a05aed1d2e96df8c1d3f7663d">limits</a>[key];</div>
|
|
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  stats_nlist ++;</div>
|
|
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  nscan += list_size;</div>
|
|
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> </div>
|
|
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keywordflow">if</span> (list_size == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span> </div>
|
|
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  qt.init_list (key, coarse_dis_i[ik],</div>
|
|
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  list_size, <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#a1fa62ed464c15768479c92646ed484c7">compact_ids</a> + limits[key],</div>
|
|
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  <a class="code" href="structfaiss_1_1IndexIVFPQCompact.html#aaaf53cae0e47baf3fb1199ce4d789694">compact_codes</a> + limits[key] * code_size);</div>
|
|
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span> </div>
|
|
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  TIC;</div>
|
|
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a3093a0a3e128eafce6e0583b75e9662e">polysemous_ht</a> > 0) {</div>
|
|
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  qt.scan_list_polysemous</div>
|
|
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (list_size > <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a7430fc4fa030c96497abced3b68358d4">scan_table_threshold</a>) {</div>
|
|
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  qt.scan_list_with_table (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  qt.scan_on_the_fly_dist (k, heap_sim, heap_ids, store_pairs);</div>
|
|
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  }</div>
|
|
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  scan_cycles += TOC;</div>
|
|
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> </div>
|
|
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a> && nscan >= <a class="code" href="structfaiss_1_1IndexIVFPQ.html#a77501995b3671e377102d2db1a93ade4">max_codes</a>) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  }</div>
|
|
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  stats_ncode += nscan;</div>
|
|
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  TIC;</div>
|
|
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  maxheap_reorder (k, heap_sim, heap_ids);</div>
|
|
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> </div>
|
|
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < k; j++) {</div>
|
|
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  heap_sim[i] = -heap_sim[i];</div>
|
|
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  }</div>
|
|
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  }</div>
|
|
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  heap_cycles += TOC;</div>
|
|
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  }</div>
|
|
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> </div>
|
|
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> <span class="preprocessor">#pragma omp critical</span></div>
|
|
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  indexIVFPQ_stats.n_hamming_pass += qt.n_hamming_pass;</div>
|
|
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  indexIVFPQ_stats.nlist += stats_nlist;</div>
|
|
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  indexIVFPQ_stats.ncode += stats_ncode;</div>
|
|
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> </div>
|
|
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  indexIVFPQ_stats.init_query_cycles += init_query_cycles;</div>
|
|
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  indexIVFPQ_stats.init_list_cycles += qt.init_list_cycles;</div>
|
|
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  indexIVFPQ_stats.scan_cycles += scan_cycles - qt.init_list_cycles;</div>
|
|
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  indexIVFPQ_stats.heap_cycles += heap_cycles;</div>
|
|
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  }</div>
|
|
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> </div>
|
|
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  }</div>
|
|
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  indexIVFPQ_stats.nq += nx;</div>
|
|
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span> }</div>
|
|
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> </div>
|
|
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> </div>
|
|
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> </div>
|
|
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> } <span class="comment">// namespace faiss</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#l00227">IndexIVFPQ.h:227</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#l00228">IndexIVFPQ.h:228</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 &other, idx_t add_id) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01320">IndexIVFPQ.cpp:1320</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#l00302">IndexIVFPQ.cpp:302</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#l00168">IndexIVFPQ.h:168</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a7afbf9d96276f021981e99f064254208"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">faiss::ProductQuantizer::decode</a></div><div class="ttdeci">void decode(const uint8_t *code, float *x) const </div><div class="ttdoc">decode a vector from a given code (or n vectors if third argument) </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00338">ProductQuantizer.cpp:338</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#l00169">IndexIVFPQ.h:169</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a7466bd32de31640860393a701eaac5ad"><div class="ttname"><a href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">faiss::fvec_L2sqr</a></div><div class="ttdeci">float fvec_L2sqr(const float *x, const float *y, size_t d)</div><div class="ttdoc">Squared L2 distance between two vectors. </div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l00574">utils.cpp:574</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_1HeapArray_html_ae97911f6f85d152a5b45e459063b6858"><div class="ttname"><a href="structfaiss_1_1HeapArray.html#ae97911f6f85d152a5b45e459063b6858">faiss::HeapArray::get_val</a></div><div class="ttdeci">T * get_val(size_t key)</div><div class="ttdoc">Return the list of values for a heap. </div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00360">Heap.h:360</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#l01416">IndexIVFPQ.cpp:1416</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#l01301">IndexIVFPQ.cpp:1301</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#l01446">IndexIVFPQ.cpp:1446</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a28c248ae6a2b0991c012ab7abe13574a"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a28c248ae6a2b0991c012ab7abe13574a">faiss::IndexIVF::quantizer_trains_alone</a></div><div class="ttdeci">char quantizer_trains_alone</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00056">IndexIVF.h:56</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a14884d253128c7af5891a65082ad7dc6"><div class="ttname"><a href="namespacefaiss.html#a14884d253128c7af5891a65082ad7dc6">faiss::fvecs_maybe_subsample</a></div><div class="ttdeci">const float * fvecs_maybe_subsample(size_t d, size_t *n, size_t nmax, const float *x, bool verbose, long seed)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01973">utils.cpp:1973</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_affed235eadf27a13d753ee4d33a1dc58"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">faiss::IndexIVF::nprobe</a></div><div class="ttdeci">size_t nprobe</div><div class="ttdoc">number of probes at query time </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00047">IndexIVF.h:47</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#l00221">IndexIVFPQ.h:221</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#l01169">IndexIVFPQ.cpp:1169</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#l01193">IndexIVFPQ.cpp:1193</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScopeDeleter_html"><div class="ttname"><a href="structfaiss_1_1ScopeDeleter.html">faiss::ScopeDeleter</a></div><div class="ttdef"><b>Definition:</b> <a href="FaissException_8h_source.html#l00039">FaissException.h:39</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#l00226">IndexIVFPQ.h:226</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a467b451ca203544e42c250e4be65b983"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">faiss::ProductQuantizer::dsub</a></div><div class="ttdeci">size_t dsub</div><div class="ttdoc">dimensionality of each subvector </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00032">ProductQuantizer.h:32</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ClusteringParameters_html_a509c65e2ebe6ecabebd163ecb03c5579"><div class="ttname"><a href="structfaiss_1_1ClusteringParameters.html#a509c65e2ebe6ecabebd163ecb03c5579">faiss::ClusteringParameters::seed</a></div><div class="ttdeci">int seed</div><div class="ttdoc">seed for the random number generator </div><div class="ttdef"><b>Definition:</b> <a href="Clustering_8h_source.html#l00036">Clustering.h:36</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< float > 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="namespacefaiss_html_a40328c31abd0bbba5bd95d7de951e847"><div class="ttname"><a href="namespacefaiss.html#a40328c31abd0bbba5bd95d7de951e847">faiss::fvec_madd</a></div><div class="ttdeci">void fvec_madd(size_t n, const float *a, float bf, const float *b, float *c)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01887">utils.cpp:1887</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#l01160">IndexIVFPQ.cpp:1160</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_1IndexIVF_html_af16d325f5bef22b2e5f90ceea796e80d"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">faiss::IndexIVF::ids</a></div><div class="ttdeci">std::vector< std::vector< long > > ids</div><div class="ttdoc">Inverted lists for indexes. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00062">IndexIVF.h:62</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ae5a340ee5a4b1d35a565b167de2a2ef1"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">faiss::ProductQuantizer::compute_codes</a></div><div class="ttdeci">void compute_codes(const float *x, uint8_t *codes, size_t n) const </div><div class="ttdoc">same as compute_code for several vectors </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00385">ProductQuantizer.cpp:385</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_1CodeCmp_html"><div class="ttname"><a href="structfaiss_1_1CodeCmp.html">faiss::CodeCmp</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01091">IndexIVFPQ.cpp:1091</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< uint8_t > refine_codes</div><div class="ttdoc">corresponding codes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8h_source.html#l00170">IndexIVFPQ.h:170</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_aa61330eadb84772b71018b093773a5f9"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">faiss::ProductQuantizer::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">byte per indexed vector </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00034">ProductQuantizer.h:34</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#l01424">IndexIVFPQ.cpp:1424</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_aed2e9757ad5f3c234fd8ad60175a2a73"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#aed2e9757ad5f3c234fd8ad60175a2a73">faiss::IndexIVF::own_fields</a></div><div class="ttdeci">bool own_fields</div><div class="ttdoc">whether object owns the quantizer </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00057">IndexIVF.h:57</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a0feee45e4151547b7a0444c14bad398f"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">faiss::ProductQuantizer::ksub</a></div><div class="ttdeci">size_t ksub</div><div class="ttdoc">number of centroids for each subquantizer </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00035">ProductQuantizer.h:35</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1HeapArray_html"><div class="ttname"><a href="structfaiss_1_1HeapArray.html">faiss::HeapArray</a></div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00350">Heap.h:350</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_1ProductQuantizer_html_a08b130e3a21f2699a4e3bbec121fb838"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">faiss::ProductQuantizer::compute_code</a></div><div class="ttdeci">void compute_code(const float *x, uint8_t *code) const </div><div class="ttdoc">Quantize one vector with the product quantizer. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00311">ProductQuantizer.cpp:311</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a6970683faa021b7a6f1a0865c0d4eccd"><div class="ttname"><a href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">faiss::Index::ntotal</a></div><div class="ttdeci">idx_t ntotal</div><div class="ttdoc">total nb of indexed vectors </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00065">Index.h:65</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a5590d847c5c2b958affd2a05e58a6f23"><div class="ttname"><a href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">faiss::Index::verbose</a></div><div class="ttdeci">bool verbose</div><div class="ttdoc">verbosity level </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00066">Index.h:66</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a47a3b7665e9d2be41c6d3b2e9144b73f"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a47a3b7665e9d2be41c6d3b2e9144b73f">faiss::IndexIVF::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="IndexIVF_8cpp_source.html#l00112">IndexIVF.cpp:112</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_af2a71f7d5402ae02ce169a4cc83020eb"><div class="ttname"><a href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">faiss::getmillisecs</a></div><div class="ttdeci">double getmillisecs()</div><div class="ttdoc">ms elapsed since some arbitrary epoch </div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l00074">utils.cpp:74</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_1Index_html_aced51b1ebc33c47ab3ae15ea906559a7"><div class="ttname"><a href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">faiss::Index::search</a></div><div class="ttdeci">virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const =0</div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html">faiss::MultiIndexQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00135">IndexPQ.h:135</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a7a49180ebf10e643217bbce5862c7f84"><div class="ttname"><a href="namespacefaiss.html#a7a49180ebf10e643217bbce5862c7f84">faiss::fvec_norm_L2sqr</a></div><div class="ttdeci">float fvec_norm_L2sqr(const float *x, size_t d)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l00632">utils.cpp:632</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_af265acf5aa1bcda60898002287e6a3d6"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">faiss::ProductQuantizer::cp</a></div><div class="ttdeci">ClusteringParameters cp</div><div class="ttdoc">parameters used during clustering </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00049">ProductQuantizer.h:49</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_1HeapArray_html_af6aa57addaa1bc754d09a2a08be4df49"><div class="ttname"><a href="structfaiss_1_1HeapArray.html#af6aa57addaa1bc754d09a2a08be4df49">faiss::HeapArray::get_ids</a></div><div class="ttdeci">TI * get_ids(size_t key)</div><div class="ttdoc">Correspponding identifiers. </div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00363">Heap.h:363</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a8e18f641854b2bde83ecff0a2f9a6f4e"><div class="ttname"><a href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">faiss::Index::metric_type</a></div><div class="ttdeci">MetricType metric_type</div><div class="ttdoc">type of metric this index uses for search </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00072">Index.h:72</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#l00219">IndexIVFPQ.h:219</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFPQ_html_a6310771a6e161e0bb4c46719550895f8"><div class="ttname"><a href="structfaiss_1_1IndexIVFPQ.html#a6310771a6e161e0bb4c46719550895f8">faiss::IndexIVFPQ::search_and_reconstruct</a></div><div class="ttdeci">void search_and_reconstruct(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels, float *reconstructed)</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01032">IndexIVFPQ.cpp:1032</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_1ProductQuantizer_html_a83600e328893ce5f41fe459f5a3acf41"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">faiss::ProductQuantizer::M</a></div><div class="ttdeci">size_t M</div><div class="ttdoc">number of subquantizers </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00028">ProductQuantizer.h:28</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="namespacefaiss_html_a9da63b8bb84460f5e8ccf8e17622cc7a"><div class="ttname"><a href="namespacefaiss.html#a9da63b8bb84460f5e8ccf8e17622cc7a">faiss::fvec_madd_and_argmin</a></div><div class="ttdeci">int fvec_madd_and_argmin(size_t n, const float *a, float bf, const float *b, float *c)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01961">utils.cpp:1961</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 &sel) override</div><div class="ttdoc">Dataset manipulation functions. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVFPQ_8cpp_source.html#l01333">IndexIVFPQ.cpp:1333</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#l01420">IndexIVFPQ.cpp:1420</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a6e92732617c4dbe364e7678dd8773a7f"><div class="ttname"><a href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">faiss::Index::is_trained</a></div><div class="ttdeci">bool is_trained</div><div class="ttdoc">set if the Index does not require training, or if training is done already </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00069">Index.h:69</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aaae77608bbda70b1098897e9167a82f9"><div class="ttname"><a href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">faiss::Index::compute_residual</a></div><div class="ttdeci">void compute_residual(const float *x, float *residual, idx_t key) const </div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00056">Index.cpp:56</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a4f0f33c011dffe633a1748a48a082c22"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">faiss::ProductQuantizer::get_centroids</a></div><div class="ttdeci">float * get_centroids(size_t m, size_t i)</div><div class="ttdoc">return the centroids associated with subvector m </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00055">ProductQuantizer.h:55</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aaef6f4132b1f390121ebb11058baf190"><div class="ttname"><a href="structfaiss_1_1Index.html#aaef6f4132b1f390121ebb11058baf190">faiss::Index::reconstruct</a></div><div class="ttdeci">virtual void reconstruct(idx_t key, float *recons) const </div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00043">Index.cpp:43</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#l00220">IndexIVFPQ.h:220</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_aedd0c14b5654295b291638ec7f9f9517"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#aedd0c14b5654295b291638ec7f9f9517">faiss::IndexIVF::maintain_direct_map</a></div><div class="ttdeci">bool maintain_direct_map</div><div class="ttdoc">map for direct access to the elements. Enables reconstruct(). </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00068">IndexIVF.h:68</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html_a995374ba2f0bc2738edae72ca9142f82"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82">faiss::PolysemousTraining::optimize_pq_for_hamming</a></div><div class="ttdeci">void optimize_pq_for_hamming(ProductQuantizer &pq, size_t n, const float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00933">PolysemousTraining.cpp:933</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ClusteringParameters_html_a993e0a035248faad6e292a5ef9af1953"><div class="ttname"><a href="structfaiss_1_1ClusteringParameters.html#a993e0a035248faad6e292a5ef9af1953">faiss::ClusteringParameters::max_points_per_centroid</a></div><div class="ttdeci">int max_points_per_centroid</div><div class="ttdoc">to limit size of dataset </div><div class="ttdef"><b>Definition:</b> <a href="Clustering_8h_source.html#l00034">Clustering.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a1e4056fa3938ed8c9fe701e90d94ad95"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a1e4056fa3938ed8c9fe701e90d94ad95">faiss::ProductQuantizer::verbose</a></div><div class="ttdeci">bool verbose</div><div class="ttdoc">verbose during training? </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00036">ProductQuantizer.h:36</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#l01189">IndexIVFPQ.cpp:1189</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#l01212">IndexIVFPQ.cpp:1212</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a0f22cc237c30c935df5b6560aecf8f01"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a0f22cc237c30c935df5b6560aecf8f01">faiss::IndexIVF::merge_from</a></div><div class="ttdeci">virtual void merge_from(IndexIVF &other, idx_t add_id)</div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8cpp_source.html#l00245">IndexIVF.cpp:245</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a46d1aeddb60643c5b3f096147c3e028f"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">faiss::IndexIVF::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">code size per vector in bytes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00064">IndexIVF.h:64</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#l01104">IndexIVFPQ.cpp:1104</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_afd12191c638da74760ff397cf319752c"><div class="ttname"><a href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">faiss::MetricType</a></div><div class="ttdeci">MetricType</div><div class="ttdoc">Some algorithms support both an inner product version and a L2 search version. </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00043">Index.h:43</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#l00173">IndexIVFPQ.h:173</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  <a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
</a> 1.8.5
|
|
</small></address>
|
|
</body>
|
|
</html>
|