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
1055 lines
170 KiB
HTML
1055 lines
170 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/IndexPQ.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/IndexPQ.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"> Index based on product quantiztion.</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 "IndexPQ.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> </div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include <cstddef></span></div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <cstring></span></div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <cstdio></span></div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <cmath></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 "FaissAssert.h"</span></div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include "hamming.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="keyword">namespace </span>faiss {</div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment">/*********************************************************</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * IndexPQ implementation</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> ********************************************************/</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</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"><a class="line" href="structfaiss_1_1IndexPQ.html#ab8d0bbf8a0dab39b236e0d1633923746"> 33</a></span> IndexPQ::IndexPQ (<span class="keywordtype">int</span> d, <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits, <a class="code" href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">MetricType</a> metric):</div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a>(d, metric), pq(d, M, nbits)</div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> {</div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#af616e1f3c7bff7f62c2607b8079da43f">do_polysemous_training</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">polysemous_ht</a> = nbits * M + 1;</div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  search_type = <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea00f77a4f8209c30c3ef37ccfd3d0c10a">ST_PQ</a>;</div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  encode_signs = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> }</div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> </div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> IndexPQ::IndexPQ ()</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>  <a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> = METRIC_L2;</div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#af616e1f3c7bff7f62c2607b8079da43f">do_polysemous_training</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">polysemous_ht</a> = <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> + 1;</div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  search_type = <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea00f77a4f8209c30c3ef37ccfd3d0c10a">ST_PQ</a>;</div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  encode_signs = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> }</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#a87898add5ab4d86ba901ca79778fc11e"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#a87898add5ab4d86ba901ca79778fc11e">IndexPQ::train</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="l00055"></a><span class="lineno"> 55</span> {</div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordflow">if</span> (!<a class="code" href="structfaiss_1_1IndexPQ.html#af616e1f3c7bff7f62c2607b8079da43f">do_polysemous_training</a>) { <span class="comment">// standard training</span></div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.train(n, x);</div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> ntrain_perm = <a class="code" href="structfaiss_1_1IndexPQ.html#a820cec27d1ef14bf59fb288b2e143b6a">polysemous_training</a>.ntrain_permutation;</div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordflow">if</span> (ntrain_perm > n / 4)</div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  ntrain_perm = n / 4;</div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a5590d847c5c2b958affd2a05e58a6f23">verbose</a>) {</div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  printf (<span class="stringliteral">"PQ training on %ld points, remains %ld points: "</span></div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="stringliteral">"training polysemous on %s\n"</span>,</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  n - ntrain_perm, ntrain_perm,</div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  ntrain_perm == 0 ? <span class="stringliteral">"centroids"</span> : <span class="stringliteral">"these"</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>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.train(n - ntrain_perm, x);</div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#a820cec27d1ef14bf59fb288b2e143b6a">polysemous_training</a>.<a class="code" href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82">optimize_pq_for_hamming</a> (</div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>, ntrain_perm, x + (n - ntrain_perm) * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  }</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> }</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> </div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#ac72c9b93f8fe7e5ec27fbe26bb38a7bf"> 78</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#ac72c9b93f8fe7e5ec27fbe26bb38a7bf">IndexPQ::add</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="l00079"></a><span class="lineno"> 79</span> {</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.resize ((n + <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>) * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>);</div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, &<a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>[<a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>], n);</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  ntotal += n;</div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> }</div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#a25e17da885cf55d84b176b46f3ad25b1"> 88</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#a25e17da885cf55d84b176b46f3ad25b1">IndexPQ::reset</a>()</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> {</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.clear();</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = 0;</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> </div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#a99b187b1231a700617f7b228ec348ade"> 94</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#a99b187b1231a700617f7b228ec348ade">IndexPQ::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="l00095"></a><span class="lineno"> 95</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</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="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i = 0; i < ni; i++) {</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keyword">const</span> uint8_t * code = &<a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>[(i0 + i) * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code, recons + i * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  }</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span> }</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> </div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#a20913df3bfd8caa5187112641e8d9bc7"> 104</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#a20913df3bfd8caa5187112641e8d9bc7">IndexPQ::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="l00105"></a><span class="lineno"> 105</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  FAISS_THROW_IF_NOT (key >= 0 && key < <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>);</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (&<a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>[key * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>], recons);</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span> }</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> </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> </div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> </div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"> * IndexPQ polysemous search routines</span></div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span> </div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span> </div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#a491ba3ed34093513e6a850fbca0abdd2"> 124</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#a491ba3ed34093513e6a850fbca0abdd2">IndexPQ::search</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="l00125"></a><span class="lineno"> 125</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="l00126"></a><span class="lineno"> 126</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea00f77a4f8209c30c3ef37ccfd3d0c10a">ST_PQ</a>) { <span class="comment">// Simple PQ search</span></div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_L2) {</div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_maxheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  size_t(n), size_t(k), labels, distances };</div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a1ae7892a15b9f6809a3ba1a123a7831b">search</a> (x, n, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(), <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, &res, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_minheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  size_t(n), size_t(k), labels, distances };</div>
|
|
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a66be226806ca2abcaaf1653cdc690aa6">search_ip</a> (x, n, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(), <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, &res, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  indexPQ_stats.nq += n;</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  indexPQ_stats.ncode += n * <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> </div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaf06a0e6b53f9cbe1c791c6912169b738">ST_polysemous</a> ||</div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaef79af61798670a362434b7bc9ced45e">ST_polysemous_generalize</a>) {</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>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_L2);</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>  search_core_polysemous (n, x, k, distances, labels);</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>  } <span class="keywordflow">else</span> { <span class="comment">// code-to-code distances</span></div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  uint8_t * q_codes = <span class="keyword">new</span> uint8_t [n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<uint8_t></a> del (q_codes);</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span> </div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> </div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">if</span> (!encode_signs) {</div>
|
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, q_codes, n);</div>
|
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> == <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>);</div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  memset (q_codes, 0, n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>);</div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keyword">const</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="l00162"></a><span class="lineno"> 162</span>  uint8_t *code = q_codes + i * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>;</div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</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="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">if</span> (xi[j] > 0) code [j>>3] |= 1 << (j & 7);</div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  }</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>  <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea4287cbc83d1d5f0d1a02f014e5fe692c">ST_SDC</a>) {</div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_maxheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  size_t(n), size_t(k), labels, distances};</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.search_sdc (q_codes, n, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(), <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, &res, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> </div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordtype">int</span> * idistances = <span class="keyword">new</span> <span class="keywordtype">int</span> [n * k];</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<int></a> del (idistances);</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <a class="code" href="structfaiss_1_1HeapArray.html">int_maxheap_array_t</a> res = {</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  size_t (n), size_t (k), labels, idistances};</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>  <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718">ST_HE</a>) {</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>  <a class="code" href="namespacefaiss.html#ac0b4dc73a8470d61f510396dc460ca18">hammings_knn</a> (&res, q_codes, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(),</div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> </div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6">ST_generalized_HE</a>) {</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="namespacefaiss.html#ae81da42f6f40356f7525917b3acb54c8">generalized_hammings_knn</a> (&res, q_codes, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(),</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, <span class="keyword">true</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"> 192</span> </div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">// convert distances to floats</span></div>
|
|
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < k * n; i++)</div>
|
|
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  distances[i] = idistances[i];</div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </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>  indexPQ_stats.nq += n;</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  indexPQ_stats.ncode += n * <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> }</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span> </div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </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">void</span> IndexPQStats::reset()</div>
|
|
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> {</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  nq = ncode = n_hamming_pass = 0;</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> </div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> IndexPQStats indexPQ_stats;</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> </div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">template</span> <<span class="keyword">class</span> HammingComputer></div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="keyword">static</span> <span class="keywordtype">size_t</span> polysemous_inner_loop (</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keyword">const</span> IndexPQ & index,</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dis_table_qi, <span class="keyword">const</span> uint8_t *q_code,</div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordtype">size_t</span> k, <span class="keywordtype">float</span> *heap_dis, <span class="keywordtype">long</span> *heap_ids)</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span> {</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">int</span> M = index.pq.M;</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordtype">int</span> code_size = index.pq.code_size;</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">int</span> ksub = index.pq.ksub;</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordtype">size_t</span> ntotal = index.ntotal;</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordtype">int</span> ht = index.polysemous_ht;</div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> </div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keyword">const</span> uint8_t *b_code = index.codes.data();</div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordtype">size_t</span> n_pass_i = 0;</div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div>
|
|
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  HammingComputer hc (q_code, code_size);</div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span> </div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> bi = 0; bi < ntotal; bi++) {</div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordtype">int</span> hd = hc.hamming (b_code);</div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordflow">if</span> (hd < ht) {</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  n_pass_i ++;</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span> </div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * dis_table = dis_table_qi;</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < M; m++) {</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  dis += dis_table [b_code[m]];</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  dis_table += ksub;</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  }</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span> (dis < heap_dis[0]) {</div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  maxheap_pop (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  maxheap_push (k, heap_dis, heap_ids, dis, bi);</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  }</div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  b_code += code_size;</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">return</span> n_pass_i;</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> </div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="keywordtype">void</span> IndexPQ::search_core_polysemous (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, idx_t k,</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">float</span> *distances, idx_t *labels)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> % 8 == 0);</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1);</div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="comment">// PQ distance tables</span></div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordtype">float</span> * dis_tables = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  ScopeDeleter<float> del (dis_tables);</div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">compute_distance_tables</a> (n, x, dis_tables);</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>  <span class="comment">// Hamming embedding queries</span></div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  uint8_t * q_codes = <span class="keyword">new</span> uint8_t [n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  ScopeDeleter<uint8_t> del2 (q_codes);</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">if</span> (<span class="keyword">false</span>) {</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, q_codes, n);</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> qi = 0; qi < n; qi++) {</div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a95060fedd7c09eb20e968fd2fdb4b316">compute_code_from_distance_table</a></div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  (dis_tables + qi * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>,</div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  q_codes + qi * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>);</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>  }</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordtype">size_t</span> n_pass = 0;</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span> </div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <span class="preprocessor">#pragma omp parallel for reduction (+: n_pass)</span></div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> qi = 0; qi < n; qi++) {</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">const</span> uint8_t * q_code = q_codes + qi * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>;</div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * dis_table_qi = dis_tables + qi * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</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="keywordtype">long</span> * heap_ids = labels + qi * k;</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordtype">float</span> *heap_dis = distances + qi * k;</div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  maxheap_heapify (k, heap_dis, heap_ids);</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>  <span class="keywordflow">if</span> (search_type == <a class="code" href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaf06a0e6b53f9cbe1c791c6912169b738">ST_polysemous</a>) {</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>  <span class="keywordflow">switch</span> (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>) {</div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">case</span> 4:</div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  n_pass += polysemous_inner_loop<HammingComputer4></div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keywordflow">case</span> 8:</div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  n_pass += polysemous_inner_loop<HammingComputer8></div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">case</span> 16:</div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  n_pass += polysemous_inner_loop<HammingComputer16></div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">case</span> 32:</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  n_pass += polysemous_inner_loop<HammingComputer32></div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">case</span> 20:</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  n_pass += polysemous_inner_loop<HammingComputer20></div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keywordflow">default</span>:</div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> % 8 == 0)</div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  n_pass += polysemous_inner_loop<HammingComputerM8></div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  n_pass += polysemous_inner_loop<HammingComputerM4></div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div>
|
|
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">switch</span> (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>) {</div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">case</span> 8:</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  n_pass += polysemous_inner_loop<GenHammingComputer8></div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">case</span> 16:</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  n_pass += polysemous_inner_loop<GenHammingComputer16></div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">case</span> 32:</div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  n_pass += polysemous_inner_loop<GenHammingComputer32></div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">default</span>:</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  n_pass += polysemous_inner_loop<GenHammingComputerM8></div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  (*<span class="keyword">this</span>, dis_table_qi, q_code, k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  }</div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  }</div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  maxheap_reorder (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  indexPQ_stats.nq += n;</div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  indexPQ_stats.ncode += n * <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  indexPQ_stats.n_hamming_pass += n_pass;</div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span> </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> }</div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span> </div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span> </div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span> <span class="comment"> * Stats of IndexPQ codes</span></div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span> </div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span> </div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span> </div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#aa131767383619bb5848b131502ada9cf"> 370</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#aa131767383619bb5848b131502ada9cf">IndexPQ::hamming_distance_table</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="l00371"></a><span class="lineno"> 371</span>  int32_t *dis)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  uint8_t * q_codes = <span class="keyword">new</span> uint8_t [n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<uint8_t></a> del (q_codes);</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>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, q_codes, n);</div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  hammings (q_codes, <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data(), n, <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>, <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, dis);</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span> }</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div>
|
|
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span> </div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPQ.html#ada06f5db85c91a4c140119a5897c6064"> 382</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPQ.html#ada06f5db85c91a4c140119a5897c6064">IndexPQ::hamming_distance_histogram</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="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> nb, <span class="keyword">const</span> <span class="keywordtype">float</span> *xb,</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordtype">long</span> *hist)</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>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_L2);</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> % 8 == 0);</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1);</div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="comment">// Hamming embedding queries</span></div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  uint8_t * q_codes = <span class="keyword">new</span> uint8_t [n * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter <uint8_t></a> del (q_codes);</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, q_codes, n);</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span> </div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  uint8_t * b_codes ;</div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter <uint8_t></a> del_b_codes;</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span> </div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">if</span> (xb) {</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  b_codes = <span class="keyword">new</span> uint8_t [nb * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>];</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  del_b_codes.set (b_codes);</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (xb, b_codes, nb);</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  nb = <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  b_codes = <a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>.data();</div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  }</div>
|
|
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordtype">int</span> nbits = <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a> * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a>;</div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  memset (hist, 0, <span class="keyword">sizeof</span>(*hist) * (nbits + 1));</div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordtype">size_t</span> bs = 256;</div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span> <span class="preprocessor">#pragma omp parallel</span></div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  std::vector<long> histi (nbits + 1);</div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  hamdis_t *distances = <span class="keyword">new</span> hamdis_t [nb * bs];</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<hamdis_t></a> del (distances);</div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span> <span class="preprocessor">#pragma omp for</span></div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> q0 = 0; q0 < n; q0 += bs) {</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">// printf ("dis stats: %ld/%ld\n", q0, n);</span></div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordtype">size_t</span> q1 = q0 + bs;</div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">if</span> (q1 > n) q1 = n;</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  hammings (q_codes + q0 * <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, b_codes,</div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  q1 - q0, nb,</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>, distances);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nb * (q1 - q0); i++)</div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  histi [distances [i]]++;</div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  }</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span> <span class="preprocessor">#pragma omp critical</span></div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i <= nbits; i++)</div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  hist[i] += histi[i];</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  }</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </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> </div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</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> </div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span> </div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span> </div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span> </div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span> </div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span> </div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span> </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> </div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span> </div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</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> </div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span> <span class="comment"> * MultiIndexQuantizer</span></div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div>
|
|
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span> </div>
|
|
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"><a class="line" href="structfaiss_1_1ArgSort.html"> 463</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1ArgSort.html">ArgSort</a> {</div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keyword">const</span> T * x;</div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordtype">bool</span> operator() (<span class="keywordtype">size_t</span> i, <span class="keywordtype">size_t</span> j) {</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">return</span> x[i] < x[j];</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> };</div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span> </div>
|
|
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="comment">/** Array that maintains a permutation of its elements so that the</span></div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span> <span class="comment"> * array's elements are sorted</span></div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"><a class="line" href="structfaiss_1_1SortedArray.html"> 475</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1SortedArray.html">SortedArray</a> {</div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keyword">const</span> T * x;</div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordtype">int</span> N;</div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  std::vector<int> perm;</div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keyword">explicit</span> <a class="code" href="structfaiss_1_1SortedArray.html">SortedArray</a> (<span class="keywordtype">int</span> N) {</div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  this->N = N;</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  perm.resize (N);</div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  }</div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span> </div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordtype">void</span> init (<span class="keyword">const</span> T*x) {</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  this->x = x;</div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> n = 0; n < N; n++)</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  perm[n] = n;</div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="structfaiss_1_1ArgSort.html">ArgSort<T></a> cmp = {x };</div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  std::sort (perm.begin(), perm.end(), cmp);</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> </div>
|
|
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="comment">// get smallest value</span></div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  T get_0 () {</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">return</span> x[perm[0]];</div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  }</div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span> </div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="comment">// get delta between n-smallest and n-1 -smallest</span></div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  T get_diff (<span class="keywordtype">int</span> n) {</div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">return</span> x[perm[n]] - x[perm[n - 1]];</div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  }</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">// remap orders counted from smallest to indices in array</span></div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keywordtype">int</span> get_ord (<span class="keywordtype">int</span> n) {</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">return</span> perm[n];</div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  }</div>
|
|
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span> };</div>
|
|
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span> </div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span> <span class="comment">/** Array has n values. Sort the k first ones and copy the other ones</span></div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="comment"> * into elements k..n-1</span></div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span> <span class="keyword">template</span> <<span class="keyword">class</span> C></div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="namespacefaiss.html#a7c5553442c8b9342a0ad449e2b67f275"> 515</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacefaiss.html#a7c5553442c8b9342a0ad449e2b67f275">partial_sort</a> (<span class="keywordtype">int</span> k, <span class="keywordtype">int</span> n,</div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keyword">const</span> <span class="keyword">typename</span> C::T * vals, <span class="keyword">typename</span> C::TI * perm) {</div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="comment">// insert first k elts in heap</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 = 1; i < k; i++) {</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  indirect_heap_push<C> (i + 1, vals, perm, perm[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>  <span class="comment">// insert next n - k elts in heap</span></div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = k; i < n; i++) {</div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keyword">typename</span> C::TI <span class="keywordtype">id</span> = perm[i];</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keyword">typename</span> C::TI top = perm[0];</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span> </div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">if</span> (C::cmp(vals[top], vals[<span class="keywordtype">id</span>])) {</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  indirect_heap_pop<C> (k, vals, perm);</div>
|
|
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  indirect_heap_push<C> (k, vals, perm, id);</div>
|
|
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  perm[i] = top;</div>
|
|
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="comment">// nothing, elt at i is good where it is.</span></div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</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> </div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="comment">// order the k first elements in heap</span></div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = k - 1; i > 0; i--) {</div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">typename</span> C::TI top = perm[0];</div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  indirect_heap_pop<C> (i + 1, vals, perm);</div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  perm[i] = top;</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  }</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span> }</div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment">/** same as SortedArray, but only the k first elements are sorted */</span></div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="structfaiss_1_1SemiSortedArray.html"> 546</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1SemiSortedArray.html">SemiSortedArray</a> {</div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keyword">const</span> T * x;</div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordtype">int</span> N;</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span> </div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="comment">// type of the heap: CMax = sort ascending</span></div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keyword">typedef</span> <a class="code" href="structfaiss_1_1CMax.html">CMax<T, int></a> <a class="code" href="structfaiss_1_1CMax.html">HC</a>;</div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  std::vector<int> perm;</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>  <span class="keywordtype">int</span> k; <span class="comment">// k elements are sorted</span></div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span> </div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="keywordtype">int</span> initial_k, k_factor;</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="keyword">explicit</span> <a class="code" href="structfaiss_1_1SemiSortedArray.html">SemiSortedArray</a> (<span class="keywordtype">int</span> N) {</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  this->N = N;</div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  perm.resize (N);</div>
|
|
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  perm.resize (N);</div>
|
|
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  initial_k = 3;</div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  k_factor = 4;</div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  }</div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> </div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordtype">void</span> init (<span class="keyword">const</span> T*x) {</div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  this->x = x;</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> n = 0; n < N; n++)</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  perm[n] = n;</div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  k = 0;</div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <a class="code" href="structfaiss_1_1SemiSortedArray.html#a9b7e3826daa8964a3be0ea16b4abf608">grow</a> (initial_k);</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</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> <span class="comment"> /// grow the sorted part of the array to size next_k</span></div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"><a class="line" href="structfaiss_1_1SemiSortedArray.html#a9b7e3826daa8964a3be0ea16b4abf608"> 575</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1SemiSortedArray.html#a9b7e3826daa8964a3be0ea16b4abf608">grow</a> (<span class="keywordtype">int</span> next_k) {</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keywordflow">if</span> (next_k < N) {</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  partial_sort<HC> (next_k - k, N - k, x, &perm[k]);</div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  k = next_k;</div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  } <span class="keywordflow">else</span> { <span class="comment">// full sort of remainder of array</span></div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <a class="code" href="structfaiss_1_1ArgSort.html">ArgSort<T></a> cmp = {x };</div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  std::sort (perm.begin() + k, perm.end(), cmp);</div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  k = N;</div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  }</div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  }</div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// get smallest value</span></div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  T get_0 () {</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="keywordflow">return</span> x[perm[0]];</div>
|
|
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  }</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>  <span class="comment">// get delta between n-smallest and n-1 -smallest</span></div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  T get_diff (<span class="keywordtype">int</span> n) {</div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="keywordflow">if</span> (n >= k) {</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="comment">// want to keep powers of 2 - 1</span></div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordtype">int</span> next_k = (k + 1) * k_factor - 1;</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <a class="code" href="structfaiss_1_1SemiSortedArray.html#a9b7e3826daa8964a3be0ea16b4abf608">grow</a> (next_k);</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  }</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">return</span> x[perm[n]] - x[perm[n - 1]];</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  }</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="comment">// remap orders counted from smallest to indices in array</span></div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keywordtype">int</span> get_ord (<span class="keywordtype">int</span> n) {</div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  assert (n < k);</div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">return</span> perm[n];</div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  }</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> </div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span> </div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"> * Find the k smallest sums of M terms, where each term is taken in a</span></div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> * table x of n values.</span></div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment"> * A combination of terms is encoded as a scalar 0 <= t < n^M. The</span></div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment"> * combination t0 ... t(M-1) that correspond to the sum</span></div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span> <span class="comment"> * sum = x[0, t0] + x[1, t1] + .... + x[M-1, t(M-1)]</span></div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment"> * is encoded as</span></div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> <span class="comment"> * t = t0 + t1 * n + t2 * n^2 + ... + t(M-1) * n^(M-1)</span></div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment"> * MinSumK is an object rather than a function, so that storage can be</span></div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="comment"> * re-used over several computations with the same sizes. use_seen is</span></div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span> <span class="comment"> * good when there may be ties in the x array and it is a concern if</span></div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment"> * occasionally several t's are returned.</span></div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment"> * @param x size M * n, values to add up</span></div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment"> * @parms k nb of results to retrieve</span></div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="comment"> * @param M nb of terms</span></div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment"> * @param n nb of distinct values</span></div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="comment"> * @param sums output, size k, sorted</span></div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="comment"> * @prarm terms output, size k, with encoding as above</span></div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">class</span> SSA, <span class="keywordtype">bool</span> use_seen></div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"><a class="line" href="structfaiss_1_1MinSumK.html"> 637</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1MinSumK.html">MinSumK</a> {</div>
|
|
<div class="line"><a name="l00638"></a><span class="lineno"><a class="line" href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8"> 638</a></span>  <span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8">K</a>; <span class="comment">///< nb of sums to return</span></div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"><a class="line" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a"> 639</a></span> <span class="comment"></span> <span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; <span class="comment">///< nb of elements to sum up</span></div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"><a class="line" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658"> 640</a></span> <span class="comment"></span> <span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>; <span class="comment">///< nb of possible elements for each of the M terms</span></div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment"></span><span class="comment"></span></div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment"> /** the heap.</span></div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment"> * We use a heap to maintain a queue of sums, with the associated</span></div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span> <span class="comment"> * terms involved in the sum.</span></div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="structfaiss_1_1MinSumK.html#aa649f97b697150608b1874d88a613e92"> 646</a></span>  <span class="keyword">typedef</span> <a class="code" href="structfaiss_1_1CMin.html">CMin<T, long></a> <a class="code" href="structfaiss_1_1MinSumK.html#aa649f97b697150608b1874d88a613e92">HC</a>;</div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="keywordtype">size_t</span> heap_capacity, heap_size;</div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  T *bh_val;</div>
|
|
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordtype">long</span> *bh_ids;</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>  std::vector <SSA> ssx;</div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  std::vector <long> weights;</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>  <span class="comment">// all results get pushed several times. When there are ties, they</span></div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="comment">// are popped interleaved with others, so it is not easy to</span></div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="comment">// identify them. Therefore, this bit array just marks elements</span></div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="comment">// that were seen before.</span></div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  std::vector <uint8_t> seen;</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>  <a class="code" href="structfaiss_1_1MinSumK.html">MinSumK</a> (<span class="keywordtype">int</span> <a class="code" href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8">K</a>, <span class="keywordtype">int</span> M, <span class="keywordtype">int</span> N): K(K), M(M), N(N) {</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  heap_capacity = K * <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>;</div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="comment">// we'll do k steps, each step pushes at most M vals</span></div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  bh_val = <span class="keyword">new</span> T[heap_capacity];</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  bh_ids = <span class="keyword">new</span> <span class="keywordtype">long</span>[heap_capacity];</div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span> </div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  weights.push_back (1);</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 1; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++)</div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  weights.push_back(weights[m - 1] * N);</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">if</span> (use_seen) {</div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordtype">long</span> n_ids = weights.back() * <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>;</div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  seen.resize ((n_ids + 7) / 8);</div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  }</div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span> </div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++)</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  ssx.push_back (SSA(N));</div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> </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> </div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordtype">bool</span> is_seen (<span class="keywordtype">long</span> i) {</div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">return</span> (seen[i >> 3] >> (i & 7)) & 1;</div>
|
|
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  }</div>
|
|
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span> </div>
|
|
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordtype">void</span> mark_seen (<span class="keywordtype">long</span> i) {</div>
|
|
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (use_seen)</div>
|
|
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  seen [i >> 3] |= 1 << (i & 7);</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> </div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordtype">void</span> run (<span class="keyword">const</span> T *x, T * sums, <span class="keywordtype">long</span> * terms) {</div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  heap_size = 0;</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++)</div>
|
|
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  ssx[m].init(x + N * m);</div>
|
|
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span> </div>
|
|
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  { <span class="comment">// intial result: take min for all elements</span></div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  T sum = 0;</div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  terms[0] = 0;</div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  mark_seen (0);</div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  sum += ssx[m].get_0();</div>
|
|
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  }</div>
|
|
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  sums[0] = sum;</div>
|
|
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  heap_push<HC> (++heap_size, bh_val, bh_ids,</div>
|
|
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  sum + ssx[m].get_diff(1),</div>
|
|
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  weights[m]);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 1; k < <a class="code" href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8">K</a>; k++) {</div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="comment">// pop smallest value from heap</span></div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordflow">if</span> (use_seen) {<span class="comment">// skip already seen elements</span></div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordflow">while</span> (is_seen (bh_ids[0])) {</div>
|
|
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  assert (heap_size > 0);</div>
|
|
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  heap_pop<HC> (heap_size--, bh_val, bh_ids);</div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  }</div>
|
|
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  }</div>
|
|
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  assert (heap_size > 0);</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>  T sum = sums[k] = bh_val[0];</div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keywordtype">long</span> ti = terms[k] = bh_ids[0];</div>
|
|
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span> </div>
|
|
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <span class="keywordflow">if</span> (use_seen) {</div>
|
|
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  mark_seen (ti);</div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  heap_pop<HC> (heap_size--, bh_val, bh_ids);</div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">do</span> {</div>
|
|
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  heap_pop<HC> (heap_size--, bh_val, bh_ids);</div>
|
|
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  } <span class="keywordflow">while</span> (heap_size > 0 && bh_ids[0] == ti);</div>
|
|
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  }</div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span> </div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="comment">// enqueue followers</span></div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="keywordtype">long</span> ii = ti;</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordtype">long</span> n = ii % <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>;</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  ii /= <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>;</div>
|
|
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordflow">if</span> (n + 1 >= N) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span> </div>
|
|
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  enqueue_follower (ti, m, n, sum);</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> </div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="comment">/*</span></div>
|
|
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span> <span class="comment"> for (int k = 0; k < K; k++)</span></div>
|
|
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span> <span class="comment"> for (int l = k + 1; l < K; l++)</span></div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span> <span class="comment"> assert (terms[k] != terms[l]);</span></div>
|
|
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span> </div>
|
|
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="comment">// convert indices by applying permutation</span></div>
|
|
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < <a class="code" href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8">K</a>; k++) {</div>
|
|
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordtype">long</span> ii = terms[k];</div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keywordflow">if</span> (use_seen) {</div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="comment">// clear seen for reuse at next loop</span></div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  seen[ii >> 3] = 0;</div>
|
|
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  }</div>
|
|
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordtype">long</span> ti = 0;</div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="keywordtype">long</span> n = ii % <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>;</div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  ti += weights[m] * ssx[m].get_ord(n);</div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  ii /= <a class="code" href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">N</a>;</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>  terms[k] = ti;</div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  }</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</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>  <span class="keywordtype">void</span> enqueue_follower (<span class="keywordtype">long</span> ti, <span class="keywordtype">int</span> m, <span class="keywordtype">int</span> n, T sum) {</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  T next_sum = sum + ssx[m].get_diff(n + 1);</div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordtype">long</span> next_ti = ti + weights[m];</div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  heap_push<HC> (++heap_size, bh_val, bh_ids, next_sum, next_ti);</div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  }</div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span> </div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span> </div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  ~MinSumK () {</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keyword">delete</span> [] bh_ids;</div>
|
|
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keyword">delete</span> [] bh_val;</div>
|
|
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  }</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> </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> </div>
|
|
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span> </div>
|
|
<div class="line"><a name="l00783"></a><span class="lineno"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#a01a568055ebc1e841f7e4218722efa01"> 783</a></span> MultiIndexQuantizer::MultiIndexQuantizer (<span class="keywordtype">int</span> d,</div>
|
|
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keywordtype">size_t</span> M,</div>
|
|
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordtype">size_t</span> nbits):</div>
|
|
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a>(d, METRIC_L2), pq(d, M, nbits)</div>
|
|
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> {</div>
|
|
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  pq.<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="l00790"></a><span class="lineno"> 790</span> }</div>
|
|
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span> </div>
|
|
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div>
|
|
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span> </div>
|
|
<div class="line"><a name="l00794"></a><span class="lineno"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#a6fa1d1a295eb2d4377b8de5096ab3ef4"> 794</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html#a6fa1d1a295eb2d4377b8de5096ab3ef4">MultiIndexQuantizer::train</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="l00795"></a><span class="lineno"> 795</span> {</div>
|
|
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  pq.train (n, x);</div>
|
|
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// count virtual elements in index</span></div>
|
|
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  ntotal = 1;</div>
|
|
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++)</div>
|
|
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  ntotal *= pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</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> </div>
|
|
<div class="line"><a name="l00805"></a><span class="lineno"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#a999ee03f4e65f453377e209d10e25681"> 805</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html#a999ee03f4e65f453377e209d10e25681">MultiIndexQuantizer::search</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="l00806"></a><span class="lineno"> 806</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="l00807"></a><span class="lineno"> 807</span>  <span class="keywordflow">if</span> (n == 0) <span class="keywordflow">return</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="keywordtype">float</span> * dis_tables = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del (dis_tables);</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>  pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">compute_distance_tables</a> (n, x, dis_tables);</div>
|
|
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span> </div>
|
|
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <span class="keywordflow">if</span> (k == 1) {</div>
|
|
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="comment">// simple version that just finds the min in each table</span></div>
|
|
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span> </div>
|
|
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * dis_table = dis_tables + i * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>;</div>
|
|
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> label = 0;</div>
|
|
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span> </div>
|
|
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> s = 0; s < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; s++) {</div>
|
|
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordtype">float</span> vmin = HUGE_VALF;</div>
|
|
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> lmin = -1;</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>  <span class="keywordflow">for</span> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> j = 0; j < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; j++) {</div>
|
|
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">if</span> (dis_table[j] < vmin) {</div>
|
|
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  vmin = dis_table[j];</div>
|
|
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  lmin = j;</div>
|
|
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  }</div>
|
|
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  }</div>
|
|
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  dis += vmin;</div>
|
|
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  label |= lmin << (s * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a>);</div>
|
|
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  dis_table += pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</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> </div>
|
|
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  distances [i] = dis;</div>
|
|
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  labels [i] = label;</div>
|
|
<div class="line"><a name="l00840"></a><span class="lineno"> 840</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>  } <span class="keywordflow">else</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="preprocessor">#pragma omp parallel if(n > 1)</span></div>
|
|
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <a class="code" href="structfaiss_1_1MinSumK.html">MinSumK <float, SemiSortedArray<float></a>, <span class="keyword">false</span>></div>
|
|
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  msk(k, pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>, pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>);</div>
|
|
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span> <span class="preprocessor">#pragma omp for</span></div>
|
|
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  msk.run (dis_tables + i * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a> * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>,</div>
|
|
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  distances + i * k, labels + i * k);</div>
|
|
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span> </div>
|
|
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  }</div>
|
|
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  }</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> </div>
|
|
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span> }</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> </div>
|
|
<div class="line"><a name="l00861"></a><span class="lineno"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#aa5bd578560419955a4bf7035cf09a392"> 861</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html#aa5bd578560419955a4bf7035cf09a392">MultiIndexQuantizer::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="l00862"></a><span class="lineno"> 862</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="keywordflow">if</span> (pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1) {</div>
|
|
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  uint8_t code[pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keywordtype">long</span> jj = key;</div>
|
|
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keywordtype">long</span> n = jj % pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  jj /= pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  code[m] = n;</div>
|
|
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  }</div>
|
|
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code, recons);</div>
|
|
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 2) {</div>
|
|
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  uint16_t code[pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="keywordtype">long</span> jj = key;</div>
|
|
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordtype">long</span> n = jj % pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  jj /= pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  code[m] = n;</div>
|
|
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div>
|
|
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> ((uint8_t*)code, recons);</div>
|
|
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  } <span class="keywordflow">else</span> FAISS_THROW_MSG( <span class="stringliteral">"only 1 or 2 bytes per index supported"</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"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#aa72640bcbe2e5d9029954c2fa6633453"> 884</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html#aa72640bcbe2e5d9029954c2fa6633453">MultiIndexQuantizer::add</a>(<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> <span class="comment">/*n*/</span>, <span class="keyword">const</span> <span class="keywordtype">float</span>* <span class="comment">/*x*/</span>) {</div>
|
|
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  FAISS_THROW_MSG(</div>
|
|
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="stringliteral">"This index has virtual elements, "</span></div>
|
|
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="stringliteral">"it does not support add"</span>);</div>
|
|
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span> }</div>
|
|
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span> </div>
|
|
<div class="line"><a name="l00890"></a><span class="lineno"><a class="line" href="structfaiss_1_1MultiIndexQuantizer.html#a4808ce22fcc95c7af902b97969f2a90d"> 890</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html#a4808ce22fcc95c7af902b97969f2a90d">MultiIndexQuantizer::reset</a> ()</div>
|
|
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span> {</div>
|
|
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  FAISS_THROW_MSG ( <span class="stringliteral">"This index has virtual elements, "</span></div>
|
|
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="stringliteral">"it does not support reset"</span>);</div>
|
|
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span> }</div>
|
|
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span> </div>
|
|
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span> </div>
|
|
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span> </div>
|
|
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span> </div>
|
|
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span> } <span class="comment">// END namespace faiss</span></div>
|
|
<div class="ttc" id="structfaiss_1_1MinSumK_html_a816976ee9baa0378b01d2f0fdaf4907a"><div class="ttname"><a href="structfaiss_1_1MinSumK.html#a816976ee9baa0378b01d2f0fdaf4907a">faiss::MinSumK::M</a></div><div class="ttdeci">int M</div><div class="ttdoc">nb of elements to sum up </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00639">IndexPQ.cpp:639</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a490b64b12384951ed66548a3a48f91e5"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">faiss::IndexPQ::codes</a></div><div class="ttdeci">std::vector< uint8_t > codes</div><div class="ttdoc">Codes. Size ntotal * pq.code_size. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00034">IndexPQ.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ac920fea11f02e8407d12cc99a09f5ea5"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">faiss::ProductQuantizer::nbits</a></div><div class="ttdeci">size_t nbits</div><div class="ttdoc">number of bits per quantization index </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00029">ProductQuantizer.h:29</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_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea903849f87cca2e7fbbfe034edbb81718">faiss::IndexPQ::ST_HE</a></div><div class="ttdoc">Hamming distance on codes. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00077">IndexPQ.h:77</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_af616e1f3c7bff7f62c2607b8079da43f"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#af616e1f3c7bff7f62c2607b8079da43f">faiss::IndexPQ::do_polysemous_training</a></div><div class="ttdeci">bool do_polysemous_training</div><div class="ttdoc">false = standard PQ </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00069">IndexPQ.h:69</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a87898add5ab4d86ba901ca79778fc11e"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a87898add5ab4d86ba901ca79778fc11e">faiss::IndexPQ::train</a></div><div class="ttdeci">void train(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00054">IndexPQ.cpp:54</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a13bf69a0dc7b4e45792d10f458e4a92d"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">faiss::ProductQuantizer::byte_per_idx</a></div><div class="ttdeci">size_t byte_per_idx</div><div class="ttdoc">nb bytes per code component (1 or 2) </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00033">ProductQuantizer.h:33</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html_a4808ce22fcc95c7af902b97969f2a90d"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html#a4808ce22fcc95c7af902b97969f2a90d">faiss::MultiIndexQuantizer::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="IndexPQ_8cpp_source.html#l00890">IndexPQ.cpp:890</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1CMax_html"><div class="ttname"><a href="structfaiss_1_1CMax.html">faiss::CMax</a></div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00048">Heap.h:48</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a7c5553442c8b9342a0ad449e2b67f275"><div class="ttname"><a href="namespacefaiss.html#a7c5553442c8b9342a0ad449e2b67f275">faiss::partial_sort</a></div><div class="ttdeci">void partial_sort(int k, int n, const typename C::T *vals, typename C::TI *perm)</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00515">IndexPQ.cpp:515</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html_a6fa1d1a295eb2d4377b8de5096ab3ef4"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html#a6fa1d1a295eb2d4377b8de5096ab3ef4">faiss::MultiIndexQuantizer::train</a></div><div class="ttdeci">void train(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00794">IndexPQ.cpp:794</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MinSumK_html"><div class="ttname"><a href="structfaiss_1_1MinSumK.html">faiss::MinSumK</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00637">IndexPQ.cpp:637</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MinSumK_html_aa649f97b697150608b1874d88a613e92"><div class="ttname"><a href="structfaiss_1_1MinSumK.html#aa649f97b697150608b1874d88a613e92">faiss::MinSumK::HC</a></div><div class="ttdeci">CMin< T, long > HC</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00646">IndexPQ.cpp:646</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ArgSort_html"><div class="ttname"><a href="structfaiss_1_1ArgSort.html">faiss::ArgSort</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00463">IndexPQ.cpp:463</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SemiSortedArray_html_a9b7e3826daa8964a3be0ea16b4abf608"><div class="ttname"><a href="structfaiss_1_1SemiSortedArray.html#a9b7e3826daa8964a3be0ea16b4abf608">faiss::SemiSortedArray::grow</a></div><div class="ttdeci">void grow(int next_k)</div><div class="ttdoc">grow the sorted part of the array to size next_k </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00575">IndexPQ.cpp:575</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SemiSortedArray_html"><div class="ttname"><a href="structfaiss_1_1SemiSortedArray.html">faiss::SemiSortedArray</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00546">IndexPQ.cpp:546</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_1ProductQuantizer_html_a3521b9a36c28219fd6180cc7a9ce8207"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">faiss::ProductQuantizer::compute_distance_tables</a></div><div class="ttdeci">void compute_distance_tables(size_t nx, const float *x, float *dis_tables) const </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00439">ProductQuantizer.cpp:439</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SortedArray_html"><div class="ttname"><a href="structfaiss_1_1SortedArray.html">faiss::SortedArray</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00475">IndexPQ.cpp:475</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_ae81da42f6f40356f7525917b3acb54c8"><div class="ttname"><a href="namespacefaiss.html#ae81da42f6f40356f7525917b3acb54c8">faiss::generalized_hammings_knn</a></div><div class="ttdeci">void generalized_hammings_knn(int_maxheap_array_t *ha, const uint8_t *a, const uint8_t *b, size_t nb, size_t code_size, int ordered)</div><div class="ttdef"><b>Definition:</b> <a href="hamming_8cpp_source.html#l00639">hamming.cpp:639</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a95060fedd7c09eb20e968fd2fdb4b316"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a95060fedd7c09eb20e968fd2fdb4b316">faiss::ProductQuantizer::compute_code_from_distance_table</a></div><div class="ttdeci">void compute_code_from_distance_table(const float *tab, uint8_t *code) const </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00363">ProductQuantizer.cpp:363</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_1IndexPQ_html_ada06f5db85c91a4c140119a5897c6064"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#ada06f5db85c91a4c140119a5897c6064">faiss::IndexPQ::hamming_distance_histogram</a></div><div class="ttdeci">void hamming_distance_histogram(idx_t n, const float *x, idx_t nb, const float *xb, long *dist_histogram)</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00382">IndexPQ.cpp:382</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a1ae7892a15b9f6809a3ba1a123a7831b"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a1ae7892a15b9f6809a3ba1a123a7831b">faiss::ProductQuantizer::search</a></div><div class="ttdeci">void search(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_maxheap_array_t *res, bool init_finalize_heap=true) const </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00540">ProductQuantizer.cpp:540</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_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42feaef79af61798670a362434b7bc9ced45e"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaef79af61798670a362434b7bc9ced45e">faiss::IndexPQ::ST_polysemous_generalize</a></div><div class="ttdoc">Filter on generalized Hamming. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00081">IndexPQ.h:81</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_1ProductQuantizer_html_a66be226806ca2abcaaf1653cdc690aa6"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a66be226806ca2abcaaf1653cdc690aa6">faiss::ProductQuantizer::search_ip</a></div><div class="ttdeci">void search_ip(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_minheap_array_t *res, bool init_finalize_heap=true) const </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00565">ProductQuantizer.cpp:565</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="namespacefaiss_html_ac0b4dc73a8470d61f510396dc460ca18"><div class="ttname"><a href="namespacefaiss.html#ac0b4dc73a8470d61f510396dc460ca18">faiss::hammings_knn</a></div><div class="ttdeci">void hammings_knn(int_maxheap_array_t *ha, const uint8_t *a, const uint8_t *b, size_t nb, size_t ncodes, int order)</div><div class="ttdef"><b>Definition:</b> <a href="hamming_8cpp_source.html#l00474">hamming.cpp:474</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_aa7b7cfe0c8dfd37c8a940fd93d12dc88"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">faiss::IndexPQ::pq</a></div><div class="ttdeci">ProductQuantizer pq</div><div class="ttdoc">The product quantizer used to encode the vectors. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00031">IndexPQ.h:31</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_1IndexPQ_html_ac72c9b93f8fe7e5ec27fbe26bb38a7bf"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#ac72c9b93f8fe7e5ec27fbe26bb38a7bf">faiss::IndexPQ::add</a></div><div class="ttdeci">void add(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00078">IndexPQ.cpp:78</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea237afca36629dae511c0ac56effbfaa6">faiss::IndexPQ::ST_generalized_HE</a></div><div class="ttdoc">nb of same codes </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00078">IndexPQ.h:78</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MinSumK_html_a6cf625ac4c6933775bca98a6ec283ec8"><div class="ttname"><a href="structfaiss_1_1MinSumK.html#a6cf625ac4c6933775bca98a6ec283ec8">faiss::MinSumK::K</a></div><div class="ttdeci">int K</div><div class="ttdoc">nb of sums to return </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00638">IndexPQ.cpp:638</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_aa131767383619bb5848b131502ada9cf"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#aa131767383619bb5848b131502ada9cf">faiss::IndexPQ::hamming_distance_table</a></div><div class="ttdeci">void hamming_distance_table(idx_t n, const float *x, int32_t *dis) const </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00370">IndexPQ.cpp:370</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html_a999ee03f4e65f453377e209d10e25681"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html#a999ee03f4e65f453377e209d10e25681">faiss::MultiIndexQuantizer::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="IndexPQ_8cpp_source.html#l00805">IndexPQ.cpp:805</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a20913df3bfd8caa5187112641e8d9bc7"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a20913df3bfd8caa5187112641e8d9bc7">faiss::IndexPQ::reconstruct</a></div><div class="ttdeci">void reconstruct(idx_t key, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00104">IndexPQ.cpp:104</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_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_1MinSumK_html_a13f94071498f5a240b79e81346856658"><div class="ttname"><a href="structfaiss_1_1MinSumK.html#a13f94071498f5a240b79e81346856658">faiss::MinSumK::N</a></div><div class="ttdeci">int N</div><div class="ttdoc">nb of possible elements for each of the M terms </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00640">IndexPQ.cpp:640</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_1IndexPQ_html_a99b187b1231a700617f7b228ec348ade"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a99b187b1231a700617f7b228ec348ade">faiss::IndexPQ::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="IndexPQ_8cpp_source.html#l00094">IndexPQ.cpp:94</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea00f77a4f8209c30c3ef37ccfd3d0c10a"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea00f77a4f8209c30c3ef37ccfd3d0c10a">faiss::IndexPQ::ST_PQ</a></div><div class="ttdoc">asymmetric product quantizer (default) </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00076">IndexPQ.h:76</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html_aa5bd578560419955a4bf7035cf09a392"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html#aa5bd578560419955a4bf7035cf09a392">faiss::MultiIndexQuantizer::reconstruct</a></div><div class="ttdeci">void reconstruct(idx_t key, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00861">IndexPQ.cpp:861</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42feaf06a0e6b53f9cbe1c791c6912169b738"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42feaf06a0e6b53f9cbe1c791c6912169b738">faiss::IndexPQ::ST_polysemous</a></div><div class="ttdoc">HE filter (using ht) + PQ combination. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00080">IndexPQ.h:80</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1MultiIndexQuantizer_html_aa72640bcbe2e5d9029954c2fa6633453"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html#aa72640bcbe2e5d9029954c2fa6633453">faiss::MultiIndexQuantizer::add</a></div><div class="ttdeci">void add(idx_t n, const float *x) override</div><div class="ttdoc">add and reset will crash at runtime </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8cpp_source.html#l00884">IndexPQ.cpp:884</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_1IndexPQ_html_a25e17da885cf55d84b176b46f3ad25b1"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a25e17da885cf55d84b176b46f3ad25b1">faiss::IndexPQ::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="IndexPQ_8cpp_source.html#l00088">IndexPQ.cpp:88</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_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_1IndexPQ_html_a491ba3ed34093513e6a850fbca0abdd2"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a491ba3ed34093513e6a850fbca0abdd2">faiss::IndexPQ::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="IndexPQ_8cpp_source.html#l00124">IndexPQ.cpp:124</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a4fa05430935a02b62b7c15c9840c42fea4287cbc83d1d5f0d1a02f014e5fe692c"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a4fa05430935a02b62b7c15c9840c42fea4287cbc83d1d5f0d1a02f014e5fe692c">faiss::IndexPQ::ST_SDC</a></div><div class="ttdoc">symmetric product quantizer (SDC) </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00079">IndexPQ.h:79</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_aff455f2adff6064939494dad6e3017bc"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">faiss::IndexPQ::polysemous_ht</a></div><div class="ttdeci">int polysemous_ht</div><div class="ttdoc">Hamming threshold used for polysemy. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00091">IndexPQ.h:91</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a820cec27d1ef14bf59fb288b2e143b6a"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a820cec27d1ef14bf59fb288b2e143b6a">faiss::IndexPQ::polysemous_training</a></div><div class="ttdeci">PolysemousTraining polysemous_training</div><div class="ttdoc">parameters used for the polysemous training </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00072">IndexPQ.h:72</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_1CMin_html"><div class="ttname"><a href="structfaiss_1_1CMin.html">faiss::CMin</a></div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00053">Heap.h:53</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>
|