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
384 lines
47 KiB
HTML
384 lines
47 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/tests/test_pairs_decoding.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>
|
|
<!-- 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 id="nav-path" class="navpath">
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html">tests</a></li> </ul>
|
|
</div>
|
|
</div><!-- top -->
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">test_pairs_decoding.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 <cstdio></span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <cstdlib></span></div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <memory></span></div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include <vector></span></div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div>
|
|
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include <gtest/gtest.h></span></div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <faiss/IndexIVF.h></span></div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <faiss/AutoTune.h></span></div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <faiss/VectorTransform.h></span></div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"> * The functions to test, that can be useful in FANN</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> </div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">/* Returns the cluster the embeddings belong to.</span></div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> * @param index Index, which should be an IVF index</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * (otherwise there are no clusters)</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * @param embeddings object descriptors for which the centroids should be found,</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> * size num_objects * d</span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> * @param cebtroid_ids</span></div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment"> * cluster id each object belongs to, size num_objects</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="keywordtype">void</span> Search_centroid(<a class="code" href="structfaiss_1_1Index.html">faiss::Index</a> *index,</div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="keyword">const</span> <span class="keywordtype">float</span>* embeddings, <span class="keywordtype">int</span> num_objects,</div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  int64_t* centroid_ids)</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="keyword">const</span> <span class="keywordtype">float</span> *x = embeddings;</div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  std::unique_ptr<float> del;</div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">if</span> (<span class="keyword">auto</span> index_pre = dynamic_cast<faiss::IndexPreTransform*>(index)) {</div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  x = index_pre->apply_chain(num_objects, x);</div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  del.reset((<span class="keywordtype">float</span>*)x);</div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  index = index_pre->index;</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>  <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>* index_ivf = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>*<span class="keyword">></span>(index);</div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  assert(index_ivf);</div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  index_ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#a8bc5d8d1cd0dd7b34b3c98a9f76b4a9c">assign</a>(num_objects, x, centroid_ids);</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> </div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment">/* Returns the cluster the embeddings belong to.</span></div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> * @param index Index, which should be an IVF index</span></div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> * (otherwise there are no clusters)</span></div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> * @param query_centroid_ids</span></div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"> * centroid ids corresponding to the query vectors (size n)</span></div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment"> * @param result_centroid_ids</span></div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment"> * centroid ids corresponding to the results (size n * k)</span></div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> * other arguments are the same as the standard search function</span></div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">void</span> search_and_retrun_centroids(<a class="code" href="structfaiss_1_1Index.html">faiss::Index</a> *index,</div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordtype">size_t</span> n,</div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keyword">const</span> <span class="keywordtype">float</span>* xin,</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keywordtype">long</span> k,</div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordtype">float</span> *distances,</div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  int64_t* labels,</div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  int64_t* query_centroid_ids,</div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  int64_t* result_centroid_ids)</div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> {</div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *x = xin;</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  std::unique_ptr<float> del;</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordflow">if</span> (<span class="keyword">auto</span> index_pre = dynamic_cast<faiss::IndexPreTransform*>(index)) {</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  x = index_pre->apply_chain(n, x);</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  del.reset((<span class="keywordtype">float</span>*)x);</div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  index = index_pre->index;</div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  }</div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>* index_ivf = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>*<span class="keyword">></span>(index);</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  assert(index_ivf);</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keywordtype">size_t</span> nprobe = index_ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a>;</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  std::vector<long> cent_nos (n * nprobe);</div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  std::vector<float> cent_dis (n * nprobe);</div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  index_ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#a4b40cc7a70dff41196a3b8769586667a">quantizer</a>-><a class="code" href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">search</a>(</div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  n, x, nprobe, cent_dis.data(), cent_nos.data());</div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">if</span> (query_centroid_ids) {</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  query_centroid_ids[i] = cent_nos[i * nprobe];</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  }</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  index_ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#ae13fe9ff54a870ded3487c5c282ca566">search_preassigned</a> (n, x, k,</div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  cent_nos.data(), cent_dis.data(),</div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  distances, labels, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n * k; i++) {</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  int64_t label = labels[i];</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">if</span> (label < 0) {</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">if</span> (result_centroid_ids)</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  result_centroid_ids[i] = -1;</div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">long</span> list_no = label >> 32;</div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordtype">long</span> list_index = label & 0xffffffff;</div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="keywordflow">if</span> (result_centroid_ids)</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  result_centroid_ids[i] = list_no;</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  labels[i] = index_ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#af16d325f5bef22b2e5f90ceea796e80d">ids</a>[list_no][list_index];</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  }</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  }</div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> }</div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment"> * Test utils</span></div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> *************************************************************/</span></div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment">// return an IndexIVF that may be embedded in an IndexPreTransform</span></div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a> * get_IndexIVF(<a class="code" href="structfaiss_1_1Index.html">faiss::Index</a> *index) {</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">if</span> (<span class="keyword">auto</span> index_pre = dynamic_cast<faiss::IndexPreTransform*>(index)) {</div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  index = index_pre->index;</div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>* index_ivf = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a>*<span class="keyword">></span>(index);</div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">bool</span> t = index_ivf != <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  assert(index_ivf);</div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">return</span> index_ivf;</div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> }</div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> </div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment">// dimension of the vectors to index</span></div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="keywordtype">int</span> d = 64;</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="comment">// size of the database we plan to index</span></div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="keywordtype">size_t</span> nb = 8000;</div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">// nb of queries</span></div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="keywordtype">size_t</span> nq = 200;</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> std::vector<float> make_data(<span class="keywordtype">size_t</span> n)</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span> {</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  std::vector <float> database (n * d);</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n * d; i++) {</div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  database[i] = drand48();</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="keywordflow">return</span> database;</div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> }</div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> std::unique_ptr<faiss::Index> make_index(<span class="keyword">const</span> <span class="keywordtype">char</span> *index_type,</div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keyword">const</span> std::vector<float> & x) {</div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keyword">auto</span> index = std::unique_ptr<faiss::Index> (</div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <a class="code" href="namespacefaiss.html#a0c95ec47726f2ce3fb668dcb1f9a3317">faiss::index_factory</a>(d, index_type));</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  index-><a class="code" href="structfaiss_1_1Index.html#a1ffe916c958605c38b0b1bfad42485e4">train</a>(nb, x.data());</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  index-><a class="code" href="structfaiss_1_1Index.html#a1b5e9ac70adbce0897dd6c8276ad96f2">add</a>(nb, x.data());</div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keywordflow">return</span> index;</div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span> }</div>
|
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div>
|
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <span class="comment"> * Test functions for a given index type</span></div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="comment"> *************************************************************/</span></div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> </div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="keywordtype">bool</span> test_Search_centroid(<span class="keyword">const</span> <span class="keywordtype">char</span> *index_key) {</div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  std::vector<float> xb = make_data(nb); <span class="comment">// database vectors</span></div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keyword">auto</span> index = make_index(index_key, xb);</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="comment">/* First test: find the centroids associated to the database</span></div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="comment"> vectors and make sure that each vector does indeed appear in</span></div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="comment"> the inverted list corresponding to its centroid */</span></div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  std::vector<int64_t> centroid_ids (nb);</div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  Search_centroid(index.get(), xb.data(), nb, centroid_ids.data());</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a> * ivf = get_IndexIVF(index.get());</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> </div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < nb; i++) {</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordtype">int</span> list_no = centroid_ids[i];</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j: ivf->ids[list_no]) {</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">if</span> (j == i) {</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  found = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  }</div>
|
|
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keywordflow">if</span>(!found) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  }</div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="keywordtype">int</span> test_search_and_return_centroids(<span class="keyword">const</span> <span class="keywordtype">char</span> *index_key) {</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  std::vector<float> xb = make_data(nb); <span class="comment">// database vectors</span></div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keyword">auto</span> index = make_index(index_key, xb);</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>  std::vector<int64_t> centroid_ids (nb);</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  Search_centroid(index.get(), xb.data(), nb, centroid_ids.data());</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>  <a class="code" href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a> * ivf = get_IndexIVF(index.get());</div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  ivf-><a class="code" href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">nprobe</a> = 4;</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> </div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  std::vector<float> xq = make_data(nq); <span class="comment">// database vectors</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="keywordtype">int</span> k = 5;</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="comment">// compute a reference search result</span></div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> </div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  std::vector<long> refI (nq * k);</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  std::vector<float> refD (nq * k);</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  index-><a class="code" href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">search</a> (nq, xq.data(), k, refD.data(), refI.data());</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div>
|
|
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="comment">// compute search result</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>  std::vector<long> newI (nq * k);</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  std::vector<float> newD (nq * k);</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> </div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  std::vector<int64_t> query_centroid_ids (nq);</div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  std::vector<int64_t> result_centroid_ids (nq * k);</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>  search_and_retrun_centroids(index.get(),</div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  nq, xq.data(), k,</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  newD.data(), newI.data(),</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  query_centroid_ids.data(),</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  result_centroid_ids.data());</div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span> </div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="comment">// first verify that we have the same result as the standard search</span></div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">if</span> (newI != refI) {</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">return</span> 1;</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</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>  <span class="comment">// then check if the result ids are indeed in the inverted list</span></div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="comment">// they are supposed to be in</span></div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> </div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < nq * k; i++) {</div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordtype">int</span> list_no = result_centroid_ids[i];</div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordtype">int</span> result_no = newI[i];</div>
|
|
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">if</span> (result_no < 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span> </div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j: ivf->ids[list_no]) {</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">if</span> (j == result_no) {</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  found = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  }</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  }</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">if</span>(!found) <span class="keywordflow">return</span> 2;</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  }</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span> }</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span> <span class="comment"> * Test entry points</span></div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span> <span class="comment"> *************************************************************/</span></div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span> TEST(test_Search_centroid, IVFFlat) {</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordtype">bool</span> ok = test_Search_centroid(<span class="stringliteral">"IVF32,Flat"</span>);</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  EXPECT_TRUE(ok);</div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> }</div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span> </div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> TEST(test_Search_centroid, PCAIVFFlat) {</div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordtype">bool</span> ok = test_Search_centroid(<span class="stringliteral">"PCA16,IVF32,Flat"</span>);</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  EXPECT_TRUE(ok);</div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span> }</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span> </div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span> TEST(test_search_and_return_centroids, IVFFlat) {</div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordtype">int</span> err = test_search_and_return_centroids(<span class="stringliteral">"IVF32,Flat"</span>);</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  EXPECT_NE(err, 1);</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  EXPECT_NE(err, 2);</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> TEST(test_search_and_return_centroids, PCAIVFFlat) {</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordtype">int</span> err = test_search_and_return_centroids(<span class="stringliteral">"PCA16,IVF32,Flat"</span>);</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  EXPECT_NE(err, 1);</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  EXPECT_NE(err, 2);</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span> }</div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_ae13fe9ff54a870ded3487c5c282ca566"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#ae13fe9ff54a870ded3487c5c282ca566">faiss::IndexIVF::search_preassigned</a></div><div class="ttdeci">virtual 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 =0</div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html">faiss::IndexIVF</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00045">IndexIVF.h:45</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_affed235eadf27a13d753ee4d33a1dc58"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#affed235eadf27a13d753ee4d33a1dc58">faiss::IndexIVF::nprobe</a></div><div class="ttdeci">size_t nprobe</div><div class="ttdoc">number of probes at query time </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00047">IndexIVF.h:47</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a1ffe916c958605c38b0b1bfad42485e4"><div class="ttname"><a href="structfaiss_1_1Index.html#a1ffe916c958605c38b0b1bfad42485e4">faiss::Index::train</a></div><div class="ttdeci">virtual void train(idx_t, const float *)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00089">Index.h:89</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_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_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_1Index_html_a1b5e9ac70adbce0897dd6c8276ad96f2"><div class="ttname"><a href="structfaiss_1_1Index.html#a1b5e9ac70adbce0897dd6c8276ad96f2">faiss::Index::add</a></div><div class="ttdeci">virtual void add(idx_t n, const float *x)=0</div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aced51b1ebc33c47ab3ae15ea906559a7"><div class="ttname"><a href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">faiss::Index::search</a></div><div class="ttdeci">virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const =0</div></div>
|
|
<div class="ttc" id="structfaiss_1_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="namespacefaiss_html_a0c95ec47726f2ce3fb668dcb1f9a3317"><div class="ttname"><a href="namespacefaiss.html#a0c95ec47726f2ce3fb668dcb1f9a3317">faiss::index_factory</a></div><div class="ttdeci">Index * index_factory(int d, const char *description_in, MetricType metric)</div><div class="ttdef"><b>Definition:</b> <a href="AutoTune_8cpp_source.html#l00668">AutoTune.cpp:668</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>
|