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
1136 lines
163 KiB
HTML
1136 lines
163 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/IndexScalarQuantizer.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/IndexScalarQuantizer.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="preprocessor">#include "IndexScalarQuantizer.h"</span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <cstdio></span></div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <omp.h></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 <immintrin.h></span></div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include "utils.h"</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 "FaissAssert.h"</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="keyword">namespace </span>faiss {</div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> * ScalarQuantizer implementation</span></div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * The main source of complexity is to support combinations of 4</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> * variants without incurring runtime tests or virtual function calls:</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * - 4 / 8 bits per code component</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> * - uniform / non-uniform</span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> * - IP / L2 distance search</span></div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment"> * - scalar / AVX distance computation</span></div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment"> * The appropriate Quantizer object is returned via select_quantizer</span></div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment"> * that hides the template mess.</span></div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment"> ********************************************************************/</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> <span class="preprocessor">#ifdef __AVX__</span></div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor"></span><span class="preprocessor">#define USE_AVX</span></div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor"></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> <span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">typedef</span> <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> idx_t;</div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="keyword">typedef</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952e">ScalarQuantizer::QuantizerType</a> QuantizerType;</div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="keyword">typedef</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06">ScalarQuantizer::RangeStat</a> RangeStat;</div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span> </div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> * Codec: converts between values in [0, 1] and an index in a code</span></div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> * array. The "i" parameter is the vector component index (not byte</span></div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> * index).</span></div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="keyword">struct </span>Codec8bit {</div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> encode_component (<span class="keywordtype">float</span> x, uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  code[i] = (int)(255 * x);</div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  }</div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> </div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keyword">static</span> <span class="keywordtype">float</span> decode_component (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordflow">return</span> (code[i] + 0.5f) / 255.0f;</div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  }</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor"></span> <span class="keyword">static</span> __m256 decode_8_components (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  uint64_t c8 = *(uint64_t*)(code + i);</div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  __m128i c4lo = _mm_cvtepu8_epi32 (_mm_set1_epi32(c8));</div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  __m128i c4hi = _mm_cvtepu8_epi32 (_mm_set1_epi32(c8 >> 32));</div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="comment">// __m256i i8 = _mm256_set_m128i(c4lo, c4hi);</span></div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  __m256i i8 = _mm256_castsi128_si256 (c4lo);</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  i8 = _mm256_insertf128_si256 (i8, c4hi, 1);</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  __m256 f8 = _mm256_cvtepi32_ps (i8);</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  __m256 half = _mm256_set1_ps (0.5f);</div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  f8 += half;</div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  __m256 one_255 = _mm256_set1_ps (1.f / 255.f);</div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordflow">return</span> f8 * one_255;</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="preprocessor"></span>};</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="keyword">struct </span>Codec4bit {</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="keyword">static</span> <span class="keywordtype">void</span> encode_component (<span class="keywordtype">float</span> x, uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  code [i / 2] |= (int)(x * 15.0) << ((i & 1) << 2);</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  }</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keyword">static</span> <span class="keywordtype">float</span> decode_component (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">return</span> (((code[i / 2] >> ((i & 1) << 2)) & 0xf) + 0.5f) / 15.0f;</div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  }</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> </div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor"></span> <span class="keyword">static</span> __m256 decode_8_components (<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">int</span> i) {</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  uint32_t c4 = *(uint32_t*)(code + (i >> 1));</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  uint32_t mask = 0x0f0f0f0f;</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  uint32_t c4ev = c4 & mask;</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  uint32_t c4od = (c4 >> 4) & mask;</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="comment">// the 8 lower bytes of c8 contain the values</span></div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  __m128i c8 = _mm_unpacklo_epi8 (_mm_set1_epi32(c4ev),</div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  _mm_set1_epi32(c4od));</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  __m128i c4lo = _mm_cvtepu8_epi32 (c8);</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  __m128i c4hi = _mm_cvtepu8_epi32 (_mm_srli_si128(c8, 4));</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  __m256i i8 = _mm256_castsi128_si256 (c4lo);</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  i8 = _mm256_insertf128_si256 (i8, c4hi, 1);</div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  __m256 f8 = _mm256_cvtepi32_ps (i8);</div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  __m256 half = _mm256_set1_ps (0.5f);</div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  f8 += half;</div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  __m256 one_255 = _mm256_set1_ps (1.f / 15.f);</div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">return</span> f8 * one_255;</div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  }</div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="preprocessor"></span>};</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</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> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="comment"> * Similarity: gets vector components and computes a similarity wrt. a</span></div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="comment"> * query vector stored in the object</span></div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">struct </span>SimilarityL2 {</div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *y, *yi;</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="keyword">explicit</span> SimilarityL2 (<span class="keyword">const</span> <span class="keywordtype">float</span> * y): y(y) {}</div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="comment">/******* scalar accumulator *******/</span></div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordtype">float</span> accu;</div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> </div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordtype">void</span> begin () {</div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  accu = 0;</div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  yi = y;</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> </div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordtype">void</span> add_component (<span class="keywordtype">float</span> x) {</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">float</span> tmp = *yi++ - x;</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  accu += tmp * tmp;</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>  <span class="keywordtype">float</span> result () {</div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="preprocessor"></span> <span class="comment">/******* AVX accumulator *******/</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>  __m256 accu8;</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordtype">void</span> begin_8 () {</div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  accu8 = _mm256_setzero_ps();</div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  yi = y;</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>  <span class="keywordtype">void</span> add_8_components (__m256 x) {</div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  __m256 yiv = _mm256_loadu_ps (yi);</div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  yi += 8;</div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  __m256 tmp = yiv - x;</div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  accu8 += tmp * tmp;</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>  <span class="keywordtype">float</span> result_8 () {</div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  __m256 sum = _mm256_hadd_ps(accu8, accu8);</div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  __m256 sum2 = _mm256_hadd_ps(sum, sum);</div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="comment">// now add the 0th and 4th component</span></div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">return</span></div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  _mm_cvtss_f32 (_mm256_castps256_ps128(sum2)) +</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  _mm_cvtss_f32 (_mm256_extractf128_ps(sum2, 1));</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  }</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="preprocessor"></span>};</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> </div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="keyword">struct </span>SimilarityIP {</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *y, *yi;</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> accu0;</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> </div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="comment">/******* scalar accumulator *******/</span></div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordtype">float</span> accu;</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>  SimilarityIP (<span class="keyword">const</span> <span class="keywordtype">float</span> * y, <span class="keywordtype">float</span> accu0):</div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  y (y), accu0 (accu0) {}</div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> </div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">void</span> begin () {</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  accu = accu0;</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  yi = y;</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  }</div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordtype">void</span> add_component (<span class="keywordtype">float</span> x) {</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  accu += *yi++ * x;</div>
|
|
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  }</div>
|
|
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordtype">float</span> result () {</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  }</div>
|
|
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> </div>
|
|
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="preprocessor"></span> <span class="comment">/******* AVX accumulator *******/</span></div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  __m256 accu8;</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordtype">void</span> begin_8 () {</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  accu8 = _mm256_setzero_ps();</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  yi = y;</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>  <span class="keywordtype">void</span> add_8_components (__m256 x) {</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  __m256 yiv = _mm256_loadu_ps (yi);</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  yi += 8;</div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  accu8 += yiv * x;</div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  }</div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div>
|
|
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordtype">float</span> result_8 () {</div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  __m256 sum = _mm256_hadd_ps(accu8, accu8);</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  __m256 sum2 = _mm256_hadd_ps(sum, sum);</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="comment">// now add the 0th and 4th component</span></div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">return</span></div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  accu0 +</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  _mm_cvtss_f32 (_mm256_castps256_ps128(sum2)) +</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  _mm_cvtss_f32 (_mm256_extractf128_ps(sum2, 1));</div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  }</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="preprocessor"></span>};</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> <span class="comment"> * templatized distance functions</span></div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="comment"> */</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> <span class="keyword">template</span><<span class="keyword">class</span> Quantizer, <span class="keyword">class</span> Similarity></div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="keywordtype">float</span> compute_distance(<span class="keyword">const</span> Quantizer & quant, Similarity & sim,</div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keyword">const</span> uint8_t *code)</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>  sim.begin();</div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < quant.d; i++) {</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordtype">float</span> xi = quant.reconstruct_component (code, i);</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  sim.add_component (xi);</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  }</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">return</span> sim.result();</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span> }</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span> </div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">class</span> Quantizer, <span class="keyword">class</span> Similarity></div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span> <span class="keywordtype">float</span> compute_distance_8(<span class="keyword">const</span> Quantizer & quant, Similarity & sim,</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keyword">const</span> uint8_t *code)</div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span> {</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  sim.begin_8();</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < quant.d; i += 8) {</div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  __m256 xi = quant.reconstruct_8_components (code, i);</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  sim.add_8_components (xi);</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">return</span> sim.result_8();</div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> }</div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span> </div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="comment"> * Quantizer range training</span></div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span> <span class="comment"> */</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="keyword">static</span> <span class="keywordtype">float</span> sqr (<span class="keywordtype">float</span> x) {</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> x * x;</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span> }</div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span> <span class="keywordtype">void</span> train_Uniform(RangeStat rs, <span class="keywordtype">float</span> rs_arg,</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  idx_t n, <span class="keywordtype">int</span> k, <span class="keyword">const</span> <span class="keywordtype">float</span> *x,</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  std::vector<float> & trained)</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span> {</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  trained.resize (2);</div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordtype">float</span> & vmin = trained[0];</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordtype">float</span> & vmax = trained[1];</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (rs == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06aa52f2f14616c61c04baf6323d43588fd">ScalarQuantizer::RS_minmax</a>) {</div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  vmin = HUGE_VAL; vmax = -HUGE_VAL;</div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">if</span> (x[i] < vmin) vmin = x[i];</div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (x[i] > vmax) vmax = x[i];</div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  }</div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordtype">float</span> vexp = (vmax - vmin) * rs_arg;</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  vmin -= vexp;</div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  vmax += vexp;</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rs == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06afb4b9f4ee9003fa0193e6de69632f7a0">ScalarQuantizer::RS_meanstd</a>) {</div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordtype">double</span> sum = 0, sum2 = 0;</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  sum += x[i];</div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  sum2 += x[i] * x[i];</div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div>
|
|
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordtype">float</span> mean = sum / n;</div>
|
|
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordtype">float</span> var = sum2 / n - mean * mean;</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordtype">float</span> std = var <= 0 ? 1.0 : sqrt(var);</div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  vmin = mean - std * rs_arg ;</div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  vmax = mean + std * rs_arg ;</div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rs == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06ae41cccec3a7acbcb3a47fa63c2bfb4c8">ScalarQuantizer::RS_quantiles</a>) {</div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  std::vector<float> x_copy(n);</div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  memcpy(x_copy.data(), x, n * <span class="keyword">sizeof</span>(*x));</div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="comment">// TODO just do a qucikselect</span></div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  std::sort(x_copy.begin(), x_copy.end());</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordtype">int</span> o = int(rs_arg * n);</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keywordflow">if</span> (o < 0) o = 0;</div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">if</span> (o > n - o) o = n / 2;</div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  vmin = x_copy[o];</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  vmax = x_copy[n - 1 - o];</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>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rs == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06ab0709ff74c1b882b64a7fdd7ca5df9a3">ScalarQuantizer::RS_optim</a>) {</div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordtype">float</span> a, b;</div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keywordtype">float</span> sx = 0;</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  {</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  vmin = HUGE_VAL, vmax = -HUGE_VAL;</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">if</span> (x[i] < vmin) vmin = x[i];</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">if</span> (x[i] > vmax) vmax = x[i];</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  sx += x[i];</div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  }</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  b = vmin;</div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  a = (vmax - vmin) / (k - 1);</div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  }</div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordtype">int</span> verbose = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordtype">int</span> niter = 2000;</div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordtype">float</span> last_err = -1;</div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordtype">int</span> iter_last_err = 0;</div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> it = 0; it < niter; it++) {</div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordtype">float</span> sn = 0, sn2 = 0, sxn = 0, err1 = 0;</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">for</span> (idx_t i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordtype">float</span> xi = x[i];</div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordtype">float</span> ni = floor ((xi - b) / a + 0.5);</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">if</span> (ni < 0) ni = 0;</div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">if</span> (ni >= k) ni = k - 1;</div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  err1 += sqr (xi - (ni * a + b));</div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  sn += ni;</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  sn2 += ni * ni;</div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  sxn += ni * xi;</div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  }</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span> </div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">if</span> (err1 == last_err) {</div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  iter_last_err ++;</div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">if</span> (iter_last_err == 16) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  last_err = err1;</div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  iter_last_err = 0;</div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  }</div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span> </div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordtype">float</span> det = sqr (sn) - sn2 * n;</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>  b = (sn * sxn - sn2 * sx) / det;</div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  a = (sn * sx - n * sxn) / det;</div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  printf (<span class="stringliteral">"it %d, err1=%g \r"</span>, it, err1);</div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  fflush(stdout);</div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  }</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  }</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordflow">if</span> (verbose) printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  vmin = b;</div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  vmax = b + a * (k - 1);</div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span> </div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  FAISS_THROW_MSG (<span class="stringliteral">"Invalid qtype"</span>);</div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  }</div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  vmax -= vmin;</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span> }</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span> </div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span> <span class="keywordtype">void</span> train_NonUniform(RangeStat rs, <span class="keywordtype">float</span> rs_arg,</div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  idx_t n, <span class="keywordtype">int</span> d, <span class="keywordtype">int</span> k, <span class="keyword">const</span> <span class="keywordtype">float</span> *x,</div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  std::vector<float> & trained)</div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span> {</div>
|
|
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  trained.resize (2 * d);</div>
|
|
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordtype">float</span> * vmin = trained.data();</div>
|
|
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordtype">float</span> * vmax = trained.data() + d;</div>
|
|
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> (rs == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06aa52f2f14616c61c04baf6323d43588fd">ScalarQuantizer::RS_minmax</a>) {</div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  memcpy (vmin, x, <span class="keyword">sizeof</span>(*x) * d);</div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  memcpy (vmax, x, <span class="keyword">sizeof</span>(*x) * d);</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1; i < n; i++) {</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xi = x + i * d;</div>
|
|
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keywordflow">if</span> (xi[j] < vmin[j]) vmin[j] = xi[j];</div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keywordflow">if</span> (xi[j] > vmax[j]) vmax[j] = xi[j];</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  }</div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  }</div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordtype">float</span> *vdiff = vmax;</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordtype">float</span> vexp = (vmax[j] - vmin[j]) * rs_arg;</div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  vmin[j] -= vexp;</div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  vmax[j] += vexp;</div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  vdiff [j] = vmax[j] - vmin[j];</div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  }</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="comment">// transpose</span></div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  std::vector<float> xt(n * d);</div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1; i < n; i++) {</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xi = x + i * d;</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  xt[j * n + i] = xi[j];</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  }</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  }</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  std::vector<float> trained_d(2);</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < d; j++) {</div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  train_Uniform(rs, rs_arg,</div>
|
|
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  n, k, xt.data() + j * n,</div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  trained_d);</div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  vmin[j] = trained_d[0];</div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  vmax[j] = trained_d[1];</div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  }</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span> }</div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span> </div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> <span class="comment"> * Quantizer: normalizes scalar vector components, then passes them</span></div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="comment"> * through a codec</span></div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span> </div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span> </div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span> <span class="keyword">struct </span>Quantizer {</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> encode_vector(<span class="keyword">const</span> <span class="keywordtype">float</span> *x, uint8_t *code) <span class="keyword">const</span> = 0;</div>
|
|
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> decode_vector(<span class="keyword">const</span> uint8_t *code, <span class="keywordtype">float</span> *x) <span class="keyword">const</span> = 0;</div>
|
|
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keyword">virtual</span> <span class="keywordtype">float</span> compute_distance_L2 (SimilarityL2 &sim,</div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keyword">const</span> uint8_t * codes) <span class="keyword">const</span> = 0;</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keyword">virtual</span> <span class="keywordtype">float</span> compute_distance_IP (SimilarityIP &sim,</div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keyword">const</span> uint8_t * codes) <span class="keyword">const</span> = 0;</div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span> </div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keyword">virtual</span> ~Quantizer() {}</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span> };</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span> </div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div>
|
|
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span> </div>
|
|
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div>
|
|
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span> <span class="keyword">template</span><<span class="keyword">class</span> Codec></div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span> <span class="keyword">struct </span>QuantizerUniform: Quantizer {</div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> d;</div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> vmin, vdiff;</div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span> </div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  QuantizerUniform(<span class="keywordtype">size_t</span> d, <span class="keyword">const</span> std::vector<float> &trained):</div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  d(d), vmin(trained[0]), vdiff(trained[1]) {</div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  }</div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span> </div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordtype">void</span> encode_vector(<span class="keyword">const</span> <span class="keywordtype">float</span>* x, uint8_t* code)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d; i++) {</div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordtype">float</span> xi = (x[i] - vmin) / vdiff;</div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">if</span> (xi < 0)</div>
|
|
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  xi = 0;</div>
|
|
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">if</span> (xi > 1.0)</div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  xi = 1.0;</div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  Codec::encode_component(xi, code, i);</div>
|
|
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  }</div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordtype">void</span> decode_vector(<span class="keyword">const</span> uint8_t* code, <span class="keywordtype">float</span>* x)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d; i++) {</div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordtype">float</span> xi = Codec::decode_component(code, i);</div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  x[i] = vmin + xi * vdiff;</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">float</span> reconstruct_component (<span class="keyword">const</span> uint8_t * code, <span class="keywordtype">int</span> i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordtype">float</span> xi = Codec::decode_component (code, i);</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keywordflow">return</span> vmin + xi * vdiff;</div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span> </div>
|
|
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="preprocessor"></span> __m256 reconstruct_8_components (<span class="keyword">const</span> uint8_t * code, <span class="keywordtype">int</span> i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  __m256 xi = Codec::decode_8_components (code, i);</div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keywordflow">return</span> _mm256_set1_ps(vmin) + xi * _mm256_set1_ps (vdiff);</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> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="keywordtype">float</span> compute_distance_L2(SimilarityL2& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordflow">return</span> compute_distance(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordtype">float</span> compute_distance_IP(SimilarityIP& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">return</span> compute_distance(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  }</div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span> };</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span> </div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span> <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">class</span> Codec></div>
|
|
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span> <span class="keyword">struct </span>QuantizerUniform8: QuantizerUniform<Codec> {</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>  QuantizerUniform8 (<span class="keywordtype">size_t</span> d, <span class="keyword">const</span> std::vector<float> &trained):</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  QuantizerUniform<Codec> (d, trained) {}</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span> </div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordtype">float</span> compute_distance_L2(SimilarityL2& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordflow">return</span> compute_distance_8(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  }</div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span> </div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordtype">float</span> compute_distance_IP(SimilarityIP& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">return</span> compute_distance_8(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  }</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span> };</div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span> </div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span> </div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="keyword">template</span><<span class="keyword">class</span> Codec></div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span> <span class="keyword">struct </span>QuantizerNonUniform: Quantizer {</div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> d;</div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *vmin, *vdiff;</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>  QuantizerNonUniform(<span class="keywordtype">size_t</span> d, <span class="keyword">const</span> std::vector<float> &trained):</div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  d(d), vmin(trained.data()), vdiff(trained.data() + d) {}</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>  <span class="keywordtype">void</span> encode_vector(<span class="keyword">const</span> <span class="keywordtype">float</span>* x, uint8_t* code)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d; i++) {</div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordtype">float</span> xi = (x[i] - vmin[i]) / vdiff[i];</div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (xi < 0)</div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  xi = 0;</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">if</span> (xi > 1.0)</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  xi = 1.0;</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  Codec::encode_component(xi, code, i);</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="keywordtype">void</span> decode_vector(<span class="keyword">const</span> uint8_t* code, <span class="keywordtype">float</span>* x)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d; i++) {</div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="keywordtype">float</span> xi = Codec::decode_component(code, i);</div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  x[i] = vmin[i] + xi * vdiff[i];</div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  }</div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keywordtype">float</span> reconstruct_component (<span class="keyword">const</span> uint8_t * code, <span class="keywordtype">int</span> i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordtype">float</span> xi = Codec::decode_component (code, i);</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">return</span> vmin[i] + xi * vdiff[i];</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  }</div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="preprocessor"></span> __m256 reconstruct_8_components (<span class="keyword">const</span> uint8_t * code, <span class="keywordtype">int</span> i)<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>  __m256 xi = Codec::decode_8_components (code, i);</div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">return</span> _mm256_loadu_ps(vmin + i) + xi * _mm256_loadu_ps (vdiff + i);</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  }</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordtype">float</span> compute_distance_L2(SimilarityL2& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <span class="keywordflow">return</span> compute_distance(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  }</div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span> </div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordtype">float</span> compute_distance_IP(SimilarityIP& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordflow">return</span> compute_distance(*<span class="keyword">this</span>, sim, codes);</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> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span> <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">class</span> Codec></div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="keyword">struct </span>QuantizerNonUniform8: QuantizerNonUniform<Codec> {</div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span> </div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  QuantizerNonUniform8 (<span class="keywordtype">size_t</span> d, <span class="keyword">const</span> std::vector<float> &trained):</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  QuantizerNonUniform<Codec> (d, trained) {}</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span> </div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordtype">float</span> compute_distance_L2(SimilarityL2& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">return</span> compute_distance_8(*<span class="keyword">this</span>, sim, codes);</div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  }</div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span> </div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">float</span> compute_distance_IP(SimilarityIP& sim, <span class="keyword">const</span> uint8_t* codes)<span class="keyword"></span></div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">return</span> compute_distance_8(*<span class="keyword">this</span>, sim, codes);</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> };</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span> </div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span> </div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> </div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span> Quantizer *select_quantizer (</div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  QuantizerType qtype,</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="keywordtype">size_t</span> d, <span class="keyword">const</span> std::vector<float> & trained)</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> <span class="preprocessor">#ifdef USE_AVX</span></div>
|
|
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> <span class="preprocessor"></span> <span class="keywordflow">if</span> (d % 8 == 0) {</div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">switch</span>(qtype) {</div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c">ScalarQuantizer::QT_8bit</a>:</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerNonUniform8<Codec8bit>(d, trained);</div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b">ScalarQuantizer::QT_4bit</a>:</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerNonUniform8<Codec4bit>(d, trained);</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a">ScalarQuantizer::QT_8bit_uniform</a>:</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerUniform8<Codec8bit>(d, trained);</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">case</span> ScalarQuantizer::QT_4bit_uniform:</div>
|
|
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerUniform8<Codec4bit>(d, trained);</div>
|
|
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  }</div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  } <span class="keywordflow">else</span></div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordflow">switch</span>(qtype) {</div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c">ScalarQuantizer::QT_8bit</a>:</div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerNonUniform<Codec8bit>(d, trained);</div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b">ScalarQuantizer::QT_4bit</a>:</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerNonUniform<Codec4bit>(d, trained);</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a">ScalarQuantizer::QT_8bit_uniform</a>:</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerUniform<Codec8bit>(d, trained);</div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">case</span> ScalarQuantizer::QT_4bit_uniform:</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> QuantizerUniform<Codec4bit>(d, trained);</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>  FAISS_THROW_MSG (<span class="stringliteral">"unknown qtype"</span>);</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span> }</div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> Quantizer *select_quantizer (<span class="keyword">const</span> ScalarQuantizer &sq)</div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> {</div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordflow">return</span> select_quantizer (sq.qtype, sq.d, sq.trained);</div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span> }</div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span> </div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> } <span class="comment">// anonymous namespace</span></div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </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="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment"> * ScalarQuantizer implementation</span></div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="comment"> ********************************************************************/</span></div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> </div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> ScalarQuantizer::ScalarQuantizer</div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  (<span class="keywordtype">size_t</span> d, QuantizerType qtype):</div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  qtype (qtype), rangestat(RS_minmax), rangestat_arg(0), d (d)</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">switch</span> (qtype) {</div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">case</span> QT_8bit: <span class="keywordflow">case</span> QT_8bit_uniform:</div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  code_size = <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordflow">case</span> QT_4bit: <span class="keywordflow">case</span> QT_4bit_uniform:</div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  code_size = (d + 1) / 2;</div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  }</div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span> </div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> }</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> ScalarQuantizer::ScalarQuantizer ():</div>
|
|
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  qtype(QT_8bit),</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  rangestat(RS_minmax), rangestat_arg(0), d (0), code_size(0)</div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span> {}</div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span> </div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="keywordtype">void</span> ScalarQuantizer::train (<span class="keywordtype">size_t</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</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="keywordtype">int</span> bit_per_dim =</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  qtype == QT_4bit_uniform ? 4 :</div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  qtype == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b">QT_4bit</a> ? 4 :</div>
|
|
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  qtype == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a">QT_8bit_uniform</a> ? 8 :</div>
|
|
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  qtype == <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c">QT_8bit</a> ? 8 : -1;</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span> </div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">switch</span> (qtype) {</div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">case</span> QT_4bit_uniform: <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a">QT_8bit_uniform</a>:</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  train_Uniform (rangestat, rangestat_arg,</div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  n * d, 1 << bit_per_dim, x, trained);</div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b">QT_4bit</a>: <span class="keywordflow">case</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c">QT_8bit</a>:</div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  train_NonUniform (rangestat, rangestat_arg,</div>
|
|
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  n, d, 1 << bit_per_dim, x, trained);</div>
|
|
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  }</div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> }</div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span> </div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"><a class="line" href="structfaiss_1_1ScalarQuantizer.html#a2bccf276565c4f80fed3d0c715c58816"> 674</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a2bccf276565c4f80fed3d0c715c58816">ScalarQuantizer::compute_codes</a> (<span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  uint8_t * codes,</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="keywordtype">size_t</span> n)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  Quantizer *squant = select_quantizer (*<span class="keyword">this</span>);</div>
|
|
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del(squant);</div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</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="l00682"></a><span class="lineno"> 682</span>  squant->encode_vector (x + i * d, codes + i * <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a647b8774e4cd8ca5623a194f5c7f8a33">code_size</a>);</div>
|
|
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span> }</div>
|
|
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div>
|
|
<div class="line"><a name="l00685"></a><span class="lineno"><a class="line" href="structfaiss_1_1ScalarQuantizer.html#a7ab9e9158da1777d45e6f9bf73bfd489"> 685</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a7ab9e9158da1777d45e6f9bf73bfd489">ScalarQuantizer::decode</a> (<span class="keyword">const</span> uint8_t *codes, <span class="keywordtype">float</span> *x, <span class="keywordtype">size_t</span> n)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  Quantizer *squant = select_quantizer (*<span class="keyword">this</span>);</div>
|
|
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del(squant);</div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</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="l00691"></a><span class="lineno"> 691</span>  squant->decode_vector (codes + i * <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a647b8774e4cd8ca5623a194f5c7f8a33">code_size</a>, x + i * d);</div>
|
|
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span> }</div>
|
|
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span> </div>
|
|
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="comment"> * IndexScalarQuantizer implementation</span></div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment"> ********************************************************************/</span></div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span> </div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> IndexScalarQuantizer::IndexScalarQuantizer</div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#a474ad5a50eb2e9f0d79f869855c57223"> 699</a></span>  (<span class="keywordtype">int</span> d, <a class="code" href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952e">ScalarQuantizer::QuantizerType</a> qtype,</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <a class="code" href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">MetricType</a> metric):</div>
|
|
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a>(d, metric),</div>
|
|
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  sq (d, qtype)</div>
|
|
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span> {</div>
|
|
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  is_trained = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  code_size = sq.code_size;</div>
|
|
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span> }</div>
|
|
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div>
|
|
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> </div>
|
|
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span> IndexScalarQuantizer::IndexScalarQuantizer ():</div>
|
|
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html">IndexScalarQuantizer</a>(0, <a class="code" href="structfaiss_1_1ScalarQuantizer.html">ScalarQuantizer</a>::QT_8bit)</div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> {}</div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#a300647e9cdac9acd160f2c55c610056b"> 713</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a300647e9cdac9acd160f2c55c610056b">IndexScalarQuantizer::train</a>(idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x)</div>
|
|
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span> {</div>
|
|
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>.train(n, x);</div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> }</div>
|
|
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span> </div>
|
|
<div class="line"><a name="l00719"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#ad49602f9ecfcaa2ec8737a449b69ccd7"> 719</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#ad49602f9ecfcaa2ec8737a449b69ccd7">IndexScalarQuantizer::add</a>(idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x)</div>
|
|
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> {</div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>.resize ((n + <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>) * code_size);</div>
|
|
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>.<a class="code" href="structfaiss_1_1ScalarQuantizer.html#a2bccf276565c4f80fed3d0c715c58816">compute_codes</a> (x, &<a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>[<a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * code_size], n);</div>
|
|
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> += n;</div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span> }</div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div>
|
|
<div class="line"><a name="l00727"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#abf24732c29106bb808148c3d30599662"> 727</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#abf24732c29106bb808148c3d30599662">IndexScalarQuantizer::search</a>(</div>
|
|
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  idx_t n,</div>
|
|
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keyword">const</span> <span class="keywordtype">float</span>* x,</div>
|
|
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  idx_t k,</div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="keywordtype">float</span>* distances,</div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  idx_t* labels)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  Quantizer *squant = select_quantizer (<a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>);</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del(squant);</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span> </div>
|
|
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00740"></a><span class="lineno"> 740</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="l00741"></a><span class="lineno"> 741</span>  idx_t *idxi = labels + i * k;</div>
|
|
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordtype">float</span> *simi = distances + i * k;</div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  minheap_heapify (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span> </div>
|
|
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  SimilarityIP sim(x + i * d, 0);</div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keyword">const</span> uint8_t *ci = <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>.data ();</div>
|
|
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span> </div>
|
|
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>; j++) {</div>
|
|
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keywordtype">float</span> accu = squant->compute_distance_IP(sim, ci);</div>
|
|
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div>
|
|
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">if</span> (accu > simi [0]) {</div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  minheap_pop (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  minheap_push (k, simi, idxi, accu, j);</div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  }</div>
|
|
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  ci += code_size;</div>
|
|
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  }</div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  minheap_reorder (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00761"></a><span class="lineno"> 761</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="l00762"></a><span class="lineno"> 762</span>  idx_t *idxi = labels + i * k;</div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordtype">float</span> *simi = distances + i * k;</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  maxheap_heapify (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span> </div>
|
|
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  SimilarityL2 sim(x + i * d);</div>
|
|
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keyword">const</span> uint8_t *ci = <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>.data ();</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span> </div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>; j++) {</div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordtype">float</span> accu = squant->compute_distance_L2(sim, ci);</div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> </div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keywordflow">if</span> (accu < simi [0]) {</div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  maxheap_pop (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  maxheap_push (k, simi, idxi, accu, j);</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  }</div>
|
|
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  ci += code_size;</div>
|
|
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  }</div>
|
|
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  maxheap_reorder (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div>
|
|
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  }</div>
|
|
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span> </div>
|
|
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span> }</div>
|
|
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span> </div>
|
|
<div class="line"><a name="l00784"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#af0d6b901a2a02fff34e5c7c1ea5b8d55"> 784</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#af0d6b901a2a02fff34e5c7c1ea5b8d55">IndexScalarQuantizer::reset</a>()</div>
|
|
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span> {</div>
|
|
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>.clear();</div>
|
|
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = 0;</div>
|
|
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span> }</div>
|
|
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div>
|
|
<div class="line"><a name="l00790"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#a06e6935b75f0b209f65fffa1c9e1477c"> 790</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a06e6935b75f0b209f65fffa1c9e1477c">IndexScalarQuantizer::reconstruct_n</a>(</div>
|
|
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  idx_t i0, idx_t ni, <span class="keywordtype">float</span>* recons)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  Quantizer *squant = select_quantizer (<a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>);</div>
|
|
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del (squant);</div>
|
|
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ni; i++) {</div>
|
|
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  squant->decode_vector(&<a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>[(i + i0) * code_size], recons + i * d);</div>
|
|
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  }</div>
|
|
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span> }</div>
|
|
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span> </div>
|
|
<div class="line"><a name="l00800"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexScalarQuantizer.html#a8fb8680f64465d643d96119da58099f3"> 800</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a8fb8680f64465d643d96119da58099f3">IndexScalarQuantizer::reconstruct</a>(idx_t key, <span class="keywordtype">float</span>* recons)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a06e6935b75f0b209f65fffa1c9e1477c">reconstruct_n</a>(key, 1, recons);</div>
|
|
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span> }</div>
|
|
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span> </div>
|
|
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span> </div>
|
|
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span> <span class="comment">/*******************************************************************</span></div>
|
|
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span> <span class="comment"> * IndexIVFScalarQuantizer implementation</span></div>
|
|
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="comment"> ********************************************************************/</span></div>
|
|
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span> </div>
|
|
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span> IndexIVFScalarQuantizer::IndexIVFScalarQuantizer</div>
|
|
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  (<a class="code" href="structfaiss_1_1Index.html">Index</a> *quantizer, <span class="keywordtype">size_t</span> d, <span class="keywordtype">size_t</span> nlist,</div>
|
|
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  QuantizerType qtype, <a class="code" href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">MetricType</a> metric):</div>
|
|
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <a class="code" href="structfaiss_1_1IndexIVF.html">IndexIVF</a> (quantizer, d, nlist, metric),</div>
|
|
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  sq (d, qtype)</div>
|
|
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span> {</div>
|
|
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  code_size = <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>.<a class="code" href="structfaiss_1_1ScalarQuantizer.html#a647b8774e4cd8ca5623a194f5c7f8a33">code_size</a>;</div>
|
|
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span> }</div>
|
|
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span> </div>
|
|
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span> IndexIVFScalarQuantizer::IndexIVFScalarQuantizer ():</div>
|
|
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  IndexIVF ()</div>
|
|
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span> {}</div>
|
|
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span> </div>
|
|
<div class="line"><a name="l00824"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFScalarQuantizer.html#ac05d7fbfed59c85d1cf8ae526d279744"> 824</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html#ac05d7fbfed59c85d1cf8ae526d279744">IndexIVFScalarQuantizer::train_residual</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</div>
|
|
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span> {</div>
|
|
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordtype">long</span> * idx = <span class="keyword">new</span> <span class="keywordtype">long</span> [n];</div>
|
|
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<long></a> del (idx);</div>
|
|
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a> (n, x, idx);</div>
|
|
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <span class="keywordtype">float</span> *residuals = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del2 (residuals);</div>
|
|
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span> </div>
|
|
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (idx_t i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">compute_residual</a> (x + i * d, residuals + i * d, idx[i]);</div>
|
|
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div>
|
|
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div>
|
|
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  sq.train (n, residuals);</div>
|
|
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span> </div>
|
|
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span> }</div>
|
|
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span> </div>
|
|
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span> </div>
|
|
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html#afa95c17787b7e3dbed9309b440d4d748">IndexIVFScalarQuantizer::add_with_ids</a></div>
|
|
<div class="line"><a name="l00843"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFScalarQuantizer.html#afa95c17787b7e3dbed9309b440d4d748"> 843</a></span>  (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x, <span class="keyword">const</span> <span class="keywordtype">long</span> *xids)</div>
|
|
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span> {</div>
|
|
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  FAISS_THROW_IF_NOT (is_trained);</div>
|
|
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="keywordtype">long</span> * idx = <span class="keyword">new</span> <span class="keywordtype">long</span> [n];</div>
|
|
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<long></a> del (idx);</div>
|
|
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  quantizer->assign (n, x, idx);</div>
|
|
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keywordtype">size_t</span> nadd = 0;</div>
|
|
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  Quantizer *squant = select_quantizer (sq);</div>
|
|
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del2 (squant);</div>
|
|
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span> </div>
|
|
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span> <span class="preprocessor">#pragma omp parallel reduction(+: nadd)</span></div>
|
|
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span> <span class="preprocessor"></span> {</div>
|
|
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  std::vector<float> residual (d);</div>
|
|
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keywordtype">int</span> nt = omp_get_num_threads();</div>
|
|
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordtype">int</span> rank = omp_get_thread_num();</div>
|
|
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span> </div>
|
|
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// each thread takes care of a subset of lists</span></div>
|
|
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span> </div>
|
|
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keywordtype">long</span> list_no = idx [i];</div>
|
|
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="keywordflow">if</span> (list_no >= 0 && list_no % nt == rank) {</div>
|
|
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = xids ? xids[i] : ntotal + i;</div>
|
|
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span> </div>
|
|
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  assert (list_no < nlist);</div>
|
|
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span> </div>
|
|
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  ids[list_no].push_back (<span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  nadd++;</div>
|
|
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  quantizer->compute_residual (</div>
|
|
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  x + i * d, residual.data(), list_no);</div>
|
|
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span> </div>
|
|
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordtype">size_t</span> cur_size = codes[list_no].size();</div>
|
|
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  codes[list_no].resize (cur_size + code_size);</div>
|
|
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span> </div>
|
|
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  squant->encode_vector (residual.data(),</div>
|
|
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  codes[list_no].data() + cur_size);</div>
|
|
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  }</div>
|
|
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div>
|
|
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  }</div>
|
|
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  ntotal += nadd;</div>
|
|
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span> }</div>
|
|
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span> </div>
|
|
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div>
|
|
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="keywordtype">void</span> search_with_probes_ip (<span class="keyword">const</span> <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html">IndexIVFScalarQuantizer</a> & index,</div>
|
|
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *x,</div>
|
|
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">const</span> idx_t *cent_ids, <span class="keyword">const</span> <span class="keywordtype">float</span> *cent_dis,</div>
|
|
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keyword">const</span> Quantizer & quant,</div>
|
|
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordtype">int</span> k, <span class="keywordtype">float</span> *simi, idx_t *idxi,</div>
|
|
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span> {</div>
|
|
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="keywordtype">int</span> nprobe = index.<a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordtype">size_t</span> code_size = index.<a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>;</div>
|
|
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keywordtype">size_t</span> d = index.<a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>;</div>
|
|
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  std::vector<float> decoded(d);</div>
|
|
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  minheap_heapify (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nprobe; i++) {</div>
|
|
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  idx_t list_no = cent_ids[i];</div>
|
|
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keywordflow">if</span> (list_no < 0) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keywordtype">float</span> accu0 = cent_dis[i];</div>
|
|
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span> </div>
|
|
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keyword">const</span> std::vector<idx_t> & ids = index.<a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no];</div>
|
|
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keyword">const</span> uint8_t* codes = index.codes[list_no].data();</div>
|
|
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span> </div>
|
|
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  SimilarityIP sim(x, accu0);</div>
|
|
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span> </div>
|
|
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < ids.size(); j++) {</div>
|
|
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span> </div>
|
|
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keywordtype">float</span> accu = quant.compute_distance_IP(sim, codes);</div>
|
|
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span> </div>
|
|
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">if</span> (accu > simi [0]) {</div>
|
|
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  minheap_pop (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (list_no << 32 | j) : ids[j];</div>
|
|
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  minheap_push (k, simi, idxi, accu, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  }</div>
|
|
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  codes += code_size;</div>
|
|
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  }</div>
|
|
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span> </div>
|
|
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  }</div>
|
|
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  minheap_reorder (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span> }</div>
|
|
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span> </div>
|
|
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span> <span class="keywordtype">void</span> search_with_probes_L2 (<span class="keyword">const</span> IndexIVFScalarQuantizer & index,</div>
|
|
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *x_in,</div>
|
|
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keyword">const</span> idx_t *cent_ids,</div>
|
|
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="keyword">const</span> Index *quantizer,</div>
|
|
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="keyword">const</span> Quantizer & quant,</div>
|
|
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordtype">int</span> k, <span class="keywordtype">float</span> *simi, idx_t *idxi,</div>
|
|
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="keywordtype">bool</span> store_pairs)</div>
|
|
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span> {</div>
|
|
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordtype">int</span> nprobe = index.nprobe;</div>
|
|
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordtype">size_t</span> code_size = index.code_size;</div>
|
|
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordtype">size_t</span> d = index.d;</div>
|
|
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  std::vector<float> decoded(d), x(d);</div>
|
|
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  maxheap_heapify (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nprobe; i++) {</div>
|
|
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  idx_t list_no = cent_ids[i];</div>
|
|
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <span class="keywordflow">if</span> (list_no < 0) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span> </div>
|
|
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <span class="keyword">const</span> std::vector<idx_t> & ids = index.ids[list_no];</div>
|
|
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keyword">const</span> uint8_t* codes = index.codes[list_no].data();</div>
|
|
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span> </div>
|
|
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="comment">// shift of x_in wrt centroid</span></div>
|
|
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  quantizer->compute_residual (x_in, x.data(), list_no);</div>
|
|
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span> </div>
|
|
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  SimilarityL2 sim(x.data());</div>
|
|
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span> </div>
|
|
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < ids.size(); j++) {</div>
|
|
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> </div>
|
|
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordtype">float</span> dis = quant.compute_distance_L2 (sim, codes);</div>
|
|
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span> </div>
|
|
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordflow">if</span> (dis < simi [0]) {</div>
|
|
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  maxheap_pop (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordtype">long</span> <span class="keywordtype">id</span> = store_pairs ? (list_no << 32 | j) : ids[j];</div>
|
|
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  maxheap_push (k, simi, idxi, dis, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  }</div>
|
|
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  codes += code_size;</div>
|
|
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  }</div>
|
|
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  }</div>
|
|
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  maxheap_reorder (k, simi, idxi);</div>
|
|
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span> }</div>
|
|
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span> </div>
|
|
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span> } <span class="comment">// anonymous namespace</span></div>
|
|
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span> </div>
|
|
<div class="line"><a name="l00966"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexIVFScalarQuantizer.html#a341e473a62adcb03e07e53f67c1a7358"> 966</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html#a341e473a62adcb03e07e53f67c1a7358">IndexIVFScalarQuantizer::search_preassigned</a> (</div>
|
|
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, idx_t k,</div>
|
|
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  <span class="keyword">const</span> idx_t *idx,</div>
|
|
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *dis,</div>
|
|
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  <span class="keywordtype">float</span> *distances, idx_t *labels,</div>
|
|
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordtype">bool</span> store_pairs)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> </div>
|
|
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  Quantizer *squant = select_quantizer (sq);</div>
|
|
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<Quantizer></a> del(squant);</div>
|
|
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span> </div>
|
|
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> == METRIC_INNER_PRODUCT) {</div>
|
|
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00980"></a><span class="lineno"> 980</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="l00981"></a><span class="lineno"> 981</span>  search_with_probes_ip (*<span class="keyword">this</span>, x + i * d,</div>
|
|
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  idx + i * nprobe, dis + i * nprobe, *squant,</div>
|
|
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  k, distances + i * k, labels + i * k,</div>
|
|
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  store_pairs);</div>
|
|
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  }</div>
|
|
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00988"></a><span class="lineno"> 988</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="l00989"></a><span class="lineno"> 989</span>  search_with_probes_L2 (*<span class="keyword">this</span>, x + i * d,</div>
|
|
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  idx + i * nprobe, quantizer, *squant,</div>
|
|
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  k, distances + i * k, labels + i * k,</div>
|
|
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  store_pairs);</div>
|
|
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  }</div>
|
|
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  }</div>
|
|
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span> </div>
|
|
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span> }</div>
|
|
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span> </div>
|
|
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span> </div>
|
|
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span> }</div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00045">IndexIVF.h:45</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a647b8774e4cd8ca5623a194f5c7f8a33"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a647b8774e4cd8ca5623a194f5c7f8a33">faiss::ScalarQuantizer::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">bytes per vector </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00060">IndexScalarQuantizer.h:60</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a1201dbd1611fa5c10782ade5d0e4952e"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952e">faiss::ScalarQuantizer::QuantizerType</a></div><div class="ttdeci">QuantizerType</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00032">IndexScalarQuantizer.h:32</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_abf24732c29106bb808148c3d30599662"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#abf24732c29106bb808148c3d30599662">faiss::IndexScalarQuantizer::search</a></div><div class="ttdeci">void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00727">IndexScalarQuantizer.cpp:727</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFScalarQuantizer_html_ac05d7fbfed59c85d1cf8ae526d279744"><div class="ttname"><a href="structfaiss_1_1IndexIVFScalarQuantizer.html#ac05d7fbfed59c85d1cf8ae526d279744">faiss::IndexIVFScalarQuantizer::train_residual</a></div><div class="ttdeci">void train_residual(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00824">IndexScalarQuantizer.cpp:824</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a867ad0000e4ccfd40bbb1e01e7882d06ab0709ff74c1b882b64a7fdd7ca5df9a3"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06ab0709ff74c1b882b64a7fdd7ca5df9a3">faiss::ScalarQuantizer::RS_optim</a></div><div class="ttdoc">alternate optimization of reconstruction error </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00050">IndexScalarQuantizer.h:50</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html">faiss::IndexScalarQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00082">IndexScalarQuantizer.h:82</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea029f07a15ea64e7e73daaf9633ac429a">faiss::ScalarQuantizer::QT_8bit_uniform</a></div><div class="ttdoc">same, shared range for all dimensions </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00035">IndexScalarQuantizer.h:35</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_ad49602f9ecfcaa2ec8737a449b69ccd7"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#ad49602f9ecfcaa2ec8737a449b69ccd7">faiss::IndexScalarQuantizer::add</a></div><div class="ttdeci">void add(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00719">IndexScalarQuantizer.cpp:719</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_affed235eadf27a13d753ee4d33a1dc58"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">faiss::IndexIVF::nprobe</a></div><div class="ttdeci">size_t nprobe</div><div class="ttdoc">number of probes at query time </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00047">IndexIVF.h:47</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952eacd3d1bd71533a7bc52149e4b3d1db13b">faiss::ScalarQuantizer::QT_4bit</a></div><div class="ttdoc">4 bits per component </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00034">IndexScalarQuantizer.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c"><div class="ttname"><a href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">faiss::Index::assign</a></div><div class="ttdeci">void assign(idx_t n, const float *x, idx_t *labels, idx_t k=1)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00023">Index.cpp:23</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_af0d6b901a2a02fff34e5c7c1ea5b8d55"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#af0d6b901a2a02fff34e5c7c1ea5b8d55">faiss::IndexScalarQuantizer::reset</a></div><div class="ttdeci">void reset() override</div><div class="ttdoc">removes all elements from the database. </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00784">IndexScalarQuantizer.cpp:784</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScopeDeleter1_html"><div class="ttname"><a href="structfaiss_1_1ScopeDeleter1.html">faiss::ScopeDeleter1</a></div><div class="ttdef"><b>Definition:</b> <a href="FaissException_8h_source.html#l00052">FaissException.h:52</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_1ScalarQuantizer_html"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html">faiss::ScalarQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00030">IndexScalarQuantizer.h:30</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_af16d325f5bef22b2e5f90ceea796e80d"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">faiss::IndexIVF::ids</a></div><div class="ttdeci">std::vector< std::vector< long > > ids</div><div class="ttdoc">Inverted lists for indexes. </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00062">IndexIVF.h:62</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFScalarQuantizer_html_afa95c17787b7e3dbed9309b440d4d748"><div class="ttname"><a href="structfaiss_1_1IndexIVFScalarQuantizer.html#afa95c17787b7e3dbed9309b440d4d748">faiss::IndexIVFScalarQuantizer::add_with_ids</a></div><div class="ttdeci">void add_with_ids(idx_t n, const float *x, const long *xids) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00843">IndexScalarQuantizer.cpp:843</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a2a002388d2c081c2dbab8508dcefe73d"><div class="ttname"><a href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">faiss::Index::d</a></div><div class="ttdeci">int d</div><div class="ttdoc">vector dimension </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00064">Index.h:64</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a4b40cc7a70dff41196a3b8769586667a"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">faiss::IndexIVF::quantizer</a></div><div class="ttdeci">Index * quantizer</div><div class="ttdoc">quantizer that maps vectors to inverted lists </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00049">IndexIVF.h:49</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_a861fa059f9d4ced9147e08193a2be9be"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">faiss::IndexScalarQuantizer::codes</a></div><div class="ttdeci">std::vector< uint8_t > codes</div><div class="ttdoc">Codes. Size ntotal * pq.code_size. </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00087">IndexScalarQuantizer.h:87</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_a71381f74754d8a54812e80af46a2a83a"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">faiss::IndexScalarQuantizer::sq</a></div><div class="ttdeci">ScalarQuantizer sq</div><div class="ttdoc">Used to encode the vectors. </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00084">IndexScalarQuantizer.h:84</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a040c6aed1f224f3ea7bf58eebc0c31a4"><div class="ttname"><a href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">faiss::Index::idx_t</a></div><div class="ttdeci">long idx_t</div><div class="ttdoc">all indices are this type </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00062">Index.h:62</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a6970683faa021b7a6f1a0865c0d4eccd"><div class="ttname"><a href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">faiss::Index::ntotal</a></div><div class="ttdeci">idx_t ntotal</div><div class="ttdoc">total nb of indexed vectors </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00065">Index.h:65</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a867ad0000e4ccfd40bbb1e01e7882d06"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06">faiss::ScalarQuantizer::RangeStat</a></div><div class="ttdeci">RangeStat</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00046">IndexScalarQuantizer.h:46</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFScalarQuantizer_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFScalarQuantizer.html">faiss::IndexIVFScalarQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00129">IndexScalarQuantizer.h:129</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a867ad0000e4ccfd40bbb1e01e7882d06ae41cccec3a7acbcb3a47fa63c2bfb4c8"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06ae41cccec3a7acbcb3a47fa63c2bfb4c8">faiss::ScalarQuantizer::RS_quantiles</a></div><div class="ttdoc">[Q(rs), Q(1-rs)] </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00049">IndexScalarQuantizer.h:49</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFScalarQuantizer_html_a341e473a62adcb03e07e53f67c1a7358"><div class="ttname"><a href="structfaiss_1_1IndexIVFScalarQuantizer.html#a341e473a62adcb03e07e53f67c1a7358">faiss::IndexIVFScalarQuantizer::search_preassigned</a></div><div class="ttdeci">void search_preassigned(idx_t n, const float *x, idx_t k, const idx_t *assign, const float *centroid_dis, float *distances, idx_t *labels, bool store_pairs) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00966">IndexScalarQuantizer.cpp:966</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a867ad0000e4ccfd40bbb1e01e7882d06afb4b9f4ee9003fa0193e6de69632f7a0"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06afb4b9f4ee9003fa0193e6de69632f7a0">faiss::ScalarQuantizer::RS_meanstd</a></div><div class="ttdoc">[mean - std * rs, mean + std * rs] </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00048">IndexScalarQuantizer.h:48</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a7ab9e9158da1777d45e6f9bf73bfd489"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a7ab9e9158da1777d45e6f9bf73bfd489">faiss::ScalarQuantizer::decode</a></div><div class="ttdeci">void decode(const uint8_t *code, float *x, size_t n) 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="IndexScalarQuantizer_8cpp_source.html#l00685">IndexScalarQuantizer.cpp:685</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a2bccf276565c4f80fed3d0c715c58816"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a2bccf276565c4f80fed3d0c715c58816">faiss::ScalarQuantizer::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="IndexScalarQuantizer_8cpp_source.html#l00674">IndexScalarQuantizer.cpp:674</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a8e18f641854b2bde83ecff0a2f9a6f4e"><div class="ttname"><a href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">faiss::Index::metric_type</a></div><div class="ttdeci">MetricType metric_type</div><div class="ttdoc">type of metric this index uses for search </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00072">Index.h:72</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a1201dbd1611fa5c10782ade5d0e4952ea1650389e3efa052ff60177d502328a2c">faiss::ScalarQuantizer::QT_8bit</a></div><div class="ttdoc">8 bits per component </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00033">IndexScalarQuantizer.h:33</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html"><div class="ttname"><a href="structfaiss_1_1Index.html">faiss::Index</a></div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00060">Index.h:60</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_a06e6935b75f0b209f65fffa1c9e1477c"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#a06e6935b75f0b209f65fffa1c9e1477c">faiss::IndexScalarQuantizer::reconstruct_n</a></div><div class="ttdeci">void reconstruct_n(idx_t i0, idx_t ni, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00790">IndexScalarQuantizer.cpp:790</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_a8fb8680f64465d643d96119da58099f3"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#a8fb8680f64465d643d96119da58099f3">faiss::IndexScalarQuantizer::reconstruct</a></div><div class="ttdeci">void reconstruct(idx_t key, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00800">IndexScalarQuantizer.cpp:800</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScalarQuantizer_html_a867ad0000e4ccfd40bbb1e01e7882d06aa52f2f14616c61c04baf6323d43588fd"><div class="ttname"><a href="structfaiss_1_1ScalarQuantizer.html#a867ad0000e4ccfd40bbb1e01e7882d06aa52f2f14616c61c04baf6323d43588fd">faiss::ScalarQuantizer::RS_minmax</a></div><div class="ttdoc">[min - rs*(max-min), max + rs*(max-min)] </div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8h_source.html#l00047">IndexScalarQuantizer.h:47</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a6e92732617c4dbe364e7678dd8773a7f"><div class="ttname"><a href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">faiss::Index::is_trained</a></div><div class="ttdeci">bool is_trained</div><div class="ttdoc">set if the Index does not require training, or if training is done already </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00069">Index.h:69</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aaae77608bbda70b1098897e9167a82f9"><div class="ttname"><a href="structfaiss_1_1Index.html#aaae77608bbda70b1098897e9167a82f9">faiss::Index::compute_residual</a></div><div class="ttdeci">void compute_residual(const float *x, float *residual, idx_t key) const </div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00056">Index.cpp:56</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexScalarQuantizer_html_a300647e9cdac9acd160f2c55c610056b"><div class="ttname"><a href="structfaiss_1_1IndexScalarQuantizer.html#a300647e9cdac9acd160f2c55c610056b">faiss::IndexScalarQuantizer::train</a></div><div class="ttdeci">void train(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="IndexScalarQuantizer_8cpp_source.html#l00713">IndexScalarQuantizer.cpp:713</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a46d1aeddb60643c5b3f096147c3e028f"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">faiss::IndexIVF::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">code size per vector in bytes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00064">IndexIVF.h:64</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_afd12191c638da74760ff397cf319752c"><div class="ttname"><a href="namespacefaiss.html#afd12191c638da74760ff397cf319752c">faiss::MetricType</a></div><div class="ttdeci">MetricType</div><div class="ttdoc">Some algorithms support both an inner product version and a L2 search version. </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00043">Index.h:43</a></div></div>
|
|
</div><!-- 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>
|