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
923 lines
138 KiB
HTML
923 lines
138 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/index_io.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/index_io.cpp</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright (c) 2015-present, Facebook, Inc.</span></div>
|
|
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * All rights reserved.</span></div>
|
|
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * This source code is licensed under the BSD+Patents license found in the</span></div>
|
|
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * LICENSE file in the root directory of this source tree.</span></div>
|
|
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div>
|
|
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// Copyright 2004-present Facebook. All Rights Reserved.</span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "index_io.h"</span></div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include <cstdio></span></div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <cstdlib></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 <sys/mman.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 "FaissAssert.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 "IndexFlat.h"</span></div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "VectorTransform.h"</span></div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "IndexLSH.h"</span></div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include "IndexPQ.h"</span></div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include "IndexIVF.h"</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "IndexIVFPQ.h"</span></div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include "MetaIndexes.h"</span></div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "IndexScalarQuantizer.h"</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * The I/O format is the content of the class. For objects that are</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> * inherited, like Index, a 4-character-code (fourcc) indicates which</span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> * child class this is an instance of.</span></div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"> * In this case, the fields of the parent class are written first,</span></div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment"> * then the ones for the child classes. Note that this requires</span></div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment"> * classes to be serialized to have a constructor without parameters,</span></div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment"> * so that the fields can be filled in later. The default constructor</span></div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment"> * should set reasonable defaults for all fields.</span></div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"> * The fourccs are assigned arbitrarily. When the class changed (added</span></div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment"> * or deprecated fields), the fourcc can be replaced. New code should</span></div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"> * be able to read the old fourcc and fill in new classes.</span></div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"> * TODO: serialization to strings for use in Python pickle or Torch</span></div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> * serialization.</span></div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> * TODO: in this file, the read functions that encouter errors may</span></div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> * leak memory.</span></div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> **************************************************************/</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="keyword">namespace </span>faiss {</div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">static</span> uint32_t fourcc (<span class="keyword">const</span> <span class="keywordtype">char</span> sx[4]) {</div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *x = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)sx;</div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">return</span> x[0] | x[1] << 8 | x[2] << 16 | x[3] << 24;</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> </div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> * I/O macros</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="comment"> * we use macros so that we have a line number to report in</span></div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"> * abort (). This makes debugging a lot easier.</span></div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment"> **************************************************************/</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> </div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor">#define WRITEANDCHECK(ptr, n) { \</span></div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="preprocessor"> size_t ret = fwrite (ptr, sizeof (* (ptr)), n, f); \</span></div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="preprocessor"> FAISS_THROW_IF_NOT_MSG (ret == (n), "write error"); \</span></div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor"> }</span></div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="preprocessor">#define READANDCHECK(ptr, n) { \</span></div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="preprocessor"> size_t ret = fread (ptr, sizeof (* (ptr)), n, f); \</span></div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="preprocessor"> FAISS_THROW_IF_NOT_MSG (ret == (n), "read error"); \</span></div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="preprocessor"> }</span></div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="preprocessor">#define WRITE1(x) WRITEANDCHECK(&(x), 1)</span></div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor"></span><span class="preprocessor">#define READ1(x) READANDCHECK(&(x), 1)</span></div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#define WRITEVECTOR(vec) { \</span></div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="preprocessor"> size_t size = (vec).size (); \</span></div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="preprocessor"> WRITEANDCHECK (&size, 1); \</span></div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="preprocessor"> WRITEANDCHECK ((vec).data (), size); \</span></div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="preprocessor"> }</span></div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="preprocessor">#define READVECTOR(vec) { \</span></div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="preprocessor"> long size; \</span></div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="preprocessor"> READANDCHECK (&size, 1); \</span></div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="preprocessor"> FAISS_THROW_IF_NOT (size >= 0 && size < (1L << 40)); \</span></div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="preprocessor"> (vec).resize (size); \</span></div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="preprocessor"> READANDCHECK ((vec).data (), size); \</span></div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="preprocessor"> }</span></div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="structfaiss_1_1ScopeFileCloser.html"> 95</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1ScopeFileCloser.html">ScopeFileCloser</a> {</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  FILE *f;</div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <a class="code" href="structfaiss_1_1ScopeFileCloser.html">ScopeFileCloser</a> (FILE *f): f (f) {}</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  ~<a class="code" href="structfaiss_1_1ScopeFileCloser.html">ScopeFileCloser</a> () {fclose (f); }</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span> };</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> </div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="comment">// Macros for read/write arrays aligned to 16 bytes in the</span></div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="comment">// file. Useful when mmapped.</span></div>
|
|
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span> </div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="preprocessor">#define WRITETABPAD16(tab, size_in) { \</span></div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="preprocessor"> size_t size = (size_in); \</span></div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="preprocessor"> WRITEANDCHECK (&size, 1); \</span></div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="preprocessor"> uint8_t padding[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; \</span></div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="preprocessor"> int idx = ftell(f) % 16; \</span></div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="preprocessor"> padding [idx] = 15 - idx; \</span></div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="preprocessor"> WRITEANDCHECK (padding + idx, 16 - idx); \</span></div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="preprocessor"> WRITEANDCHECK ((tab), size); \</span></div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="preprocessor">}</span></div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="preprocessor">#define READTABPAD16(tab, basetype, expected_size) { \</span></div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="preprocessor"> size_t size; \</span></div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="preprocessor"> READANDCHECK (&size, 1); \</span></div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="preprocessor"> FAISS_THROW_IF_NOT ((expected_size) == size); \</span></div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="preprocessor"> uint8_t padding[16], npad; \</span></div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="preprocessor"> READ1(npad); \</span></div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="preprocessor"> FAISS_THROW_IF_NOT (npad < 16); \</span></div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="preprocessor"> READANDCHECK (padding, npad); \</span></div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="preprocessor"> (tab) = new basetype [size]; \</span></div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="preprocessor"> READANDCHECK ((tab), size); \</span></div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="preprocessor">}</span></div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="comment">// read only the array header, return its offset and skip over it</span></div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="preprocessor">#define TABOFFSETPAD16(taboffset, basetype, expected_size) { \</span></div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor"> size_t size; \</span></div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="preprocessor"> READANDCHECK (&size, 1); \</span></div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="preprocessor"> FAISS_THROW_IF_NOT ((expected_size) == size); \</span></div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor"> uint8_t padding[16], npad; \</span></div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="preprocessor"> READ1(npad); \</span></div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="preprocessor"> FAISS_THROW_IF_NOT (npad < 16); \</span></div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="preprocessor"> READANDCHECK (padding, npad); \</span></div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="preprocessor"> taboffset = ftell(f); \</span></div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="preprocessor"> fseek (f, sizeof(basetype) * size, SEEK_CUR); \</span></div>
|
|
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="preprocessor">}</span></div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span> <span class="preprocessor"></span></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> </div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> </div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="comment"> * Write</span></div>
|
|
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment"> **************************************************************/</span></div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="keyword">static</span> <span class="keywordtype">void</span> write_index_header (<span class="keyword">const</span> <a class="code" href="structfaiss_1_1Index.html">Index</a> *idx, FILE *f) {</div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  WRITE1 (idx-><a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  WRITE1 (idx-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>);</div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> dummy = 1 << 20;</div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  WRITE1 (dummy);</div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  WRITE1 (dummy);</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  WRITE1 (idx-><a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  WRITE1 (idx-><a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a>);</div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> }</div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </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> write_VectorTransform (<span class="keyword">const</span> VectorTransform *vt, FILE *f) {</div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> LinearTransform * lt =</div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  dynamic_cast < const LinearTransform *> (vt)) {</div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span> (dynamic_cast<const RandomRotationMatrix *>(lt)) {</div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  uint32_t h = fourcc (<span class="stringliteral">"rrot"</span>);</div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> PCAMatrix * pca =</div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  dynamic_cast<const PCAMatrix *>(lt)) {</div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  uint32_t h = fourcc (<span class="stringliteral">"PcAm"</span>);</div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  WRITE1 (pca->eigen_power);</div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  WRITE1 (pca->random_rotation);</div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  WRITE1 (pca->balanced_bins);</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  WRITEVECTOR (pca->mean);</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  WRITEVECTOR (pca->eigenvalues);</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  WRITEVECTOR (pca->PCAMat);</div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="comment">// generic LinearTransform (includes OPQ)</span></div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  uint32_t h = fourcc (<span class="stringliteral">"LTra"</span>);</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  }</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  WRITE1 (lt->have_bias);</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  WRITEVECTOR (lt->A);</div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  WRITEVECTOR (lt->b);</div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> RemapDimensionsTransform *rdt =</div>
|
|
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  dynamic_cast<const RemapDimensionsTransform *>(vt)) {</div>
|
|
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  uint32_t h = fourcc (<span class="stringliteral">"RmDT"</span>);</div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  WRITEVECTOR (rdt->map);</div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> NormalizationTransform *nt =</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  dynamic_cast<const NormalizationTransform *>(vt)) {</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  uint32_t h = fourcc (<span class="stringliteral">"VNrm"</span>);</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  WRITE1 (nt->norm);</div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  FAISS_THROW_MSG (<span class="stringliteral">"cannot serialize this"</span>);</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>  <span class="comment">// common fields</span></div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  WRITE1 (vt->d_in);</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  WRITE1 (vt->d_out);</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  WRITE1 (vt->is_trained);</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> </div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="keyword">static</span> <span class="keywordtype">void</span> write_ProductQuantizer (<span class="keyword">const</span> ProductQuantizer *pq, FILE *f) {</div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  WRITE1 (pq->d);</div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  WRITE1 (pq->M);</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  WRITE1 (pq->nbits);</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  WRITEVECTOR (pq->centroids);</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> }</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div>
|
|
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">static</span> <span class="keywordtype">void</span> write_ScalarQuantizer (<span class="keyword">const</span> ScalarQuantizer *ivsc, FILE *f) {</div>
|
|
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  WRITE1 (ivsc->qtype);</div>
|
|
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  WRITE1 (ivsc->rangestat);</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  WRITE1 (ivsc->rangestat_arg);</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  WRITE1 (ivsc->d);</div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  WRITE1 (ivsc->code_size);</div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  WRITEVECTOR (ivsc->trained);</div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div>
|
|
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="keywordtype">void</span> write_ProductQuantizer (<span class="keyword">const</span> ProductQuantizer*pq, <span class="keyword">const</span> <span class="keywordtype">char</span> *fname) {</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  FILE *f = fopen (fname, <span class="stringliteral">"w"</span>);</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  FAISS_THROW_IF_NOT_FMT (f, <span class="stringliteral">"cannot open %s for writing"</span>, fname);</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  ScopeFileCloser closer(f);</div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  write_ProductQuantizer (pq, f);</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span> }</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">static</span> <span class="keywordtype">void</span> write_ivf_header (<span class="keyword">const</span> IndexIVF * ivf, FILE *f,</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">bool</span> include_ids = <span class="keyword">true</span>) {</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  write_index_header (ivf, f);</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  WRITE1 (ivf->nlist);</div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  WRITE1 (ivf->nprobe);</div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  write_index (ivf->quantizer, f);</div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">if</span> (include_ids) {</div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ivf->nlist; i++)</div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  WRITEVECTOR (ivf->ids[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>  WRITE1 (ivf->maintain_direct_map);</div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  WRITEVECTOR (ivf->direct_map);</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> </div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="keywordtype">void</span> write_index (<span class="keyword">const</span> Index *idx, FILE *f) {</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> IndexFlat * idxf = dynamic_cast<const IndexFlat *> (idx)) {</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  uint32_t h = fourcc (</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  idxf->metric_type == METRIC_INNER_PRODUCT ? <span class="stringliteral">"IxFI"</span> :</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  idxf->metric_type == METRIC_L2 ? <span class="stringliteral">"IxF2"</span> : <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  write_index_header (idx, f);</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  WRITEVECTOR (idxf->xb);</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexLSH * idxl = dynamic_cast<const IndexLSH *> (idx)) {</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  uint32_t h = fourcc (<span class="stringliteral">"IxHe"</span>);</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  write_index_header (idx, f);</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  WRITE1 (idxl->nbits);</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  WRITE1 (idxl->rotate_data);</div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  WRITE1 (idxl->train_thresholds);</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  WRITEVECTOR (idxl->thresholds);</div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  WRITE1 (idxl->bytes_per_vec);</div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  write_VectorTransform (&idxl->rrot, f);</div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  WRITEVECTOR (idxl->codes);</div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexPQ * idxp = dynamic_cast<const IndexPQ *> (idx)) {</div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  uint32_t h = fourcc (<span class="stringliteral">"IxPq"</span>);</div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  write_index_header (idx, f);</div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  write_ProductQuantizer (&idxp->pq, f);</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  WRITEVECTOR (idxp->codes);</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// search params -- maybe not useful to store?</span></div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  WRITE1 (idxp->search_type);</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  WRITE1 (idxp->encode_signs);</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  WRITE1 (idxp->polysemous_ht);</div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexScalarQuantizer * idxs =</div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  dynamic_cast<const IndexScalarQuantizer *> (idx)) {</div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  uint32_t h = fourcc (<span class="stringliteral">"IxSQ"</span>);</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  write_index_header (idx, f);</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  write_ScalarQuantizer (&idxs->sq, f);</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  WRITEVECTOR (idxs->codes);</div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexIVFFlat * ivfl =</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  dynamic_cast<const IndexIVFFlat *> (idx)) {</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  uint32_t h = fourcc (<span class="stringliteral">"IvFL"</span>);</div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  write_ivf_header (ivfl, f);</div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < ivfl->nlist; i++)</div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  WRITEVECTOR (ivfl->codes[i]);</div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexIVFScalarQuantizer * ivsc =</div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  dynamic_cast<const IndexIVFScalarQuantizer *> (idx)) {</div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  uint32_t h = fourcc (<span class="stringliteral">"IvSQ"</span>);</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  write_ivf_header (ivsc, f);</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  write_ScalarQuantizer (&ivsc->sq, f);</div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  WRITE1 (ivsc->code_size);</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < ivsc->nlist; i++)</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  WRITEVECTOR (ivsc->codes[i]);</div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexIVFPQ * ivpq =</div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  dynamic_cast<const IndexIVFPQ *> (idx)) {</div>
|
|
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keyword">const</span> IndexIVFPQR * ivfpqr = <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>IndexIVFPQR *<span class="keyword">></span> (idx);</div>
|
|
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keyword">const</span> IndexIVFPQCompact * ivfpqc =</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>IndexIVFPQCompact *<span class="keyword">></span> (idx);</div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  uint32_t h = fourcc (ivfpqr ? <span class="stringliteral">"IvQR"</span> : ivfpqc ? <span class="stringliteral">"IvPC"</span> : <span class="stringliteral">"IvPQ"</span>);</div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  write_ivf_header (ivpq, f, !ivfpqc);</div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  WRITE1 (ivpq->by_residual);</div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  WRITE1 (ivpq->code_size);</div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  write_ProductQuantizer (&ivpq->pq, f);</div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">if</span> (!ivfpqc) {</div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < ivpq->codes.size(); i++)</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  WRITEVECTOR (ivpq->codes[i]);</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">if</span> (ivfpqr) {</div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  write_ProductQuantizer (&ivfpqr->refine_pq, f);</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  WRITEVECTOR (ivfpqr->refine_codes);</div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  WRITE1 (ivfpqr->k_factor);</div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  }</div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">if</span> (ivfpqc) {</div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  WRITETABPAD16 (ivfpqc->limits, ivfpqc->nlist + 1);</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  WRITETABPAD16 (ivfpqc->compact_ids, ivfpqc->ntotal);</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  WRITETABPAD16 (ivfpqc->compact_codes,</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  ivfpqc->ntotal * ivfpqc->code_size);</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexPreTransform * ixpt =</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  dynamic_cast<const IndexPreTransform *> (idx)) {</div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  uint32_t h = fourcc (<span class="stringliteral">"IxPT"</span>);</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  write_index_header (ixpt, f);</div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordtype">int</span> nt = ixpt->chain.size();</div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  WRITE1 (nt);</div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nt; i++)</div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  write_VectorTransform (ixpt->chain[i], f);</div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  write_index (ixpt->index, f);</div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> MultiIndexQuantizer * imiq =</div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  dynamic_cast<const MultiIndexQuantizer *> (idx)) {</div>
|
|
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  uint32_t h = fourcc (<span class="stringliteral">"Imiq"</span>);</div>
|
|
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  write_index_header (imiq, f);</div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  write_ProductQuantizer (&imiq->pq, f);</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexRefineFlat * idxrf =</div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  dynamic_cast<const IndexRefineFlat *> (idx)) {</div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  uint32_t h = fourcc (<span class="stringliteral">"IxRF"</span>);</div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  write_index_header (idxrf, f);</div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  write_index (idxrf->base_index, f);</div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  write_index (&idxrf->refine_index, f);</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  WRITE1 (idxrf->k_factor);</div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> IndexIDMap * idxmap =</div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  dynamic_cast<const IndexIDMap *> (idx)) {</div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  uint32_t h =</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>IndexIDMap2 *<span class="keyword">></span> (idx) ? fourcc (<span class="stringliteral">"IxM2"</span>) :</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  fourcc (<span class="stringliteral">"IxMp"</span>);</div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="comment">// no need to store additional info for IndexIDMap2</span></div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  WRITE1 (h);</div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  write_index_header (idxmap, f);</div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  write_index (idxmap->index, f);</div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  WRITEVECTOR (idxmap->id_map);</div>
|
|
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  FAISS_THROW_MSG (<span class="stringliteral">"don't know how to serialize this type of index"</span>);</div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  }</div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span> }</div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="keywordtype">void</span> write_index (<span class="keyword">const</span> Index *idx, <span class="keyword">const</span> <span class="keywordtype">char</span> *fname) {</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  FILE *f = fopen (fname, <span class="stringliteral">"w"</span>);</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  FAISS_THROW_IF_NOT_FMT (f, <span class="stringliteral">"cannot open %s for writing"</span>, fname);</div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  ScopeFileCloser closer(f);</div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  write_index (idx, f);</div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span> }</div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span> </div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span> <span class="keywordtype">void</span> write_VectorTransform (<span class="keyword">const</span> VectorTransform *vt, <span class="keyword">const</span> <span class="keywordtype">char</span> *fname) {</div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  FILE *f = fopen (fname, <span class="stringliteral">"w"</span>);</div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  FAISS_THROW_IF_NOT_FMT (f, <span class="stringliteral">"cannot open %s for writing"</span>, fname);</div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  ScopeFileCloser closer(f);</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  write_VectorTransform (vt, f);</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span> }</div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="comment"> * Read</span></div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="comment"> **************************************************************/</span></div>
|
|
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div>
|
|
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="keyword">static</span> <span class="keywordtype">void</span> read_index_header (Index *idx, FILE *f) {</div>
|
|
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  READ1 (idx->d);</div>
|
|
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  READ1 (idx->ntotal);</div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> dummy;</div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  READ1 (dummy);</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  READ1 (dummy);</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  READ1 (idx->is_trained);</div>
|
|
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  READ1 (idx->metric_type);</div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  idx->verbose = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span> }</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span> VectorTransform* read_VectorTransform (FILE *f) {</div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  uint32_t h;</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  READ1 (h);</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  VectorTransform *vt = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"rrot"</span>) || h == fourcc (<span class="stringliteral">"PCAm"</span>) ||</div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  h == fourcc (<span class="stringliteral">"LTra"</span>) || h == fourcc (<span class="stringliteral">"PcAm"</span>)) {</div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  LinearTransform *lt = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"rrot"</span>)) {</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  lt = <span class="keyword">new</span> RandomRotationMatrix ();</div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"PCAm"</span>) ||</div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  h == fourcc (<span class="stringliteral">"PcAm"</span>)) {</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  PCAMatrix * pca = <span class="keyword">new</span> PCAMatrix ();</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  READ1 (pca->eigen_power);</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  READ1 (pca->random_rotation);</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"PcAm"</span>))</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  READ1 (pca->balanced_bins);</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  READVECTOR (pca->mean);</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  READVECTOR (pca->eigenvalues);</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  READVECTOR (pca->PCAMat);</div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  lt = pca;</div>
|
|
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"LTra"</span>)) {</div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  lt = <span class="keyword">new</span> LinearTransform ();</div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  }</div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  READ1 (lt->have_bias);</div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  READVECTOR (lt->A);</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  READVECTOR (lt->b);</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  vt = lt;</div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"RmDT"</span>)) {</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  RemapDimensionsTransform *rdt = <span class="keyword">new</span> RemapDimensionsTransform ();</div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  READVECTOR (rdt->map);</div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  vt = rdt;</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"VNrm"</span>)) {</div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  NormalizationTransform *nt = <span class="keyword">new</span> NormalizationTransform ();</div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  READ1 (nt->norm);</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  vt = nt;</div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  FAISS_THROW_MSG(<span class="stringliteral">"fourcc not recognized"</span>);</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div>
|
|
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  READ1 (vt->d_in);</div>
|
|
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  READ1 (vt->d_out);</div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  READ1 (vt->is_trained);</div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordflow">return</span> vt;</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span> }</div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span> </div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <span class="keyword">static</span> <span class="keywordtype">void</span> read_ProductQuantizer (ProductQuantizer *pq, FILE *f) {</div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  READ1 (pq->d);</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  READ1 (pq->M);</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  READ1 (pq->nbits);</div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  pq->set_derived_values ();</div>
|
|
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  READVECTOR (pq->centroids);</div>
|
|
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span> }</div>
|
|
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span> </div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span> <span class="keyword">static</span> <span class="keywordtype">void</span> read_ScalarQuantizer (ScalarQuantizer *ivsc, FILE *f) {</div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  READ1 (ivsc->qtype);</div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  READ1 (ivsc->rangestat);</div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  READ1 (ivsc->rangestat_arg);</div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  READ1 (ivsc->d);</div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  READ1 (ivsc->code_size);</div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  READVECTOR (ivsc->trained);</div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span> }</div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span> </div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span> ProductQuantizer * read_ProductQuantizer (<span class="keyword">const</span> <span class="keywordtype">char</span>*fname) {</div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  FILE *f = fopen (fname, <span class="stringliteral">"r"</span>);</div>
|
|
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  FAISS_THROW_IF_NOT_FMT (f, <span class="stringliteral">"cannot open %s for writing"</span>, fname);</div>
|
|
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  ScopeFileCloser closer(f);</div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  ProductQuantizer *pq = <span class="keyword">new</span> ProductQuantizer();</div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  ScopeDeleter1<ProductQuantizer> del (pq);</div>
|
|
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  read_ProductQuantizer(pq, f);</div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  del.release ();</div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">return</span> pq;</div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span> }</div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span> </div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span> <span class="keyword">static</span> <span class="keywordtype">void</span> read_ivf_header (IndexIVF * ivf, FILE *f,</div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">bool</span> include_ids = <span class="keyword">true</span>) {</div>
|
|
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  read_index_header (ivf, f);</div>
|
|
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  READ1 (ivf->nlist);</div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  READ1 (ivf->nprobe);</div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  ivf->quantizer = <a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (f);</div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  ivf->own_fields = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">if</span> (include_ids) {</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  ivf->ids.resize (ivf->nlist);</div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ivf->nlist; i++)</div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  READVECTOR (ivf->ids[i]);</div>
|
|
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div>
|
|
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  READ1 (ivf->maintain_direct_map);</div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  READVECTOR (ivf->direct_map);</div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span> }</div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span> </div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span> <span class="keyword">static</span> IndexIVFPQ *read_ivfpq (FILE *f, uint32_t h, <span class="keywordtype">bool</span> try_mmap)</div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span> {</div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span> </div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  IndexIVFPQR *ivfpqr =</div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  h == fourcc (<span class="stringliteral">"IvQR"</span>) ? <span class="keyword">new</span> IndexIVFPQR () : nullptr;</div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  IndexIVFPQCompact *ivfpqc =</div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  h == fourcc (<span class="stringliteral">"IvPC"</span>) ? <span class="keyword">new</span> IndexIVFPQCompact () : nullptr;</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  IndexIVFPQ * ivpq = ivfpqr ? ivfpqr : ivfpqc ? ivfpqc : <span class="keyword">new</span> IndexIVFPQ ();</div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  read_ivf_header (ivpq, f, !ivfpqc);</div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  READ1 (ivpq->by_residual);</div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  READ1 (ivpq->code_size);</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  read_ProductQuantizer (&ivpq->pq, f);</div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (!ivfpqc) {</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  ivpq->codes.resize (ivpq->nlist);</div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ivpq->nlist; i++)</div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  READVECTOR (ivpq->codes[i]);</div>
|
|
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div>
|
|
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="comment">// precomputed table not stored. It is cheaper to recompute it</span></div>
|
|
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  ivpq->use_precomputed_table = 0;</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (ivpq->by_residual)</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  ivpq->precompute_table ();</div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">if</span> (ivfpqr) {</div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  read_ProductQuantizer (&ivfpqr->refine_pq, f);</div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  READVECTOR (ivfpqr->refine_codes);</div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  READ1 (ivfpqr->k_factor);</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="keywordflow">if</span> (ivfpqc) {</div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">if</span> (!try_mmap) {</div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  READTABPAD16 (ivfpqc->limits, uint32_t, ivfpqc->nlist + 1);</div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  READTABPAD16 (ivfpqc->compact_ids, uint32_t, ivfpqc->ntotal);</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  READTABPAD16 (ivfpqc->compact_codes, uint8_t,</div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  ivfpqc->ntotal * ivfpqc->code_size);</div>
|
|
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordtype">long</span> offset_limits, offset_compact_ids, offset_compact_codes;</div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  TABOFFSETPAD16 (offset_limits, uint32_t, ivfpqc->nlist + 1);</div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  TABOFFSETPAD16 (offset_compact_ids, uint32_t, ivfpqc->ntotal);</div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  TABOFFSETPAD16 (offset_compact_codes, uint8_t,</div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  ivfpqc->ntotal * ivfpqc->code_size);</div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  ivfpqc->mmap_length = ftell (f);</div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="comment">// mmap the whole file</span></div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  ivfpqc->mmap_buffer = (<span class="keywordtype">char</span>*)mmap (</div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keyword">nullptr</span>, ivfpqc->mmap_length,</div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  PROT_READ, MAP_SHARED, fileno (f), 0);</div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keywordflow">if</span> (!ivfpqc->mmap_buffer) {</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  perror (<span class="stringliteral">"mmap failed"</span>);</div>
|
|
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  abort ();</div>
|
|
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  }</div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">// at this point the file can be closed, it does not</span></div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// invalidate the mapping</span></div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  ivfpqc->limits = (uint32_t*)(ivfpqc->mmap_buffer + offset_limits);</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  ivfpqc->compact_ids = (uint32_t*)(ivfpqc->mmap_buffer +</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  offset_compact_ids);</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  ivfpqc->compact_codes = (uint8_t*)(ivfpqc->mmap_buffer +</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  offset_compact_codes);</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="keywordflow">return</span> ivpq;</div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span> }</div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span> </div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span> <span class="keywordtype">int</span> read_old_fmt_hack = 0;</div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span> </div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"><a class="line" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad"> 536</a></span> <a class="code" href="structfaiss_1_1Index.html">Index</a> *<a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (FILE * f, <span class="keywordtype">bool</span> try_mmap) {</div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> * idx = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  uint32_t h;</div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  READ1 (h);</div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxFI"</span>) || h == fourcc (<span class="stringliteral">"IxF2"</span>)) {</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="structfaiss_1_1IndexFlat.html">IndexFlat</a> *idxf;</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxFI"</span>)) idxf = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexFlatIP.html">IndexFlatIP</a> ();</div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keywordflow">else</span> idxf = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexFlatL2.html">IndexFlatL2</a> ();</div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  read_index_header (idxf, f);</div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  READVECTOR (idxf-><a class="code" href="structfaiss_1_1IndexFlat.html#a9001de47890fe5d2eced9551d3613d47">xb</a>);</div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  FAISS_THROW_IF_NOT (idxf-><a class="code" href="structfaiss_1_1IndexFlat.html#a9001de47890fe5d2eced9551d3613d47">xb</a>.size() == idxf-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * idxf-><a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="comment">// leak!</span></div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  idx = idxf;</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc(<span class="stringliteral">"IxHE"</span>) || h == fourcc(<span class="stringliteral">"IxHe"</span>)) {</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <a class="code" href="structfaiss_1_1IndexLSH.html">IndexLSH</a> * idxl = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexLSH.html">IndexLSH</a> ();</div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  read_index_header (idxl, f);</div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  READ1 (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#af8c48006f210f0cbbf45ec9972558d20">nbits</a>);</div>
|
|
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  READ1 (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a71e9142e1256705f125ded9d647f4497">rotate_data</a>);</div>
|
|
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  READ1 (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a5d4d6ea1fc709605d5b2061d1bce27d6">train_thresholds</a>);</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  READVECTOR (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#ae203ad895b15ae16fc1a748661b84df3">thresholds</a>);</div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  READ1 (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a0116f529bc5de64a7ef142caa652d9f6">bytes_per_vec</a>);</div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">if</span> (h == fourcc(<span class="stringliteral">"IxHE"</span>)) {</div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  FAISS_THROW_IF_NOT_FMT (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#af8c48006f210f0cbbf45ec9972558d20">nbits</a> % 64 == 0,</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="stringliteral">"can only read old format IndexLSH with "</span></div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="stringliteral">"nbits multiple of 64 (got %d)"</span>,</div>
|
|
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  (<span class="keywordtype">int</span>) idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#af8c48006f210f0cbbf45ec9972558d20">nbits</a>);</div>
|
|
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="comment">// leak</span></div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a0116f529bc5de64a7ef142caa652d9f6">bytes_per_vec</a> *= 8;</div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  }</div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  {</div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <a class="code" href="structfaiss_1_1RandomRotationMatrix.html">RandomRotationMatrix</a> *rrot = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1RandomRotationMatrix.html">RandomRotationMatrix</a> *<span class="keyword">></span></div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  (read_VectorTransform (f));</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  FAISS_THROW_IF_NOT_MSG(rrot, <span class="stringliteral">"expected a random rotation"</span>);</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a71c8aa08d3bd0483ccc0f11c22cd3cd8">rrot</a> = *rrot;</div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keyword">delete</span> rrot;</div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  }</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  READVECTOR (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a55c0f1127850af0d06ef22fc8b791572">codes</a>);</div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  FAISS_THROW_IF_NOT (idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a71c8aa08d3bd0483ccc0f11c22cd3cd8">rrot</a>.d_in == idxl-><a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> &&</div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a71c8aa08d3bd0483ccc0f11c22cd3cd8">rrot</a>.<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> == idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#af8c48006f210f0cbbf45ec9972558d20">nbits</a>);</div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  FAISS_THROW_IF_NOT (</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a55c0f1127850af0d06ef22fc8b791572">codes</a>.size() == idxl-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> * idxl-><a class="code" href="structfaiss_1_1IndexLSH.html#a0116f529bc5de64a7ef142caa652d9f6">bytes_per_vec</a>);</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  idx = idxl;</div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxPQ"</span>) || h == fourcc (<span class="stringliteral">"IxPo"</span>) ||</div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  h == fourcc (<span class="stringliteral">"IxPq"</span>)) {</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="comment">// IxPQ and IxPo were merged into the same IndexPQ object</span></div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <a class="code" href="structfaiss_1_1IndexPQ.html">IndexPQ</a> * idxp =<span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexPQ.html">IndexPQ</a> ();</div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  read_index_header (idxp, f);</div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  read_ProductQuantizer (&idxp-><a class="code" href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">pq</a>, f);</div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  READVECTOR (idxp-><a class="code" href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">codes</a>);</div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxPo"</span>) || h == fourcc (<span class="stringliteral">"IxPq"</span>)) {</div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  READ1 (idxp->search_type);</div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  READ1 (idxp->encode_signs);</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  READ1 (idxp-><a class="code" href="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">polysemous_ht</a>);</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="comment">// Old versoins of PQ all had metric_type set to INNER_PRODUCT</span></div>
|
|
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="comment">// when they were in fact using L2. Therefore, we force metric type</span></div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="comment">// to L2 when the old format is detected</span></div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxPQ"</span>) || h == fourcc (<span class="stringliteral">"IxPo"</span>)) {</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  idxp-><a class="code" href="structfaiss_1_1Index.html#a8e18f641854b2bde83ecff0a2f9a6f4e">metric_type</a> = METRIC_L2;</div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  }</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  idx = idxp;</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IvFl"</span>) || h == fourcc(<span class="stringliteral">"IvFL"</span>)) {</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <a class="code" href="structfaiss_1_1IndexIVFFlat.html">IndexIVFFlat</a> * ivfl = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexIVFFlat.html">IndexIVFFlat</a> ();</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  read_ivf_header (ivfl, f);</div>
|
|
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  ivfl-><a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a> = ivfl-><a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> * <span class="keyword">sizeof</span>(float);</div>
|
|
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  ivfl->codes.resize (ivfl-><a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>);</div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IvFL"</span>)) {</div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ivfl-><a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; i++) {</div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  READVECTOR (ivfl->codes[i]);</div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  }</div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  } <span class="keywordflow">else</span> { <span class="comment">// old format</span></div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < ivfl-><a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; i++) {</div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  std::vector<float> vec;</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  READVECTOR (vec);</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  ivfl->codes[i].resize(vec.size() * <span class="keyword">sizeof</span>(float));</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  memcpy(ivfl->codes[i].data(), vec.data(),</div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  ivfl->codes[i].size());</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  }</div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  }</div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  idx = ivfl;</div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (h == fourcc (<span class="stringliteral">"IxSQ"</span>)) {</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html">IndexScalarQuantizer</a> * idxs = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexScalarQuantizer.html">IndexScalarQuantizer</a> ();</div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  read_index_header (idxs, f);</div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  read_ScalarQuantizer (&idxs-><a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a71381f74754d8a54812e80af46a2a83a">sq</a>, f);</div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  READVECTOR (idxs-><a class="code" href="structfaiss_1_1IndexScalarQuantizer.html#a861fa059f9d4ced9147e08193a2be9be">codes</a>);</div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  idxs->code_size = idxs-><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="l00622"></a><span class="lineno"> 622</span>  idx = idxs;</div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"IvSQ"</span>)) {</div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html">IndexIVFScalarQuantizer</a> * ivsc = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexIVFScalarQuantizer.html">IndexIVFScalarQuantizer</a>();</div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  read_ivf_header (ivsc, f);</div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  ivsc->codes.resize(ivsc-><a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>);</div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  read_ScalarQuantizer (&ivsc->sq, f);</div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  READ1 (ivsc-><a class="code" href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">code_size</a>);</div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < ivsc-><a class="code" href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">nlist</a>; i++)</div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  READVECTOR (ivsc->codes[i]);</div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  idx = ivsc;</div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"IvPQ"</span>) || h == fourcc (<span class="stringliteral">"IvQR"</span>) ||</div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  h == fourcc (<span class="stringliteral">"IvPC"</span>)) {</div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  idx = read_ivfpq (f, h, try_mmap);</div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> </div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"IxPT"</span>)) {</div>
|
|
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html">IndexPreTransform</a> * ixpt = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html">IndexPreTransform</a>();</div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  ixpt-><a class="code" href="structfaiss_1_1IndexPreTransform.html#ae5ec3f184eb211e7d6e204082b52c8c0">own_fields</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  read_index_header (ixpt, f);</div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordtype">int</span> nt;</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordflow">if</span> (read_old_fmt_hack == 2) {</div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  nt = 1;</div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  READ1 (nt);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nt; i++) {</div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  ixpt->chain.push_back (read_VectorTransform (f));</div>
|
|
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div>
|
|
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  ixpt-><a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a> = <a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (f);</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  idx = ixpt;</div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"Imiq"</span>)) {</div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> * imiq = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1MultiIndexQuantizer.html">MultiIndexQuantizer</a> ();</div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  read_index_header (imiq, f);</div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  read_ProductQuantizer (&imiq->pq, f);</div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  idx = imiq;</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"IxRF"</span>)) {</div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <a class="code" href="structfaiss_1_1IndexRefineFlat.html">IndexRefineFlat</a> *idxrf = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexRefineFlat.html">IndexRefineFlat</a> ();</div>
|
|
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  read_index_header (idxrf, f);</div>
|
|
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  idxrf-><a class="code" href="structfaiss_1_1IndexRefineFlat.html#a4acc0b3a8c33e5dd8851448ac162dfd0">base_index</a> = <a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a>(f);</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  idxrf-><a class="code" href="structfaiss_1_1IndexRefineFlat.html#aaf0f6a094de0e9409effa81bedb9c7e2">own_fields</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <a class="code" href="structfaiss_1_1IndexFlat.html">IndexFlat</a> *rf = <span class="keyword">dynamic_cast<</span><a class="code" href="structfaiss_1_1IndexFlat.html">IndexFlat</a>*<span class="keyword">></span> (<a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (f));</div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  std::swap (*rf, idxrf-><a class="code" href="structfaiss_1_1IndexRefineFlat.html#aab99f32713ece942ccefccf306292ca0">refine_index</a>);</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keyword">delete</span> rf;</div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  READ1 (idxrf-><a class="code" href="structfaiss_1_1IndexRefineFlat.html#a7383fabb28db5b0df45ca4ea81f7acd4">k_factor</a>);</div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  idx = idxrf;</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(h == fourcc (<span class="stringliteral">"IxMp"</span>) || h == fourcc (<span class="stringliteral">"IxM2"</span>)) {</div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordtype">bool</span> is_map2 = h == fourcc (<span class="stringliteral">"IxM2"</span>);</div>
|
|
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <a class="code" href="structfaiss_1_1IndexIDMap.html">IndexIDMap</a> * idxmap = is_map2 ? <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexIDMap2.html">IndexIDMap2</a> () : <span class="keyword">new</span> <a class="code" href="structfaiss_1_1IndexIDMap.html">IndexIDMap</a> ();</div>
|
|
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  read_index_header (idxmap, f);</div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  idxmap->index = <a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (f);</div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  idxmap-><a class="code" href="structfaiss_1_1IndexIDMap.html#affa8a764304410c96489c2b2e178bcdb">own_fields</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  READVECTOR (idxmap-><a class="code" href="structfaiss_1_1IndexIDMap.html#ad1cc5658f1879f6a2b00d76cca58cf3b">id_map</a>);</div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">if</span> (is_map2) {</div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keyword">static_cast<</span>IndexIDMap2*<span class="keyword">></span>(idxmap)->construct_rev_map ();</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  }</div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  idx = idxmap;</div>
|
|
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  FAISS_THROW_FMT(<span class="stringliteral">"Index type 0x%08x not supported\n"</span>, h);</div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  idx = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  }</div>
|
|
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">return</span> idx;</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"> 685</span> </div>
|
|
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span> </div>
|
|
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> Index *<a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *fname, <span class="keywordtype">bool</span> try_mmap) {</div>
|
|
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  FILE *f = fopen (fname, <span class="stringliteral">"r"</span>);</div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  FAISS_THROW_IF_NOT_FMT (f, <span class="stringliteral">"cannot open %s for reading:"</span>, fname);</div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  Index *idx = <a class="code" href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">read_index</a> (f, try_mmap);</div>
|
|
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  fclose (f);</div>
|
|
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">return</span> idx;</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> </div>
|
|
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span> VectorTransform *read_VectorTransform (<span class="keyword">const</span> <span class="keywordtype">char</span> *fname) {</div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  FILE *f = fopen (fname, <span class="stringliteral">"r"</span>);</div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="keywordflow">if</span> (!f) {</div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  fprintf (stderr, <span class="stringliteral">"cannot open %s for reading:"</span>, fname);</div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  perror (<span class="stringliteral">""</span>);</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  abort ();</div>
|
|
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  }</div>
|
|
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  VectorTransform *vt = read_VectorTransform (f);</div>
|
|
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  fclose (f);</div>
|
|
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">return</span> vt;</div>
|
|
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span> }</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> <span class="comment">/*************************************************************</span></div>
|
|
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="comment"> * cloning functions</span></div>
|
|
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span> <span class="comment"> **************************************************************/</span></div>
|
|
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span> </div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span> Index * clone_index (<span class="keyword">const</span> Index *index)</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>  Cloner cl;</div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">return</span> cl.clone_Index (index);</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"> 719</span> <span class="comment">// assumes there is a copy constructor ready. Always try from most</span></div>
|
|
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> <span class="comment">// specific to most general</span></div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span> <span class="preprocessor">#define TRYCLONE(classname, obj) \</span></div>
|
|
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span> <span class="preprocessor"> if (const classname *clo = dynamic_cast<const classname *>(obj)) { \</span></div>
|
|
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span> <span class="preprocessor"> return new classname(*clo); \</span></div>
|
|
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> <span class="preprocessor"> } else</span></div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span> VectorTransform *Cloner::clone_VectorTransform (<span class="keyword">const</span> VectorTransform *vt)</div>
|
|
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span> {</div>
|
|
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  TRYCLONE (RemapDimensionsTransform, vt)</div>
|
|
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  TRYCLONE (OPQMatrix, vt)</div>
|
|
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  TRYCLONE (PCAMatrix, vt)</div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  TRYCLONE (RandomRotationMatrix, vt)</div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  TRYCLONE (LinearTransform, vt)</div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  {</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  FAISS_THROW_MSG(<span class="stringliteral">"clone not supported for this type of VectorTransform"</span>);</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  }</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</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> </div>
|
|
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span> IndexIVF * Cloner::clone_IndexIVF (<span class="keyword">const</span> IndexIVF *ivf)</div>
|
|
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span> {</div>
|
|
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  TRYCLONE (IndexIVFPQR, ivf)</div>
|
|
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  TRYCLONE (IndexIVFPQ, ivf)</div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  TRYCLONE (IndexIVFFlat, ivf)</div>
|
|
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  TRYCLONE (IndexIVFScalarQuantizer, ivf)</div>
|
|
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  {</div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  FAISS_THROW_MSG(<span class="stringliteral">"clone not supported for this type of IndexIVF"</span>);</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">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span> }</div>
|
|
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div>
|
|
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span> Index *Cloner::clone_Index (<span class="keyword">const</span> Index *index)</div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span> {</div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  TRYCLONE (IndexPQ, index)</div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  TRYCLONE (IndexLSH, index)</div>
|
|
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  TRYCLONE (IndexFlatL2, index)</div>
|
|
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  TRYCLONE (IndexFlatIP, index)</div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  TRYCLONE (IndexFlat, index)</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  TRYCLONE (IndexScalarQuantizer, index)</div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  TRYCLONE (MultiIndexQuantizer, index)</div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  if (const IndexIVF * ivf = dynamic_cast<const IndexIVF*>(index)) {</div>
|
|
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  IndexIVF *res = clone_IndexIVF (ivf);</div>
|
|
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  res->own_fields = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  res->quantizer = clone_Index (ivf->quantizer);</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <span class="keywordflow">return</span> res;</div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> IndexPreTransform * ipt =</div>
|
|
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  dynamic_cast<const IndexPreTransform*> (index)) {</div>
|
|
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  IndexPreTransform *res = <span class="keyword">new</span> IndexPreTransform ();</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  res->d = ipt->d;</div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  res->index = clone_Index (ipt->index);</div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < ipt->chain.size(); i++)</div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  res->chain.push_back (clone_VectorTransform (ipt->chain[i]));</div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  res->own_fields = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keywordflow">return</span> res;</div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  FAISS_THROW_MSG( <span class="stringliteral">"clone not supported for this type of Index"</span>);</div>
|
|
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  }</div>
|
|
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span> }</div>
|
|
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span> </div>
|
|
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div>
|
|
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span> } <span class="comment">// namespace faiss</span></div>
|
|
<div class="ttc" id="structfaiss_1_1ScopeFileCloser_html"><div class="ttname"><a href="structfaiss_1_1ScopeFileCloser.html">faiss::ScopeFileCloser</a></div><div class="ttdef"><b>Definition:</b> <a href="index__io_8cpp_source.html#l00095">index_io.cpp:95</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_a490b64b12384951ed66548a3a48f91e5"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#a490b64b12384951ed66548a3a48f91e5">faiss::IndexPQ::codes</a></div><div class="ttdeci">std::vector< uint8_t > codes</div><div class="ttdoc">Codes. Size ntotal * pq.code_size. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00034">IndexPQ.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_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_1IndexFlat_html"><div class="ttname"><a href="structfaiss_1_1IndexFlat.html">faiss::IndexFlat</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00023">IndexFlat.h:23</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_aee3cbbe7915ec9ed13d59ca9276bdefc"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">faiss::IndexPreTransform::index</a></div><div class="ttdeci">Index * index</div><div class="ttdoc">! chain of tranforms </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00242">VectorTransform.h:242</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RandomRotationMatrix_html"><div class="ttname"><a href="structfaiss_1_1RandomRotationMatrix.html">faiss::RandomRotationMatrix</a></div><div class="ttdoc">Randomly rotate a set of vectors. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00107">VectorTransform.h:107</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIDMap2_html"><div class="ttname"><a href="structfaiss_1_1IndexIDMap2.html">faiss::IndexIDMap2</a></div><div class="ttdef"><b>Definition:</b> <a href="MetaIndexes_8h_source.html#l00063">MetaIndexes.h:63</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_1IndexPQ_html"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html">faiss::IndexPQ</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00028">IndexPQ.h:28</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_aa46fe38a858ecfde7e0fc0744939d5ad"><div class="ttname"><a href="namespacefaiss.html#aa46fe38a858ecfde7e0fc0744939d5ad">faiss::read_index</a></div><div class="ttdeci">Index * read_index(FILE *f, bool try_mmap)</div><div class="ttdef"><b>Definition:</b> <a href="index__io_8cpp_source.html#l00536">index_io.cpp:536</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_a0116f529bc5de64a7ef142caa652d9f6"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#a0116f529bc5de64a7ef142caa652d9f6">faiss::IndexLSH::bytes_per_vec</a></div><div class="ttdeci">int bytes_per_vec</div><div class="ttdoc">nb of 8-bits per encoded vector </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00028">IndexLSH.h:28</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_ae203ad895b15ae16fc1a748661b84df3"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#ae203ad895b15ae16fc1a748661b84df3">faiss::IndexLSH::thresholds</a></div><div class="ttdeci">std::vector< float > thresholds</div><div class="ttdoc">thresholds to compare with </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00034">IndexLSH.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexFlatL2_html"><div class="ttname"><a href="structfaiss_1_1IndexFlatL2.html">faiss::IndexFlatL2</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00079">IndexFlat.h:79</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html">faiss::IndexLSH</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00024">IndexLSH.h:24</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_a5d4d6ea1fc709605d5b2061d1bce27d6"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#a5d4d6ea1fc709605d5b2061d1bce27d6">faiss::IndexLSH::train_thresholds</a></div><div class="ttdeci">bool train_thresholds</div><div class="ttdoc">whether we train thresholds or use 0 </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00030">IndexLSH.h:30</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html">faiss::IndexPreTransform</a></div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00239">VectorTransform.h:239</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIDMap_html"><div class="ttname"><a href="structfaiss_1_1IndexIDMap.html">faiss::IndexIDMap</a></div><div class="ttdef"><b>Definition:</b> <a href="MetaIndexes_8h_source.html#l00026">MetaIndexes.h:26</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVFFlat_html"><div class="ttname"><a href="structfaiss_1_1IndexIVFFlat.html">faiss::IndexIVFFlat</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00181">IndexIVF.h:181</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexFlatIP_html"><div class="ttname"><a href="structfaiss_1_1IndexFlatIP.html">faiss::IndexFlatIP</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00073">IndexFlat.h:73</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexRefineFlat_html_a4acc0b3a8c33e5dd8851448ac162dfd0"><div class="ttname"><a href="structfaiss_1_1IndexRefineFlat.html#a4acc0b3a8c33e5dd8851448ac162dfd0">faiss::IndexRefineFlat::base_index</a></div><div class="ttdeci">Index * base_index</div><div class="ttdoc">faster index to pre-select the vectors that should be filtered </div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00109">IndexFlat.h:109</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexRefineFlat_html"><div class="ttname"><a href="structfaiss_1_1IndexRefineFlat.html">faiss::IndexRefineFlat</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00103">IndexFlat.h:103</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexRefineFlat_html_aab99f32713ece942ccefccf306292ca0"><div class="ttname"><a href="structfaiss_1_1IndexRefineFlat.html#aab99f32713ece942ccefccf306292ca0">faiss::IndexRefineFlat::refine_index</a></div><div class="ttdeci">IndexFlat refine_index</div><div class="ttdoc">storage for full vectors </div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00106">IndexFlat.h:106</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexRefineFlat_html_aaf0f6a094de0e9409effa81bedb9c7e2"><div class="ttname"><a href="structfaiss_1_1IndexRefineFlat.html#aaf0f6a094de0e9409effa81bedb9c7e2">faiss::IndexRefineFlat::own_fields</a></div><div class="ttdeci">bool own_fields</div><div class="ttdoc">should the base index be deallocated? </div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00110">IndexFlat.h:110</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_1IndexIDMap_html_ad1cc5658f1879f6a2b00d76cca58cf3b"><div class="ttname"><a href="structfaiss_1_1IndexIDMap.html#ad1cc5658f1879f6a2b00d76cca58cf3b">faiss::IndexIDMap::id_map</a></div><div class="ttdeci">std::vector< long > id_map</div><div class="ttdoc">! whether pointers are deleted in destructo </div><div class="ttdef"><b>Definition:</b> <a href="MetaIndexes_8h_source.html#l00029">MetaIndexes.h:29</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_1IndexLSH_html_a71c8aa08d3bd0483ccc0f11c22cd3cd8"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#a71c8aa08d3bd0483ccc0f11c22cd3cd8">faiss::IndexLSH::rrot</a></div><div class="ttdeci">RandomRotationMatrix rrot</div><div class="ttdoc">optional random rotation </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00032">IndexLSH.h:32</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_1IndexPQ_html_aa7b7cfe0c8dfd37c8a940fd93d12dc88"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#aa7b7cfe0c8dfd37c8a940fd93d12dc88">faiss::IndexPQ::pq</a></div><div class="ttdeci">ProductQuantizer pq</div><div class="ttdoc">The product quantizer used to encode the vectors. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00031">IndexPQ.h:31</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a6970683faa021b7a6f1a0865c0d4eccd"><div class="ttname"><a href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">faiss::Index::ntotal</a></div><div class="ttdeci">idx_t ntotal</div><div class="ttdoc">total nb of indexed vectors </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00065">Index.h:65</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_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_1MultiIndexQuantizer_html"><div class="ttname"><a href="structfaiss_1_1MultiIndexQuantizer.html">faiss::MultiIndexQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00135">IndexPQ.h:135</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_ae5ec3f184eb211e7d6e204082b52c8c0"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#ae5ec3f184eb211e7d6e204082b52c8c0">faiss::IndexPreTransform::own_fields</a></div><div class="ttdeci">bool own_fields</div><div class="ttdoc">! the sub-index </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00244">VectorTransform.h:244</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_1IndexIVF_html_ab38fde4c923abefc4185eb7450b5b95b"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#ab38fde4c923abefc4185eb7450b5b95b">faiss::IndexIVF::nlist</a></div><div class="ttdeci">size_t nlist</div><div class="ttdoc">number of possible key values </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00046">IndexIVF.h:46</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_a589d612f7b1773614619a0cbecd728a9"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">faiss::VectorTransform::d_out</a></div><div class="ttdeci">int d_out</div><div class="ttdoc">! input dimension </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00033">VectorTransform.h:33</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_af8c48006f210f0cbbf45ec9972558d20"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#af8c48006f210f0cbbf45ec9972558d20">faiss::IndexLSH::nbits</a></div><div class="ttdeci">int nbits</div><div class="ttdoc">nb of bits per vector </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00027">IndexLSH.h:27</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_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_1IndexFlat_html_a9001de47890fe5d2eced9551d3613d47"><div class="ttname"><a href="structfaiss_1_1IndexFlat.html#a9001de47890fe5d2eced9551d3613d47">faiss::IndexFlat::xb</a></div><div class="ttdeci">std::vector< float > xb</div><div class="ttdoc">database vectors, size ntotal * d </div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00025">IndexFlat.h:25</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPQ_html_aff455f2adff6064939494dad6e3017bc"><div class="ttname"><a href="structfaiss_1_1IndexPQ.html#aff455f2adff6064939494dad6e3017bc">faiss::IndexPQ::polysemous_ht</a></div><div class="ttdeci">int polysemous_ht</div><div class="ttdoc">Hamming threshold used for polysemy. </div><div class="ttdef"><b>Definition:</b> <a href="IndexPQ_8h_source.html#l00091">IndexPQ.h:91</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexRefineFlat_html_a7383fabb28db5b0df45ca4ea81f7acd4"><div class="ttname"><a href="structfaiss_1_1IndexRefineFlat.html#a7383fabb28db5b0df45ca4ea81f7acd4">faiss::IndexRefineFlat::k_factor</a></div><div class="ttdeci">float k_factor</div><div class="ttdef"><b>Definition:</b> <a href="IndexFlat_8h_source.html#l00114">IndexFlat.h:114</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIVF_html_a46d1aeddb60643c5b3f096147c3e028f"><div class="ttname"><a href="structfaiss_1_1IndexIVF.html#a46d1aeddb60643c5b3f096147c3e028f">faiss::IndexIVF::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">code size per vector in bytes </div><div class="ttdef"><b>Definition:</b> <a href="IndexIVF_8h_source.html#l00064">IndexIVF.h:64</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_a71e9142e1256705f125ded9d647f4497"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#a71e9142e1256705f125ded9d647f4497">faiss::IndexLSH::rotate_data</a></div><div class="ttdeci">bool rotate_data</div><div class="ttdoc">whether to apply a random rotation to input </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00029">IndexLSH.h:29</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexLSH_html_a55c0f1127850af0d06ef22fc8b791572"><div class="ttname"><a href="structfaiss_1_1IndexLSH.html#a55c0f1127850af0d06ef22fc8b791572">faiss::IndexLSH::codes</a></div><div class="ttdeci">std::vector< uint8_t > codes</div><div class="ttdoc">encoded dataset </div><div class="ttdef"><b>Definition:</b> <a href="IndexLSH_8h_source.html#l00037">IndexLSH.h:37</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexIDMap_html_affa8a764304410c96489c2b2e178bcdb"><div class="ttname"><a href="structfaiss_1_1IndexIDMap.html#affa8a764304410c96489c2b2e178bcdb">faiss::IndexIDMap::own_fields</a></div><div class="ttdeci">bool own_fields</div><div class="ttdoc">! the sub-index </div><div class="ttdef"><b>Definition:</b> <a href="MetaIndexes_8h_source.html#l00028">MetaIndexes.h:28</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>
|