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
793 lines
120 KiB
HTML
793 lines
120 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/ProductQuantizer.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/ProductQuantizer.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 "ProductQuantizer.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> </div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "FaissAssert.h"</span></div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include "VectorTransform.h"</span></div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include "IndexFlat.h"</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "utils.h"</span></div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </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="keyword">extern</span> <span class="stringliteral">"C"</span> {</div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment">/* declare BLAS functions, see http://www.netlib.org/clapack/cblas/ */</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> <span class="keywordtype">int</span> sgemm_ (<span class="keyword">const</span> <span class="keywordtype">char</span> *transa, <span class="keyword">const</span> <span class="keywordtype">char</span> *transb, FINTEGER *m, FINTEGER *</div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  n, FINTEGER *k, <span class="keyword">const</span> <span class="keywordtype">float</span> *alpha, <span class="keyword">const</span> <span class="keywordtype">float</span> *a,</div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  FINTEGER *lda, <span class="keyword">const</span> <span class="keywordtype">float</span> *b, FINTEGER *</div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  ldb, <span class="keywordtype">float</span> *beta, <span class="keywordtype">float</span> *c, FINTEGER *ldc);</div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> }</div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="keyword">namespace </span>faiss {</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> </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> <span class="comment">/* compute an estimator using look-up tables for typical values of M */</span></div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CT, <span class="keyword">class</span> C></div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="keywordtype">void</span> pq_estimators_from_tables_Mmul4 (<span class="keywordtype">int</span> M, <span class="keyword">const</span> CT * codes,</div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * __restrict dis_table,</div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordtype">size_t</span> ksub,</div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordtype">size_t</span> k,</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordtype">float</span> * heap_dis,</div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordtype">long</span> * heap_ids)</div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> {</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">for</span> (<span class="keywordtype">size_t</span> j = 0; j < ncodes; j++) {</div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dt = dis_table;</div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < M; m+=4) {</div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordtype">float</span> dism = 0;</div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  dism = dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  dism += dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  dism += dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  dism += dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  dis += dism;</div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</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>  <span class="keywordflow">if</span> (C::cmp (heap_dis[0], dis)) {</div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  heap_pop<C> (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  heap_push<C> (k, heap_dis, heap_ids, dis, j);</div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  }</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  }</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> }</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </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> <span class="keyword">template</span> <<span class="keyword">typename</span> CT, <span class="keyword">class</span> C></div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="keywordtype">void</span> pq_estimators_from_tables_M4 (<span class="keyword">const</span> CT * codes,</div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * __restrict dis_table,</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordtype">size_t</span> ksub,</div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keywordtype">size_t</span> k,</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordtype">float</span> * heap_dis,</div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordtype">long</span> * heap_ids)</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>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < ncodes; j++) {</div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dt = dis_table;</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  dis = dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  dis += dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  dis += dt[*codes++]; dt += ksub;</div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  dis += dt[*codes++];</div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> </div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">if</span> (C::cmp (heap_dis[0], dis)) {</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  heap_pop<C> (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  heap_push<C> (k, heap_dis, heap_ids, dis, j);</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  }</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> <span class="keyword">template</span> <<span class="keyword">typename</span> CT, <span class="keyword">class</span> C></div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> pq_estimators_from_tables (<span class="keyword">const</span> ProductQuantizer * pq,</div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="keyword">const</span> CT * codes,</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * dis_table,</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordtype">size_t</span> k,</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordtype">float</span> * heap_dis,</div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordtype">long</span> * heap_ids)</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>  <span class="keywordflow">if</span> (pq->M == 4) {</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>  pq_estimators_from_tables_M4<CT, C> (codes, ncodes,</div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  dis_table, pq->ksub, k,</div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">return</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>  <span class="keywordflow">if</span> (pq->M % 4 == 0) {</div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  pq_estimators_from_tables_Mmul4<CT, C> (pq->M, codes, ncodes,</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  dis_table, pq->ksub, k,</div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="comment">/* Default is relatively slow */</span></div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> M = pq->M;</div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> ksub = pq->ksub;</div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < ncodes; j++) {</div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * __restrict dt = dis_table;</div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < M; m++) {</div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  dis += dt[*codes++];</div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  dt += ksub;</div>
|
|
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">if</span> (C::cmp (heap_dis[0], dis)) {</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  heap_pop<C> (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  heap_push<C> (k, heap_dis, heap_ids, dis, j);</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>  }</div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> }</div>
|
|
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="comment"> * PQ implementation</span></div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> ProductQuantizer::ProductQuantizer (<span class="keywordtype">size_t</span> d, <span class="keywordtype">size_t</span> M, <span class="keywordtype">size_t</span> nbits):</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  d(d), M(M), nbits(nbits)</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>  set_derived_values ();</div>
|
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> }</div>
|
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div>
|
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span> ProductQuantizer::ProductQuantizer ():</div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  d(0), M(1), nbits(0)</div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> {</div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  set_derived_values ();</div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span> }</div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div>
|
|
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span> </div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#ab3067f333b26811537a8519fb08292ce"> 166</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#ab3067f333b26811537a8519fb08292ce">ProductQuantizer::set_derived_values</a> () {</div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="comment">// quite a few derived values</span></div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a> % M == 0);</div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a> = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a> / <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>;</div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> = (<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a> + 7) / 8;</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>;</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  ksub = 1 << <a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a>;</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#aab1109a29ba0544358e274d727b23cae">centroids</a>.resize (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a> * ksub);</div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a1e4056fa3938ed8c9fe701e90d94ad95">verbose</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  train_type = Train_default;</div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> }</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span> </div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#ad291f113c6d44a634ddc1972f9a3c775"> 179</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#ad291f113c6d44a634ddc1972f9a3c775">ProductQuantizer::set_params</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * centroids_, <span class="keywordtype">int</span> m)</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> {</div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  memcpy (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, 0), centroids_,</div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a> * <span class="keyword">sizeof</span> (centroids_[0]));</div>
|
|
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> }</div>
|
|
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="keyword">static</span> <span class="keywordtype">void</span> init_hypercube (<span class="keywordtype">int</span> d, <span class="keywordtype">int</span> nbits,</div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">int</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordtype">float</span> *centroids)</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> {</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  std::vector<float> mean (d);</div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d; j++)</div>
|
|
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  mean [j] += x[i * d + j];</div>
|
|
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordtype">float</span> maxm = 0;</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  mean [j] /= n;</div>
|
|
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">if</span> (fabs(mean[j]) > maxm) maxm = fabs(mean[j]);</div>
|
|
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  }</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < (1 << nbits); i++) {</div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordtype">float</span> * cent = centroids + i * d;</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nbits; j++)</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  cent[j] = mean [j] + (((i >> j) & 1) ? 1 : -1) * maxm;</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = nbits; j < d; j++)</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  cent[j] = mean [j];</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> </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> }</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> </div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> <span class="keyword">static</span> <span class="keywordtype">void</span> init_hypercube_pca (<span class="keywordtype">int</span> d, <span class="keywordtype">int</span> nbits,</div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordtype">int</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordtype">float</span> *centroids)</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>  PCAMatrix pca (d, nbits);</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  pca.train (n, x);</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < (1 << nbits); i++) {</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordtype">float</span> * cent = centroids + i * d;</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  cent[j] = pca.mean[j];</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordtype">float</span> f = 1.0;</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < nbits; k++)</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  cent[j] += f *</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  sqrt (pca.eigenvalues [k]) *</div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  (((i >> k) & 1) ? 1 : -1) *</div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  pca.PCAMat [j + k * d];</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>  }</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> }</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="keywordtype">void</span> ProductQuantizer::train (<span class="keywordtype">int</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x)</div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> {</div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">if</span> (train_type != <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35aa1aefc6c08f0ca974de9f59d9557aa0d">Train_shared</a>) {</div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35">train_type_t</a> final_train_type;</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  final_train_type = train_type;</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span> (train_type == <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35ac8040c8792a014a2ea7188583575013e">Train_hypercube</a> ||</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  train_type == <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a6b330bc2cfa02a402d002d657f214931">Train_hypercube_pca</a>) {</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a> < nbits) {</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  final_train_type = Train_default;</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  printf (<span class="stringliteral">"cannot train hypercube: nbits=%ld > log2(d=%ld)\n"</span>,</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  nbits, <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>);</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> </div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordtype">float</span> * xslice = <span class="keyword">new</span> <span class="keywordtype">float</span>[n * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>];</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  ScopeDeleter<float> del (xslice);</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++)</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  memcpy (xslice + j * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>,</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  x + j * d + m * dsub,</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  dsub * <span class="keyword">sizeof</span>(<span class="keywordtype">float</span>));</div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  Clustering clus (dsub, ksub, <a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>);</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="comment">// we have some initialization for the centroids</span></div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span> (final_train_type != Train_default) {</div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  clus.centroids.resize (dsub * ksub);</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  }</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span> </div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">switch</span> (final_train_type) {</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35ac8040c8792a014a2ea7188583575013e">Train_hypercube</a>:</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  init_hypercube (dsub, nbits, n, xslice,</div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  clus.centroids.data ());</div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a6b330bc2cfa02a402d002d657f214931">Train_hypercube_pca</a>:</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  init_hypercube_pca (dsub, nbits, n, xslice,</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  clus.centroids.data ());</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0">Train_hot_start</a>:</div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  memcpy (clus.centroids.data(),</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, 0),</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  dsub * ksub * <span class="keyword">sizeof</span> (float));</div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">default</span>: ;</div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span>(<a class="code" href="structfaiss_1_1ProductQuantizer.html#a1e4056fa3938ed8c9fe701e90d94ad95">verbose</a>) {</div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  clus.verbose = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  printf (<span class="stringliteral">"Training PQ slice %d/%zd\n"</span>, m, M);</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>  IndexFlatL2 index (dsub);</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  clus.train (n, xslice, index);</div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#ad291f113c6d44a634ddc1972f9a3c775">set_params</a> (clus.centroids.data(), m);</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  }</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </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="keywordflow">else</span> {</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>  Clustering clus (dsub, ksub, <a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>);</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span>(<a class="code" href="structfaiss_1_1ProductQuantizer.html#a1e4056fa3938ed8c9fe701e90d94ad95">verbose</a>) {</div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  clus.verbose = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  printf (<span class="stringliteral">"Training all PQ slices at once\n"</span>);</div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  }</div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  IndexFlatL2 index (dsub);</div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  clus.train (n * M, x, index);</div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#ad291f113c6d44a634ddc1972f9a3c775">set_params</a> (clus.centroids.data(), m);</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span> </div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span> }</div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span> </div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838"> 311</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">ProductQuantizer::compute_code</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * x, uint8_t * code)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordtype">float</span> distances [<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>];</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordtype">float</span> mindis = 1e20;</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordtype">int</span> idxm = -1;</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * xsub = x + m * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span> </div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  fvec_L2sqr_ny (distances, xsub, <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, 0), dsub, ksub);</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span> </div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="comment">/* Find best centroid */</span></div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordtype">size_t</span> i;</div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++) {</div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordtype">float</span> dis = distances [i];</div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">if</span> (dis < mindis) {</div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  mindis = dis;</div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  idxm = i;</div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</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">switch</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a>) {</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">case</span> 1: code[m] = (uint8_t) idxm; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">case</span> 2: ((uint16_t *) code)[m] = (uint16_t) idxm; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  }</div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  }</div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span> </div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> }</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span> </div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208"> 338</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">ProductQuantizer::decode</a> (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1) {</div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  memcpy (x + m * dsub, <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, code[m]),</div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keyword">sizeof</span>(<span class="keywordtype">float</span>) * dsub);</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  }</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keyword">const</span> uint16_t *c = (<span class="keyword">const</span> uint16_t*) code;</div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  memcpy (x + m * dsub, <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, c[m]),</div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keyword">sizeof</span>(<span class="keywordtype">float</span>) * dsub);</div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</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> </div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span> </div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">ProductQuantizer::decode</a> (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">float</span> *x, <span class="keywordtype">size_t</span> n)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  this-><a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (code + M * i, x + d * i);</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"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a95060fedd7c09eb20e968fd2fdb4b316"> 363</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a95060fedd7c09eb20e968fd2fdb4b316">ProductQuantizer::compute_code_from_distance_table</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> *tab,</div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  uint8_t *code)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordtype">float</span> mindis = 1e20;</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordtype">int</span> idxm = -1;</div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="comment">/* Find best centroid */</span></div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; j++) {</div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordtype">float</span> dis = *tab++;</div>
|
|
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="keywordflow">if</span> (dis < mindis) {</div>
|
|
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  mindis = dis;</div>
|
|
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  idxm = j;</div>
|
|
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  }</div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  }</div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">switch</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a>) {</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">case</span> 1: code[m] = (uint8_t) idxm; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">case</span> 2: ((uint16_t *) code)[m] = (uint16_t) idxm; <span class="keywordflow">break</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"> 382</span>  }</div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span> }</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1"> 385</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">ProductQuantizer::compute_codes</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  uint8_t * codes,</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordtype">size_t</span> n)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="keywordflow">if</span> (dsub < 16) { <span class="comment">// simple direct computation</span></div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">compute_code</a> (x + i * d, codes + i * <a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>);</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>  } <span class="keywordflow">else</span> { <span class="comment">// worthwile to use BLAS</span></div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordtype">float</span> *dis_tables = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del (dis_tables);</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">compute_distance_tables</a> (n, x, dis_tables);</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  uint8_t * code = codes + i * <a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>;</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * tab = dis_tables + i * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>;</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a95060fedd7c09eb20e968fd2fdb4b316">compute_code_from_distance_table</a> (tab, code);</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>  }</div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span> }</div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a36361f41bcd2fa698f3c39eb7111ed09"> 410</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a36361f41bcd2fa698f3c39eb7111ed09">ProductQuantizer::compute_distance_table</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordtype">float</span> * dis_table)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordtype">size_t</span> m;</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span> </div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">for</span> (m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  fvec_L2sqr_ny (dis_table + m * ksub,</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  x + m * dsub,</div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, 0),</div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  dsub,</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  ksub);</div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span> }</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div>
|
|
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span> <span class="keywordtype">void</span> ProductQuantizer::compute_inner_prod_table (<span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordtype">float</span> * dis_table)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordtype">size_t</span> m;</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordflow">for</span> (m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  fvec_inner_products_ny (dis_table + m * ksub,</div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  x + m * dsub,</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a>(m, 0),</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  dsub,</div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  ksub);</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"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207"> 439</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">ProductQuantizer::compute_distance_tables</a> (</div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keywordtype">size_t</span> nx,</div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">float</span> * dis_tables)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span> <span class="keyword"></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>  <span class="keywordflow">if</span> (dsub < 16) {</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> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nx; i++) {</div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a36361f41bcd2fa698f3c39eb7111ed09">compute_distance_table</a> (x + i * d, dis_tables + i * ksub * M);</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>  } <span class="keywordflow">else</span> { <span class="comment">// use BLAS</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="namespacefaiss.html#a3d9c7db82d43c1f0ab1d28b92bc9fe57">pairwise_L2sqr</a> (dsub,</div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  nx, x + dsub * m,</div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  ksub, centroids.data() + m * dsub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>,</div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  dis_tables + ksub * m,</div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a>, <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>, ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>);</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> }</div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span> <span class="keywordtype">void</span> ProductQuantizer::compute_inner_prod_tables (</div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordtype">size_t</span> nx,</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keywordtype">float</span> * dis_tables)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span> <span class="keyword"></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="keywordflow">if</span> (dsub < 16) {</div>
|
|
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span> </div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nx; i++) {</div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  compute_inner_prod_table (x + i * d, dis_tables + i * ksub * M);</div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  }</div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span> </div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  } <span class="keywordflow">else</span> { <span class="comment">// use BLAS</span></div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span> </div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="comment">// compute distance tables</span></div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  FINTEGER ldc = ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>, nxi = nx, ksubi = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>,</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  dsubi = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>, di = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a>;</div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordtype">float</span> one = 1.0, zero = 0;</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>  sgemm_ (<span class="stringliteral">"Transposed"</span>, <span class="stringliteral">"Not transposed"</span>,</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  &ksubi, &nxi, &dsubi,</div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  &one, &centroids [m * dsub * ksub], &dsubi,</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  x + dsub * m, &di,</div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  &zero, dis_tables + ksub * m, &ldc);</div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  }</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> }</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span> </div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CT, <span class="keyword">class</span> C></div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span> <span class="keyword">static</span> <span class="keywordtype">void</span> pq_knn_search_with_tables (</div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keyword">const</span> ProductQuantizer * pq,</div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dis_tables,</div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keyword">const</span> uint8_t * codes,</div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  HeapArray<C> * res,</div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordtype">bool</span> init_finalize_heap)</div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span> {</div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keywordtype">size_t</span> k = res->k, nx = res->nh;</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordtype">size_t</span> ksub = pq->ksub, M = pq->M;</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> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nx; i++) {</div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="comment">/* query preparation for asymmetric search: compute look-up tables */</span></div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keyword">const</span> <span class="keywordtype">float</span>* dis_table = dis_tables + i * ksub * M;</div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="comment">/* Compute distances and keep smallest values */</span></div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">long</span> * __restrict heap_ids = res->ids + i * k;</div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordtype">float</span> * __restrict heap_dis = res->val + i * k;</div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span> </div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordflow">if</span> (init_finalize_heap) {</div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  heap_heapify<C> (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  }</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>  pq_estimators_from_tables<CT, C> (pq,</div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  (CT*)codes, ncodes,</div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  dis_table,</div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">if</span> (init_finalize_heap) {</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  heap_reorder<C> (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  }</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div>
|
|
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span> }</div>
|
|
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div>
|
|
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="comment">/*</span></div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span> <span class="comment">static inline void pq_estimators_from_tables (const ProductQuantizer * pq,</span></div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span> <span class="comment"> const CT * codes,</span></div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span> <span class="comment"> size_t ncodes,</span></div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span> <span class="comment"> const float * dis_table,</span></div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="comment"> size_t k,</span></div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span> <span class="comment"> float * heap_dis,</span></div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="comment"> long * heap_ids)</span></div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a1ae7892a15b9f6809a3ba1a123a7831b"> 540</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a1ae7892a15b9f6809a3ba1a123a7831b">ProductQuantizer::search</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * __restrict x,</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordtype">size_t</span> nx,</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keyword">const</span> uint8_t * codes,</div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_maxheap_array_t</a> * res,</div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keywordtype">bool</span> init_finalize_heap)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  FAISS_THROW_IF_NOT (nx == res-><a class="code" href="structfaiss_1_1HeapArray.html#aad477a3907c3496159eaf4b375be4432">nh</a>);</div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordtype">float</span> * dis_tables = <span class="keyword">new</span> <span class="keywordtype">float</span> [nx * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(dis_tables);</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3521b9a36c28219fd6180cc7a9ce8207">compute_distance_tables</a> (nx, x, dis_tables);</div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span> </div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1) {</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>  pq_knn_search_with_tables<uint8_t, CMax<float, long> > (</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keyword">this</span>, dis_tables, codes, ncodes, res, init_finalize_heap);</div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span> </div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 2) {</div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  pq_knn_search_with_tables<uint16_t, CMax<float, long> > (</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keyword">this</span>, dis_tables, codes, ncodes, res, init_finalize_heap);</div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span> </div>
|
|
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  }</div>
|
|
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span> }</div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span> </div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"><a class="line" href="structfaiss_1_1ProductQuantizer.html#a66be226806ca2abcaaf1653cdc690aa6"> 565</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ProductQuantizer.html#a66be226806ca2abcaaf1653cdc690aa6">ProductQuantizer::search_ip</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * __restrict x,</div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordtype">size_t</span> nx,</div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <span class="keyword">const</span> uint8_t * codes,</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> ncodes,</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <a class="code" href="structfaiss_1_1HeapArray.html">float_minheap_array_t</a> * res,</div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordtype">bool</span> init_finalize_heap)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  FAISS_THROW_IF_NOT (nx == res-><a class="code" href="structfaiss_1_1HeapArray.html#aad477a3907c3496159eaf4b375be4432">nh</a>);</div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordtype">float</span> * dis_tables = <span class="keyword">new</span> <span class="keywordtype">float</span> [nx * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>];</div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(dis_tables);</div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  compute_inner_prod_tables (nx, x, dis_tables);</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span> </div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1) {</div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span> </div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  pq_knn_search_with_tables<uint8_t, CMin<float, long> > (</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keyword">this</span>, dis_tables, codes, ncodes, res, init_finalize_heap);</div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 2) {</div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  pq_knn_search_with_tables<uint16_t, CMin<float, long> > (</div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keyword">this</span>, dis_tables, codes, ncodes, res, init_finalize_heap);</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> </div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span> }</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div>
|
|
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span> </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="keyword">static</span> <span class="keywordtype">float</span> sqr (<span class="keywordtype">float</span> x) {</div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">return</span> x * x;</div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span> }</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span> </div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="keywordtype">void</span> ProductQuantizer::compute_sdc_table ()</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span> {</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">sdc_table</a>.resize (M * ksub * ksub);</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</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="keyword">const</span> <span class="keywordtype">float</span> *cents = centroids.data() + m * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keywordtype">float</span> * dis_tab = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">sdc_table</a>.data() + m * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span> </div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="comment">// TODO optimize with BLAS</span></div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++) {</div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *centi = cents + i * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; j++) {</div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordtype">float</span> accu = 0;</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *centj = cents + j * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>; k++)</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  accu += sqr (centi[k] - centj[k]);</div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  dis_tab [i + j * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>] = accu;</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  }</div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  }</div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  }</div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span> }</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span> </div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="keywordtype">void</span> ProductQuantizer::search_sdc (<span class="keyword">const</span> uint8_t * qcodes,</div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordtype">size_t</span> nq,</div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keyword">const</span> uint8_t * bcodes,</div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nb,</div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  float_maxheap_array_t * res,</div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordtype">bool</span> init_finalize_heap)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">sdc_table</a>.size() == M * ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>);</div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1);</div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordtype">size_t</span> k = res->k;</div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> </div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> </div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < nq; i++) {</div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span> </div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="comment">/* Compute distances and keep smallest values */</span></div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="keywordtype">long</span> * heap_ids = res->ids + i * k;</div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordtype">float</span> * heap_dis = res->val + i * k;</div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keyword">const</span> uint8_t * qcode = qcodes + i * <a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>;</div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span> </div>
|
|
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keywordflow">if</span> (init_finalize_heap)</div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  maxheap_heapify (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> </div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keyword">const</span> uint8_t * bcode = bcodes;</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < nb; j++) {</div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordtype">float</span> dis = 0;</div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * tab = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">sdc_table</a>.data();</div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < <a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  dis += tab[bcode[m] + qcode[m] * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>];</div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  tab += ksub * <a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  }</div>
|
|
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordflow">if</span> (dis < heap_dis[0]) {</div>
|
|
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  maxheap_pop (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  maxheap_push (k, heap_dis, heap_ids, dis, j);</div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  bcode += <a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a>;</div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  }</div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span> </div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">if</span> (init_finalize_heap)</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  maxheap_reorder (k, heap_dis, heap_ids);</div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  }</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> }</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span> </div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span> </div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span> </div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span> </div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span> </div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> } <span class="comment">// namespace faiss</span></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ad291f113c6d44a634ddc1972f9a3c775"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ad291f113c6d44a634ddc1972f9a3c775">faiss::ProductQuantizer::set_params</a></div><div class="ttdeci">void set_params(const float *centroids, int m)</div><div class="ttdoc">Define the centroids for subquantizer m. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00179">ProductQuantizer.cpp:179</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35a6b330bc2cfa02a402d002d657f214931"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a6b330bc2cfa02a402d002d657f214931">faiss::ProductQuantizer::Train_hypercube_pca</a></div><div class="ttdoc">intialize centroids with nbits-D hypercube </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00045">ProductQuantizer.h:45</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_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_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35ac8040c8792a014a2ea7188583575013e"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35ac8040c8792a014a2ea7188583575013e">faiss::ProductQuantizer::Train_hypercube</a></div><div class="ttdoc">intialize centroids with nbits-D hypercube </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00044">ProductQuantizer.h:44</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ab3067f333b26811537a8519fb08292ce"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ab3067f333b26811537a8519fb08292ce">faiss::ProductQuantizer::set_derived_values</a></div><div class="ttdeci">void set_derived_values()</div><div class="ttdoc">compute derived values when d, M and nbits have been set </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00166">ProductQuantizer.cpp:166</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a6bd65fb4407452f73acb7242931d09e4"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">faiss::ProductQuantizer::sdc_table</a></div><div class="ttdeci">std::vector< float > sdc_table</div><div class="ttdoc">Symmetric Distance Table. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00155">ProductQuantizer.h:155</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35aa1aefc6c08f0ca974de9f59d9557aa0d"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35aa1aefc6c08f0ca974de9f59d9557aa0d">faiss::ProductQuantizer::Train_shared</a></div><div class="ttdoc">share dictionary accross PQ segments </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00043">ProductQuantizer.h:43</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_a467b451ca203544e42c250e4be65b983"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">faiss::ProductQuantizer::dsub</a></div><div class="ttdeci">size_t dsub</div><div class="ttdoc">dimensionality of each subvector </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00032">ProductQuantizer.h:32</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_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_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_1ProductQuantizer_html_a36361f41bcd2fa698f3c39eb7111ed09"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a36361f41bcd2fa698f3c39eb7111ed09">faiss::ProductQuantizer::compute_distance_table</a></div><div class="ttdeci">void compute_distance_table(const float *x, float *dis_table) const </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00410">ProductQuantizer.cpp:410</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_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="namespacefaiss_html_a3d9c7db82d43c1f0ab1d28b92bc9fe57"><div class="ttname"><a href="namespacefaiss.html#a3d9c7db82d43c1f0ab1d28b92bc9fe57">faiss::pairwise_L2sqr</a></div><div class="ttdeci">void pairwise_L2sqr(long d, long nq, const float *xq, long nb, const float *xb, float *dis, long ldq, long ldb, long ldd)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01342">utils.cpp:1342</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a08b130e3a21f2699a4e3bbec121fb838"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a08b130e3a21f2699a4e3bbec121fb838">faiss::ProductQuantizer::compute_code</a></div><div class="ttdeci">void compute_code(const float *x, uint8_t *code) const </div><div class="ttdoc">Quantize one vector with the product quantizer. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00311">ProductQuantizer.cpp:311</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0">faiss::ProductQuantizer::Train_hot_start</a></div><div class="ttdoc">the centroids are already initialized </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00042">ProductQuantizer.h:42</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_af265acf5aa1bcda60898002287e6a3d6"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">faiss::ProductQuantizer::cp</a></div><div class="ttdeci">ClusteringParameters cp</div><div class="ttdoc">parameters used during clustering </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00049">ProductQuantizer.h:49</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1HeapArray_html_aad477a3907c3496159eaf4b375be4432"><div class="ttname"><a href="structfaiss_1_1HeapArray.html#aad477a3907c3496159eaf4b375be4432">faiss::HeapArray::nh</a></div><div class="ttdeci">size_t nh</div><div class="ttdoc">number of heaps </div><div class="ttdef"><b>Definition:</b> <a href="Heap_8h_source.html#l00354">Heap.h:354</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_1ProductQuantizer_html_a4f0f33c011dffe633a1748a48a082c22"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">faiss::ProductQuantizer::get_centroids</a></div><div class="ttdeci">float * get_centroids(size_t m, size_t i)</div><div class="ttdoc">return the centroids associated with subvector m </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00055">ProductQuantizer.h:55</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a567cd512438f9e3404d9339a232d7695"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">faiss::ProductQuantizer::d</a></div><div class="ttdeci">size_t d</div><div class="ttdoc">size of the input vectors </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00027">ProductQuantizer.h:27</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_1ProductQuantizer_html_aab1109a29ba0544358e274d727b23cae"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#aab1109a29ba0544358e274d727b23cae">faiss::ProductQuantizer::centroids</a></div><div class="ttdeci">std::vector< float > centroids</div><div class="ttdoc">Centroid table, size M * ksub * dsub. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00052">ProductQuantizer.h:52</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35">faiss::ProductQuantizer::train_type_t</a></div><div class="ttdeci">train_type_t</div><div class="ttdoc">initialization </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00040">ProductQuantizer.h:40</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>
|