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
1158 lines
193 KiB
HTML
1158 lines
193 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/VectorTransform.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/VectorTransform.cpp</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright (c) 2015-present, Facebook, Inc.</span></div>
|
|
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * All rights reserved.</span></div>
|
|
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * This source code is licensed under the BSD+Patents license found in the</span></div>
|
|
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * LICENSE file in the root directory of this source tree.</span></div>
|
|
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div>
|
|
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// Copyright 2004-present Facebook. All Rights Reserved</span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// -*- c++ -*-</span></div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "VectorTransform.h"</span></div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <cstdio></span></div>
|
|
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include <cmath></span></div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include <cstring></span></div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include "utils.h"</span></div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include "FaissAssert.h"</span></div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "IndexPQ.h"</span></div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">using namespace </span>faiss;</div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment">// this is to keep the clang syntax checker happy</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#ifndef FINTEGER</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor"></span><span class="preprocessor">#define FINTEGER int</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment">/* declare BLAS functions, see http://www.netlib.org/clapack/cblas/ */</span></div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="keywordtype">int</span> sgemm_ (</div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *transa, <span class="keyword">const</span> <span class="keywordtype">char</span> *transb, FINTEGER *m, FINTEGER *</div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  n, FINTEGER *k, <span class="keyword">const</span> <span class="keywordtype">float</span> *alpha, <span class="keyword">const</span> <span class="keywordtype">float</span> *a,</div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  FINTEGER *lda, <span class="keyword">const</span> <span class="keywordtype">float</span> *b,</div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  FINTEGER *ldb, <span class="keywordtype">float</span> *beta,</div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="keywordtype">float</span> *c, FINTEGER *ldc);</div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keywordtype">int</span> ssyrk_ (</div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *uplo, <span class="keyword">const</span> <span class="keywordtype">char</span> *trans, FINTEGER *n, FINTEGER *k,</div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keywordtype">float</span> *alpha, <span class="keywordtype">float</span> *a, FINTEGER *lda,</div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keywordtype">float</span> *beta, <span class="keywordtype">float</span> *c, FINTEGER *ldc);</div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment">/* Lapack functions from http://www.netlib.org/clapack/old/single/ */</span></div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="keywordtype">int</span> ssyev_ (</div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *jobz, <span class="keyword">const</span> <span class="keywordtype">char</span> *uplo, FINTEGER *n, <span class="keywordtype">float</span> *a,</div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  FINTEGER *lda, <span class="keywordtype">float</span> *w, <span class="keywordtype">float</span> *work, FINTEGER *lwork,</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  FINTEGER *info);</div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="keywordtype">int</span> dsyev_ (</div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *jobz, <span class="keyword">const</span> <span class="keywordtype">char</span> *uplo, FINTEGER *n, <span class="keywordtype">double</span> *a,</div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  FINTEGER *lda, <span class="keywordtype">double</span> *w, <span class="keywordtype">double</span> *work, FINTEGER *lwork,</div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  FINTEGER *info);</div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="keywordtype">int</span> sgesvd_(</div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *jobu, <span class="keyword">const</span> <span class="keywordtype">char</span> *jobvt, FINTEGER *m, FINTEGER *n,</div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordtype">float</span> *a, FINTEGER *lda, <span class="keywordtype">float</span> *s, <span class="keywordtype">float</span> *u, FINTEGER *ldu, <span class="keywordtype">float</span> *vt,</div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  FINTEGER *ldvt, <span class="keywordtype">float</span> *work, FINTEGER *lwork, FINTEGER *info);</div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> }</div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment"> * VectorTransform</span></div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="structfaiss_1_1VectorTransform.html#af3b3a8bf95911f4b28128001c83f91a5"> 72</a></span> <span class="keywordtype">float</span> * <a class="code" href="structfaiss_1_1VectorTransform.html#af3b3a8bf95911f4b28128001c83f91a5">VectorTransform::apply</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordtype">float</span> * xt = <span class="keyword">new</span> <span class="keywordtype">float</span>[n * <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>];</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#a90f1a218c224c049f1bd8b77a78d6aa0">apply_noalloc</a> (n, x, xt);</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordflow">return</span> xt;</div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> }</div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> </div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="structfaiss_1_1VectorTransform.html#a7350d4dd28d60866d55ba4f75d2da84c"> 80</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1VectorTransform.html#a7350d4dd28d60866d55ba4f75d2da84c">VectorTransform::train</a> (idx_t, <span class="keyword">const</span> <span class="keywordtype">float</span> *) {</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="comment">// does nothing by default</span></div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> }</div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structfaiss_1_1VectorTransform.html#a101ce54f1c60df19478801aa942470d9"> 85</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1VectorTransform.html#a101ce54f1c60df19478801aa942470d9">VectorTransform::reverse_transform</a> (</div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  idx_t , <span class="keyword">const</span> <span class="keywordtype">float</span> *,</div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">float</span> *)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  FAISS_THROW_MSG (<span class="stringliteral">"reverse transform not implemented"</span>);</div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> }</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span> </div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> </div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment"> * LinearTransform</span></div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="comment"> *********************************************/</span><span class="comment"></span></div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="comment">/// both d_in > d_out and d_out < d_in are supported</span></div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="structfaiss_1_1LinearTransform.html#a2fffd6064defb7c3fdaf143c0c4a9bc7"> 99</a></span> <span class="comment"></span><a class="code" href="structfaiss_1_1LinearTransform.html#a2fffd6064defb7c3fdaf143c0c4a9bc7">LinearTransform::LinearTransform</a> (<span class="keywordtype">int</span> d_in, <span class="keywordtype">int</span> d_out,</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordtype">bool</span> have_bias):</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> (d_in, d_out), have_bias (have_bias),</div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  verbose (false)</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> </div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="structfaiss_1_1LinearTransform.html#af9c20b4ae67691b5713489884ca9f80f"> 105</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1LinearTransform.html#af9c20b4ae67691b5713489884ca9f80f">LinearTransform::apply_noalloc</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordtype">float</span> * xt)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  FAISS_THROW_IF_NOT_MSG(<a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a>, <span class="stringliteral">"Transformation not trained yet"</span>);</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> </div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordtype">float</span> c_factor;</div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">if</span> (have_bias) {</div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  FAISS_THROW_IF_NOT_MSG (<a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a>.size() == <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>, <span class="stringliteral">"Bias not initialized"</span>);</div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordtype">float</span> * xi = xt;</div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; j++)</div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  *xi++ = <a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a>[j];</div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  c_factor = 1.0;</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  c_factor = 0.0;</div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  FAISS_THROW_IF_NOT_MSG (<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.size() == <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in,</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="stringliteral">"Transformation matrix not initialized"</span>);</div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordtype">float</span> one = 1;</div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  FINTEGER nbiti = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>, ni = n, di = d_in;</div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  sgemm_ (<span class="stringliteral">"Transposed"</span>, <span class="stringliteral">"Not transposed"</span>,</div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  &nbiti, &ni, &di,</div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  &one, <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data(), &di, x, &di, &c_factor, xt, &nbiti);</div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> }</div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span> </div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> </div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"><a class="line" href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13"> 134</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13">LinearTransform::transform_transpose</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * y,</div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">if</span> (have_bias) { <span class="comment">// allocate buffer to store bias-corrected data</span></div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordtype">float</span> *y_new = <span class="keyword">new</span> <span class="keywordtype">float</span> [n * <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>];</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *yr = y;</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">float</span> *yw = y_new;</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">for</span> (idx_t i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; j++) {</div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  *yw++ = *yr++ - <a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a> [j];</div>
|
|
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  }</div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  }</div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  y = y_new;</div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  }</div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> </div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  {</div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  FINTEGER dii = d_in, doi = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>, ni = n;</div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordtype">float</span> one = 1.0, zero = 0.0;</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  sgemm_ (<span class="stringliteral">"Not"</span>, <span class="stringliteral">"Not"</span>, &dii, &ni, &doi,</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  &one, <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data (), &dii, y, &doi, &zero, x, &dii);</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>  <span class="keywordflow">if</span> (have_bias) <span class="keyword">delete</span> [] y;</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> </div>
|
|
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div>
|
|
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="comment"> * RandomRotationMatrix</span></div>
|
|
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div>
|
|
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="structfaiss_1_1RandomRotationMatrix.html#a857ad8c32fb76b3298d4eea4338ff66f"> 164</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1RandomRotationMatrix.html#a857ad8c32fb76b3298d4eea4338ff66f">RandomRotationMatrix::init</a> (<span class="keywordtype">int</span> seed)</div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span> {</div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">if</span>(<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> <= d_in) {</div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize (<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in);</div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordtype">float</span> *q = <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data();</div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  float_randn(q, <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in, seed);</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <a class="code" href="namespacefaiss.html#afb68fe89ad5e948974da1b70d7b4157c">matrix_qr</a>(d_in, <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>, q);</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize (<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>);</div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keywordtype">float</span> *q = <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data();</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  float_randn(q, d_out * d_out, seed);</div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="namespacefaiss.html#afb68fe89ad5e948974da1b70d7b4157c">matrix_qr</a>(d_out, d_out, q);</div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="comment">// remove columns</span></div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordtype">int</span> i, j;</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">for</span>(j = 0; j < d_in; j++) {</div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  q[i * d_in + j] = q[i * d_out + j];</div>
|
|
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  }</div>
|
|
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  }</div>
|
|
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize(d_in * d_out);</div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  }</div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> </div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> }</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="structfaiss_1_1RandomRotationMatrix.html#a3ad86e9ae3bdc2090c1f5fc62a335c16"> 189</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1RandomRotationMatrix.html#a3ad86e9ae3bdc2090c1f5fc62a335c16">RandomRotationMatrix::reverse_transform</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * xt,</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13">transform_transpose</a> (n, xt, x);</div>
|
|
<div class="line"><a name="l00193"></a><span class="lineno"> 193</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">/*********************************************</span></div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment"> * PCAMatrix</span></div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div>
|
|
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> PCAMatrix::PCAMatrix (<span class="keywordtype">int</span> d_in, <span class="keywordtype">int</span> d_out,</div>
|
|
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordtype">float</span> eigen_power, <span class="keywordtype">bool</span> random_rotation):</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <a class="code" href="structfaiss_1_1LinearTransform.html">LinearTransform</a>(d_in, d_out, true),</div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  eigen_power(eigen_power), random_rotation(random_rotation)</div>
|
|
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> {</div>
|
|
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  max_points_per_d = 1000;</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  balanced_bins = 0;</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> }</div>
|
|
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div>
|
|
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div>
|
|
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="comment">/// Compute the eigenvalue decomposition of symmetric matrix cov,</span></div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> <span class="comment">/// dimensions d_in-by-d_in. Output eigenvectors in cov.</span></div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="keywordtype">void</span> eig(<span class="keywordtype">size_t</span> d_in, <span class="keywordtype">double</span> *cov, <span class="keywordtype">double</span> *eigenvalues, <span class="keywordtype">int</span> verbose)</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="comment">// compute eigenvalues and vectors</span></div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  FINTEGER info = 0, lwork = -1, di = d_in;</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordtype">double</span> workq;</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  dsyev_ (<span class="stringliteral">"Vectors as well"</span>, <span class="stringliteral">"Upper"</span>,</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  &di, cov, &di, eigenvalues, &workq, &lwork, &info);</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  lwork = FINTEGER(workq);</div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">double</span> *work = <span class="keyword">new</span> <span class="keywordtype">double</span>[lwork];</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> </div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  dsyev_ (<span class="stringliteral">"Vectors as well"</span>, <span class="stringliteral">"Upper"</span>,</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  &di, cov, &di, eigenvalues, work, &lwork, &info);</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keyword">delete</span> [] work;</div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> </div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">if</span> (info != 0) {</div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  fprintf (stderr, <span class="stringliteral">"WARN ssyev info returns %d, "</span></div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="stringliteral">"a very bad PCA matrix is learnt\n"</span>,</div>
|
|
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordtype">int</span>(info));</div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="comment">// do not throw exception, as the matrix could still be useful</span></div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> </div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordflow">if</span>(verbose && d_in <= 10) {</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  printf(<span class="stringliteral">"info=%ld new eigvals=["</span>, <span class="keywordtype">long</span>(info));</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++) printf(<span class="stringliteral">"%g "</span>, eigenvalues[j]);</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  printf(<span class="stringliteral">"]\n"</span>);</div>
|
|
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div>
|
|
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordtype">double</span> *ci = cov;</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  printf(<span class="stringliteral">"eigenvecs=\n"</span>);</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < d_in; i++) {</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  printf(<span class="stringliteral">"%10.4g "</span>, *ci++);</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div>
|
|
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div>
|
|
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div>
|
|
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div>
|
|
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span> </div>
|
|
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// revert order of eigenvectors & values</span></div>
|
|
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span> </div>
|
|
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < d_in / 2; i++) {</div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span> </div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  std::swap(eigenvalues[i], eigenvalues[d_in - 1 - i]);</div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordtype">double</span> *v1 = cov + i * d_in;</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">double</span> *v2 = cov + (d_in - 1 - i) * d_in;</div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  std::swap(v1[j], v2[j]);</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  }</div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span> }</div>
|
|
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div>
|
|
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div>
|
|
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span> }</div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"><a class="line" href="structfaiss_1_1PCAMatrix.html#a8f2dd12da8dce3cbeb22da9c5d4ec3e7"> 271</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PCAMatrix.html#a8f2dd12da8dce3cbeb22da9c5d4ec3e7">PCAMatrix::train</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span> {</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x_in = x;</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  x = <a class="code" href="namespacefaiss.html#a14884d253128c7af5891a65082ad7dc6">fvecs_maybe_subsample</a> (d_in, (<span class="keywordtype">size_t</span>*)&n,</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#abdce90f57a3c4401f5230f03da901e0d">max_points_per_d</a> * d_in, x, verbose);</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del_x (x != x_in ? x : <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div>
|
|
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="comment">// compute mean</span></div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>.clear(); <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>.resize(d_in, 0.0);</div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (have_bias) { <span class="comment">// we may want to skip the bias</span></div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xi = x;</div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j] += *xi++;</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j] /= n;</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  }</div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">if</span>(verbose) {</div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  printf(<span class="stringliteral">"mean=["</span>);</div>
|
|
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++) printf(<span class="stringliteral">"%g "</span>, <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j]);</div>
|
|
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  printf(<span class="stringliteral">"]\n"</span>);</div>
|
|
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div>
|
|
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">if</span>(n >= d_in) {</div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// compute covariance matrix, store it in PCA matrix</span></div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.resize(d_in * d_in);</div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordtype">float</span> * cov = <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.data();</div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  { <span class="comment">// initialize with mean * mean^T term</span></div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordtype">float</span> *ci = cov;</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 < d_in; i++) {</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  *ci++ = - n * <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[i] * <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j];</div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  {</div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  FINTEGER di = d_in, ni = n;</div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordtype">float</span> one = 1.0;</div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  ssyrk_ (<span class="stringliteral">"Up"</span>, <span class="stringliteral">"Non transposed"</span>,</div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  &di, &ni, &one, (<span class="keywordtype">float</span>*)x, &di, &one, cov, &di);</div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  }</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">if</span>(verbose && d_in <= 10) {</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordtype">float</span> *ci = cov;</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  printf(<span class="stringliteral">"cov=\n"</span>);</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < d_in; i++) {</div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  printf(<span class="stringliteral">"%10g "</span>, *ci++);</div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  }</div>
|
|
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  }</div>
|
|
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div>
|
|
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  std::vector<double> covd (d_in * d_in);</div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d_in * d_in; i++) covd [i] = cov [i];</div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span> </div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  std::vector<double> eigenvaluesd (d_in);</div>
|
|
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span> </div>
|
|
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  eig (d_in, covd.data (), eigenvaluesd.data (), verbose);</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span> </div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d_in * d_in; i++) <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a> [i] = covd [i];</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  eigenvalues.resize (d_in);</div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < d_in; i++)</div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  eigenvalues [i] = eigenvaluesd [i];</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span> </div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span> </div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span> </div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  std::vector<float> xc (n * d_in);</div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  xc [i * d_in + j] = x [i * d_in + j] - <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j];</div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment">// compute Gram matrix</span></div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  std::vector<float> gram (n * n);</div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  {</div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  FINTEGER di = d_in, ni = n;</div>
|
|
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordtype">float</span> one = 1.0, zero = 0.0;</div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  ssyrk_ (<span class="stringliteral">"Up"</span>, <span class="stringliteral">"Transposed"</span>,</div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  &ni, &di, &one, xc.data(), &di, &zero, gram.data(), &ni);</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="keywordflow">if</span>(verbose && d_in <= 10) {</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordtype">float</span> *ci = gram.data();</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  printf(<span class="stringliteral">"gram=\n"</span>);</div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < n; j++)</div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  printf(<span class="stringliteral">"%10g "</span>, *ci++);</div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  }</div>
|
|
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  }</div>
|
|
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  std::vector<double> gramd (n * n);</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n * n; i++)</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  gramd [i] = gram [i];</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>  std::vector<double> eigenvaluesd (n);</div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span> </div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="comment">// eig will fill in only the n first eigenvals</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>  eig (n, gramd.data (), eigenvaluesd.data (), verbose);</div>
|
|
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span> </div>
|
|
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.resize(d_in * n);</div>
|
|
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div>
|
|
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n * n; i++)</div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  gram [i] = gramd [i];</div>
|
|
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div>
|
|
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  eigenvalues.resize (d_in);</div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="comment">// fill in only the n first ones</span></div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  eigenvalues [i] = eigenvaluesd [i];</div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  { <span class="comment">// compute PCAMat = x' * v</span></div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  FINTEGER di = d_in, ni = n;</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordtype">float</span> one = 1.0;</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>  sgemm_ (<span class="stringliteral">"Non"</span>, <span class="stringliteral">"Non Trans"</span>,</div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  &di, &ni, &ni,</div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  &one, xc.data(), &di, gram.data(), &ni,</div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  &one, <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.data(), &di);</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  }</div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">if</span>(verbose && d_in <= 10) {</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordtype">float</span> *ci = <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.data();</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  printf(<span class="stringliteral">"PCAMat=\n"</span>);</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  printf(<span class="stringliteral">"%10g "</span>, *ci++);</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  }</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  }</div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  fvec_renorm_L2 (d_in, n, <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.data());</div>
|
|
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span> </div>
|
|
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  }</div>
|
|
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a117a70b8fca6d125725fe49fddebf97b">prepare_Ab</a>();</div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span> }</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span> </div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"><a class="line" href="structfaiss_1_1PCAMatrix.html#ae586dc89db6c57753c687473417742a6"> 413</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PCAMatrix.html#ae586dc89db6c57753c687473417742a6">PCAMatrix::copy_from</a> (<span class="keyword">const</span> <a class="code" href="structfaiss_1_1PCAMatrix.html">PCAMatrix</a> & other)</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span> {</div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  FAISS_THROW_IF_NOT (other.<a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a>);</div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a> = other.<a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>;</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  eigenvalues = other.<a class="code" href="structfaiss_1_1PCAMatrix.html#ae80e130c0667b66cea608c4926d7d561">eigenvalues</a>;</div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a> = other.<a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>;</div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <a class="code" href="structfaiss_1_1PCAMatrix.html#a117a70b8fca6d125725fe49fddebf97b">prepare_Ab</a> ();</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span> }</div>
|
|
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"><a class="line" href="structfaiss_1_1PCAMatrix.html#a117a70b8fca6d125725fe49fddebf97b"> 423</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PCAMatrix.html#a117a70b8fca6d125725fe49fddebf97b">PCAMatrix::prepare_Ab</a> ()</div>
|
|
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span> {</div>
|
|
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordflow">if</span> (!<a class="code" href="structfaiss_1_1PCAMatrix.html#af111f055b7571703a3aa270d89e99321">random_rotation</a>) {</div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  FAISS_THROW_IF_NOT_MSG (</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in <= <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.size(),</div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="stringliteral">"PCA matrix was trained on too few examples "</span></div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="stringliteral">"to output this number of dimensions"</span>);</div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a> = <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>;</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  A.resize(<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in); <span class="comment">// strip off useless dimensions</span></div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span> </div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// first scale the components</span></div>
|
|
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">eigen_power</a> != 0) {</div>
|
|
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordtype">float</span> *ai = A.data();</div>
|
|
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordtype">float</span> factor = pow(eigenvalues[i], <a class="code" href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">eigen_power</a>);</div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  *ai++ *= factor;</div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  }</div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  }</div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span> </div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a> != 0) {</div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> % <a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a> == 0);</div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordtype">int</span> dsub = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> / <a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a>;</div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  std::vector <float> Ain;</div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  std::swap(A, Ain);</div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  A.resize(<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> * d_in);</div>
|
|
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span> </div>
|
|
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  std::vector <float> accu(<a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a>);</div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  std::vector <int> counter(<a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a>);</div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span> </div>
|
|
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="comment">// greedy assignment</span></div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="comment">// find best bin</span></div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordtype">int</span> best_j = -1;</div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordtype">float</span> min_w = 1e30;</div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a>; j++) {</div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordflow">if</span> (counter[j] < dsub && accu[j] < min_w) {</div>
|
|
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  min_w = accu[j];</div>
|
|
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  best_j = j;</div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  }</div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordtype">int</span> row_dst = best_j * dsub + counter[best_j];</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  accu[best_j] += eigenvalues[i];</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  counter[best_j] ++;</div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  memcpy (&A[row_dst * d_in], &Ain[i * d_in],</div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  d_in * <span class="keyword">sizeof</span> (A[0]));</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> </div>
|
|
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  printf(<span class="stringliteral">" bin accu=["</span>);</div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a>; i++)</div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  printf(<span class="stringliteral">"%g "</span>, accu[i]);</div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  printf(<span class="stringliteral">"]\n"</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>  }</div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  FAISS_THROW_IF_NOT_MSG (<a class="code" href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">balanced_bins</a> == 0,</div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="stringliteral">"both balancing bins and applying a random rotation "</span></div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="stringliteral">"does not make sense"</span>);</div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <a class="code" href="structfaiss_1_1RandomRotationMatrix.html">RandomRotationMatrix</a> rr(<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>, <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>);</div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span> </div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  rr.<a class="code" href="structfaiss_1_1RandomRotationMatrix.html#a857ad8c32fb76b3298d4eea4338ff66f">init</a>(5);</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span> </div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="comment">// apply scaling on the rotation matrix (right multiplication)</span></div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">eigen_power</a> != 0) {</div>
|
|
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordtype">float</span> factor = pow(eigenvalues[i], <a class="code" href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">eigen_power</a>);</div>
|
|
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; j++)</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  rr.<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>[j * d_out + i] *= factor;</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div>
|
|
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  }</div>
|
|
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span> </div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize(d_in * <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>);</div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  {</div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  FINTEGER dii = d_in, doo = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordtype">float</span> one = 1.0, zero = 0.0;</div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  sgemm_ (<span class="stringliteral">"Not"</span>, <span class="stringliteral">"Not"</span>, &dii, &doo, &doo,</div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  &one, <a class="code" href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">PCAMat</a>.data(), &dii, rr.<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data(), &doo, &zero,</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data(), &dii);</div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span> </div>
|
|
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  }</div>
|
|
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span> </div>
|
|
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span> </div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a>.clear(); <a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a>.resize(<a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>);</div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">float</span> accu = 0;</div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  accu -= <a class="code" href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">mean</a>[j] * <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>[j + i * d_in];</div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">b</a>[i] = accu;</div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span> </div>
|
|
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span> }</div>
|
|
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span> </div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"><a class="line" href="structfaiss_1_1PCAMatrix.html#abf427521a66cbfaaf0b7aae16bcb6e93"> 522</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PCAMatrix.html#abf427521a66cbfaaf0b7aae16bcb6e93">PCAMatrix::reverse_transform</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * xt,</div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  FAISS_THROW_IF_NOT_MSG (<a class="code" href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">eigen_power</a> == 0,</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="stringliteral">"reverse only implemented for orthogonal transforms"</span>);</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13">transform_transpose</a> (n, xt, x);</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span> }</div>
|
|
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span> </div>
|
|
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span> <span class="comment"> * OPQMatrix</span></div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span> </div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span> </div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="structfaiss_1_1OPQMatrix.html#a6eb9d18ff15b1c598d3aa3bc9ab84519"> 535</a></span> <a class="code" href="structfaiss_1_1OPQMatrix.html#a6eb9d18ff15b1c598d3aa3bc9ab84519">OPQMatrix::OPQMatrix</a> (<span class="keywordtype">int</span> d, <span class="keywordtype">int</span> M, <span class="keywordtype">int</span> d2):</div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <a class="code" href="structfaiss_1_1LinearTransform.html">LinearTransform</a> (d, d2 == -1 ? d : d2, false), M(M),</div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  niter (50),</div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  niter_pq (4), niter_pq_0 (40),</div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  verbose(false)</div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span> {</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a> = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="comment">// OPQ is quite expensive to train, so set this right.</span></div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <a class="code" href="structfaiss_1_1OPQMatrix.html#afdd5b2c74d19ccc5c7a6e0199333321a">max_train_points</a> = 256 * 256;</div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span> }</div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="structfaiss_1_1OPQMatrix.html#a1e314577db0c6cd4a709503f73eb71e2"> 548</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1OPQMatrix.html#a1e314577db0c6cd4a709503f73eb71e2">OPQMatrix::train</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">Index::idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span> {</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> * x_in = x;</div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span> </div>
|
|
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  x = <a class="code" href="namespacefaiss.html#a14884d253128c7af5891a65082ad7dc6">fvecs_maybe_subsample</a> (d_in, (<span class="keywordtype">size_t</span>*)&n,</div>
|
|
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="structfaiss_1_1OPQMatrix.html#afdd5b2c74d19ccc5c7a6e0199333321a">max_train_points</a>, x, verbose);</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span> </div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del_x (x != x_in ? x : <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span> </div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="comment">// To support d_out > d_in, we pad input vectors with 0s to d_out</span></div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordtype">size_t</span> d = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> <= d_in ? d_in : <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordtype">size_t</span> d2 = <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span> </div>
|
|
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span> <span class="preprocessor">#if 0</span></div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span> <span class="preprocessor"></span> <span class="comment">// what this test shows: the only way of getting bit-exact</span></div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// reproducible results with sgeqrf and sgesvd seems to be forcing</span></div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="comment">// single-threading.</span></div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  { <span class="comment">// test repro</span></div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  std::vector<float> r (d * d);</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordtype">float</span> * rotation = r.data();</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  float_randn (rotation, d * d, 1234);</div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  printf(<span class="stringliteral">"CS0: %016lx\n"</span>,</div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <a class="code" href="namespacefaiss.html#a4369329c9dbdfe23e3f35d09ba7b5c6e">ivec_checksum</a> (128*128, (<span class="keywordtype">int</span>*)rotation));</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="namespacefaiss.html#afb68fe89ad5e948974da1b70d7b4157c">matrix_qr</a> (d, d, rotation);</div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  printf(<span class="stringliteral">"CS1: %016lx\n"</span>,</div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <a class="code" href="namespacefaiss.html#a4369329c9dbdfe23e3f35d09ba7b5c6e">ivec_checksum</a> (128*128, (<span class="keywordtype">int</span>*)rotation));</div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  }</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span> <span class="preprocessor"></span></div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  printf (<span class="stringliteral">"OPQMatrix::train: training an OPQ rotation matrix "</span></div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="stringliteral">"for M=%d from %ld vectors in %dD -> %dD\n"</span>,</div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <a class="code" href="structfaiss_1_1OPQMatrix.html#a07ad0c0c84f96a6880c1c8eaf09596e3">M</a>, n, d_in, <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>);</div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  }</div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> </div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  std::vector<float> xtrain (n * d);</div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// center x</span></div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  {</div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  std::vector<float> sum (d);</div>
|
|
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xi = x;</div>
|
|
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  sum [j] += *xi++;</div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < d; i++) sum[i] /= n;</div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordtype">float</span> *yi = xtrain.data();</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  xi = x;</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < d_in; j++)</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  *yi++ = *xi++ - sum[j];</div>
|
|
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  yi += d - d_in;</div>
|
|
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  }</div>
|
|
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  }</div>
|
|
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="keywordtype">float</span> *rotation;</div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span> </div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.size () == 0) {</div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize (d * d);</div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  rotation = <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data();</div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordflow">if</span> (verbose)</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  printf(<span class="stringliteral">" OPQMatrix::train: making random %ld*%ld rotation\n"</span>,</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  d, d);</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  float_randn (rotation, d * d, 1234);</div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <a class="code" href="namespacefaiss.html#afb68fe89ad5e948974da1b70d7b4157c">matrix_qr</a> (d, d, rotation);</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="comment">// we use only the d * d2 upper part of the matrix</span></div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize (d * d2);</div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.size() == d * d2);</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  rotation = <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.data();</div>
|
|
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  }</div>
|
|
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> </div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  std::vector<float></div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  xproj (d2 * n), pq_recons (d2 * n), xxr (d * n),</div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  tmp(d * d * 4);</div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  std::vector<uint8_t> codes (<a class="code" href="structfaiss_1_1OPQMatrix.html#a07ad0c0c84f96a6880c1c8eaf09596e3">M</a> * n);</div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> pq_regular (d2, <a class="code" href="structfaiss_1_1OPQMatrix.html#a07ad0c0c84f96a6880c1c8eaf09596e3">M</a>, 8);</div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordtype">double</span> t0 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a>();</div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> iter = 0; iter < <a class="code" href="structfaiss_1_1OPQMatrix.html#a12cb3e05989dee37592b682070c31000">niter</a>; iter++) {</div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> </div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  { <span class="comment">// torch.mm(xtrain, rotation:t())</span></div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  FINTEGER di = d, d2i = d2, ni = n;</div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordtype">float</span> zero = 0, one = 1;</div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  sgemm_ (<span class="stringliteral">"Transposed"</span>, <span class="stringliteral">"Not transposed"</span>,</div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  &d2i, &ni, &di,</div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  &one, rotation, &di,</div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  xtrain.data(), &di,</div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  &zero, xproj.data(), &d2i);</div>
|
|
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div>
|
|
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span> </div>
|
|
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a993e0a035248faad6e292a5ef9af1953">max_points_per_centroid</a> = 1000;</div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a5c7c6f05c75e1668befdb3be148fd5f9">niter</a> = iter == 0 ? <a class="code" href="structfaiss_1_1OPQMatrix.html#a6406e97b05c831cc19b9343be3b43a1f">niter_pq_0</a> : <a class="code" href="structfaiss_1_1OPQMatrix.html#ab88c87a3931ec356904abf5f1f797a83">niter_pq</a>;</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.verbose = verbose;</div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  pq_regular.train (n, xproj.data());</div>
|
|
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span> </div>
|
|
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (xproj.data(), codes.data(), n);</div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">decode</a> (codes.data(), pq_recons.data(), n);</div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> </div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordtype">float</span> pq_err = <a class="code" href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">fvec_L2sqr</a> (pq_recons.data(), xproj.data(), n * d2) / n;</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>  <span class="keywordflow">if</span> (verbose)</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  printf (<span class="stringliteral">" Iteration %d (%d PQ iterations):"</span></div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="stringliteral">"%.3f s, obj=%g\n"</span>, iter, pq_regular.<a class="code" href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">cp</a>.<a class="code" href="structfaiss_1_1ClusteringParameters.html#a5c7c6f05c75e1668befdb3be148fd5f9">niter</a>,</div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  (<a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> () - t0) / 1000.0, pq_err);</div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span> </div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  {</div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordtype">float</span> *u = tmp.data(), *vt = &tmp [d * d];</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordtype">float</span> *sing_val = &tmp [2 * d * d];</div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  FINTEGER di = d, d2i = d2, ni = n;</div>
|
|
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordtype">float</span> one = 1, zero = 0;</div>
|
|
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span> </div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="comment">// torch.mm(xtrain:t(), pq_recons)</span></div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  sgemm_ (<span class="stringliteral">"Not"</span>, <span class="stringliteral">"Transposed"</span>,</div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  &d2i, &di, &ni,</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  &one, pq_recons.data(), &d2i,</div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  xtrain.data(), &di,</div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  &zero, xxr.data(), &d2i);</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span> </div>
|
|
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  FINTEGER lwork = -1, info = -1;</div>
|
|
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordtype">float</span> worksz;</div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="comment">// workspace query</span></div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  sgesvd_ (<span class="stringliteral">"All"</span>, <span class="stringliteral">"All"</span>,</div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  &d2i, &di, xxr.data(), &d2i,</div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  sing_val,</div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  vt, &d2i, u, &di,</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  &worksz, &lwork, &info);</div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> </div>
|
|
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  lwork = int(worksz);</div>
|
|
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  std::vector<float> work (lwork);</div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="comment">// u and vt swapped</span></div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  sgesvd_ (<span class="stringliteral">"All"</span>, <span class="stringliteral">"All"</span>,</div>
|
|
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  &d2i, &di, xxr.data(), &d2i,</div>
|
|
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  sing_val,</div>
|
|
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  vt, &d2i, u, &di,</div>
|
|
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  work.data(), &lwork, &info);</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>  sgemm_ (<span class="stringliteral">"Transposed"</span>, <span class="stringliteral">"Transposed"</span>,</div>
|
|
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  &di, &d2i, &d2i,</div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  &one, u, &di, vt, &d2i,</div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  &zero, rotation, &di);</div>
|
|
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span> </div>
|
|
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  }</div>
|
|
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  pq_regular.train_type = <a class="code" href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0">ProductQuantizer::Train_hot_start</a>;</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> </div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="comment">// revert A matrix</span></div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="keywordflow">if</span> (d > d_in) {</div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++)</div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  memmove (&<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>[i * d_in], &<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>[i * d], <span class="keyword">sizeof</span>(<a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>[0]) * d_in);</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">A</a>.resize (d_in * d_out);</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> </div>
|
|
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span> }</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> </div>
|
|
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> </div>
|
|
<div class="line"><a name="l00709"></a><span class="lineno"><a class="line" href="structfaiss_1_1OPQMatrix.html#a8e61a84ea6bcbdee1809028b6aaa3aae"> 709</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1OPQMatrix.html#a8e61a84ea6bcbdee1809028b6aaa3aae">OPQMatrix::reverse_transform</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * xt,</div>
|
|
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <a class="code" href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13">transform_transpose</a> (n, xt, x);</div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span> }</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> </div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> <span class="comment"> * NormalizationTransform</span></div>
|
|
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div>
|
|
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> NormalizationTransform::NormalizationTransform (<span class="keywordtype">int</span> d, <span class="keywordtype">float</span> norm):</div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> (d, d), norm (norm)</div>
|
|
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span> {</div>
|
|
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span> }</div>
|
|
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> </div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span> NormalizationTransform::NormalizationTransform ():</div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> (-1, -1), norm (-1)</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> }</div>
|
|
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span> </div>
|
|
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1NormalizationTransform.html#a80c94dc7d17c9a7a9edc627150401571">NormalizationTransform::apply_noalloc</a></div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"><a class="line" href="structfaiss_1_1NormalizationTransform.html#a80c94dc7d17c9a7a9edc627150401571"> 731</a></span>  (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span>* x, <span class="keywordtype">float</span>* xt) <span class="keyword">const</span></div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span> {</div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="keywordflow">if</span> (norm == 2.0) {</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  memcpy (xt, x, <span class="keyword">sizeof</span> (x[0]) * n * d_in);</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  fvec_renorm_L2 (d_in, n, xt);</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  FAISS_THROW_MSG (<span class="stringliteral">"not implemented"</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> }</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> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span> <span class="comment"> * IndexPreTransform</span></div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span> </div>
|
|
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span> IndexPreTransform::IndexPreTransform ():</div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  index(nullptr), own_fields (false)</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> }</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"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a2b16a03c38aa892292ba7a33da2ff7c4"> 751</a></span> IndexPreTransform::IndexPreTransform (</div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> * index):</div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> (index->d, index->metric_type),</div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  index (index), own_fields (false)</div>
|
|
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span> {</div>
|
|
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = index-><a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>;</div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span> }</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span> </div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a7697b1e693b0f099c3c3ec732329c533"> 760</a></span> IndexPreTransform::IndexPreTransform (</div>
|
|
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> * ltrans,</div>
|
|
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> * index):</div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <a class="code" href="structfaiss_1_1Index.html">Index</a> (index->d, index->metric_type),</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  index (index), own_fields (false)</div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span> {</div>
|
|
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = index-><a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>;</div>
|
|
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  prepend_transform (ltrans);</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span> }</div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span> </div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span> <span class="keywordtype">void</span> IndexPreTransform::prepend_transform (<a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> *ltrans)</div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> {</div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  FAISS_THROW_IF_NOT (ltrans-><a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a> == <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>);</div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> && ltrans-><a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a>;</div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  chain.insert (chain.begin(), ltrans);</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a> = ltrans->d_in;</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> </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> IndexPreTransform::~IndexPreTransform ()</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="keywordflow">if</span> (<a class="code" href="structfaiss_1_1IndexPreTransform.html#ae5ec3f184eb211e7d6e204082b52c8c0">own_fields</a>) {</div>
|
|
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < chain.size(); i++)</div>
|
|
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keyword">delete</span> chain[i];</div>
|
|
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keyword">delete</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>;</div>
|
|
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  }</div>
|
|
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span> }</div>
|
|
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> </div>
|
|
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span> </div>
|
|
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div>
|
|
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span> </div>
|
|
<div class="line"><a name="l00791"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a416aaf28d7a533dcf7d2d7de434e993c"> 791</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a416aaf28d7a533dcf7d2d7de434e993c">IndexPreTransform::train</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</div>
|
|
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span> {</div>
|
|
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordtype">int</span> last_untrained = 0;</div>
|
|
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keywordflow">if</span> (!<a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>) {</div>
|
|
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  last_untrained = chain.size();</div>
|
|
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chain.size() - 1; i >= 0; i--) {</div>
|
|
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">if</span> (!chain[i]-><a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>) {</div>
|
|
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  last_untrained = i;</div>
|
|
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  }</div>
|
|
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  }</div>
|
|
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  }</div>
|
|
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *prev_x = x;</div>
|
|
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del;</div>
|
|
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span> </div>
|
|
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  printf(<span class="stringliteral">"IndexPreTransform::train: training chain 0 to %d\n"</span>,</div>
|
|
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  last_untrained);</div>
|
|
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  }</div>
|
|
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span> </div>
|
|
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i <= last_untrained; i++) {</div>
|
|
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">if</span> (i < chain.size()) {</div>
|
|
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> *ltrans = chain [i];</div>
|
|
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="keywordflow">if</span> (!ltrans-><a class="code" href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">is_trained</a>) {</div>
|
|
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  printf(<span class="stringliteral">" Training chain component %d/%zd\n"</span>,</div>
|
|
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  i, chain.size());</div>
|
|
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1OPQMatrix.html">OPQMatrix</a> *opqm = dynamic_cast<OPQMatrix*>(ltrans)) {</div>
|
|
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  opqm->verbose = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  }</div>
|
|
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  }</div>
|
|
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  ltrans-><a class="code" href="structfaiss_1_1VectorTransform.html#a7350d4dd28d60866d55ba4f75d2da84c">train</a> (n, prev_x);</div>
|
|
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  }</div>
|
|
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  printf(<span class="stringliteral">" Training sub-index\n"</span>);</div>
|
|
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  }</div>
|
|
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a1ffe916c958605c38b0b1bfad42485e4">train</a> (n, prev_x);</div>
|
|
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  }</div>
|
|
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="keywordflow">if</span> (i == last_untrained) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="keywordflow">if</span> (verbose) {</div>
|
|
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  printf(<span class="stringliteral">" Applying transform %d/%zd\n"</span>,</div>
|
|
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  i, chain.size());</div>
|
|
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div>
|
|
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div>
|
|
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="keywordtype">float</span> * xt = chain[i]->apply (n, prev_x);</div>
|
|
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="keywordflow">if</span> (prev_x != x) <span class="keyword">delete</span> [] prev_x;</div>
|
|
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  prev_x = xt;</div>
|
|
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  del.set(xt);</div>
|
|
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  }</div>
|
|
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span> </div>
|
|
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a> = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span> }</div>
|
|
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span> </div>
|
|
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span> </div>
|
|
<div class="line"><a name="l00847"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d"> 847</a></span> <span class="keyword">const</span> <span class="keywordtype">float</span> *<a class="code" href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d">IndexPreTransform::apply_chain</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *prev_x = x;</div>
|
|
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del;</div>
|
|
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span> </div>
|
|
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < chain.size(); i++) {</div>
|
|
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keywordtype">float</span> * xt = chain[i]->apply (n, prev_x);</div>
|
|
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del2 (xt);</div>
|
|
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  del2.swap (del);</div>
|
|
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  prev_x = xt;</div>
|
|
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  }</div>
|
|
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  del.release ();</div>
|
|
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">return</span> prev_x;</div>
|
|
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span> }</div>
|
|
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span> </div>
|
|
<div class="line"><a name="l00862"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a03c77c582a3421952e2cba2057083059"> 862</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a03c77c582a3421952e2cba2057083059">IndexPreTransform::add</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)</div>
|
|
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span> {</div>
|
|
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xt = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d">apply_chain</a> (n, x);</div>
|
|
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(xt == x ? <span class="keyword">nullptr</span> : xt);</div>
|
|
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a1b5e9ac70adbce0897dd6c8276ad96f2">add</a> (n, xt);</div>
|
|
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span> }</div>
|
|
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span> </div>
|
|
<div class="line"><a name="l00871"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a07fef0553b2ef2907f394470f61898b2"> 871</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a07fef0553b2ef2907f394470f61898b2">IndexPreTransform::add_with_ids</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> *xids)</div>
|
|
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span> {</div>
|
|
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xt = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d">apply_chain</a> (n, x);</div>
|
|
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(xt == x ? <span class="keyword">nullptr</span> : xt);</div>
|
|
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#aa6931dfe054b33b02c842ff75f7a0c7f">add_with_ids</a> (n, xt, xids);</div>
|
|
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span> }</div>
|
|
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div>
|
|
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span> </div>
|
|
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div>
|
|
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span> </div>
|
|
<div class="line"><a name="l00884"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a7c2c820895d87083742969c281ae4911"> 884</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a7c2c820895d87083742969c281ae4911">IndexPreTransform::search</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> k,</div>
|
|
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordtype">float</span> *distances, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> *labels)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  FAISS_THROW_IF_NOT (<a class="code" href="structfaiss_1_1Index.html#a6e92732617c4dbe364e7678dd8773a7f">is_trained</a>);</div>
|
|
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xt = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d">apply_chain</a> (n, x);</div>
|
|
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del(xt == x ? <span class="keyword">nullptr</span> : xt);</div>
|
|
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">search</a> (n, xt, k, distances, labels);</div>
|
|
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span> }</div>
|
|
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span> </div>
|
|
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span> </div>
|
|
<div class="line"><a name="l00894"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a8e48ac9fde5e76e378553b2a6ec2c86e"> 894</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a8e48ac9fde5e76e378553b2a6ec2c86e">IndexPreTransform::reset</a> () {</div>
|
|
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a849361f5f0ab0aba8d419c86f2594191">reset</a>();</div>
|
|
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = 0;</div>
|
|
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span> }</div>
|
|
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span> </div>
|
|
<div class="line"><a name="l00899"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#ad4e59f4dacc1d8183a788510680f0df5"> 899</a></span> <span class="keywordtype">long</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#ad4e59f4dacc1d8183a788510680f0df5">IndexPreTransform::remove_ids</a> (<span class="keyword">const</span> <a class="code" href="structfaiss_1_1IDSelector.html">IDSelector</a> & sel) {</div>
|
|
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keywordtype">long</span> nremove = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#af8bf7bd97aeed8ad5fc48b242379a68a">remove_ids</a> (sel);</div>
|
|
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a> = <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a6970683faa021b7a6f1a0865c0d4eccd">ntotal</a>;</div>
|
|
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="keywordflow">return</span> nremove;</div>
|
|
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span> }</div>
|
|
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span> </div>
|
|
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span> </div>
|
|
<div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndexPreTransform.html#a370dd6ef091393401fa9b60e3d1d25b2"> 906</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1IndexPreTransform.html#a370dd6ef091393401fa9b60e3d1d25b2">IndexPreTransform::reconstruct_n</a> (<a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> i0, <a class="code" href="structfaiss_1_1Index.html#a040c6aed1f224f3ea7bf58eebc0c31a4">idx_t</a> ni, <span class="keywordtype">float</span> *recons)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordtype">float</span> *x = chain.empty() ? recons : <span class="keyword">new</span> <span class="keywordtype">float</span> [ni * <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">d</a>];</div>
|
|
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del (recons == x ? <span class="keyword">nullptr</span> : x);</div>
|
|
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="comment">// initial reconstruction</span></div>
|
|
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <a class="code" href="structfaiss_1_1IndexPreTransform.html#aee3cbbe7915ec9ed13d59ca9276bdefc">index</a>-><a class="code" href="structfaiss_1_1Index.html#a1936604fffe16b0ef2a3879305950738">reconstruct_n</a> (i0, ni, x);</div>
|
|
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span> </div>
|
|
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="comment">// revert transformations from last to first</span></div>
|
|
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chain.size() - 1; i >= 0; i--) {</div>
|
|
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  <span class="keywordtype">float</span> *x_pre = i == 0 ? recons : <span class="keyword">new</span> <span class="keywordtype">float</span> [chain[i]->d_in * ni];</div>
|
|
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  <a class="code" href="structfaiss_1_1ScopeDeleter.html">ScopeDeleter<float></a> del2 (x_pre == recons ? <span class="keyword">nullptr</span> : x_pre);</div>
|
|
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  chain [i]->reverse_transform (ni, x, x_pre);</div>
|
|
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  del2.swap (del); <span class="comment">// delete [] x;</span></div>
|
|
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  x = x_pre;</div>
|
|
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  }</div>
|
|
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span> }</div>
|
|
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span> </div>
|
|
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span> </div>
|
|
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div>
|
|
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="comment">/*********************************************</span></div>
|
|
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span> <span class="comment"> * RemapDimensionsTransform</span></div>
|
|
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span> <span class="comment"> *********************************************/</span></div>
|
|
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span> </div>
|
|
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span> </div>
|
|
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span> RemapDimensionsTransform::RemapDimensionsTransform (</div>
|
|
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <span class="keywordtype">int</span> d_in, <span class="keywordtype">int</span> d_out, <span class="keyword">const</span> <span class="keywordtype">int</span> *map_in):</div>
|
|
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> (d_in, d_out)</div>
|
|
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span> {</div>
|
|
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  map.resize (d_out);</div>
|
|
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < d_out; i++) {</div>
|
|
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  map[i] = map_in[i];</div>
|
|
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  FAISS_THROW_IF_NOT (map[i] == -1 || (map[i] >= 0 && map[i] < d_in));</div>
|
|
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  }</div>
|
|
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span> }</div>
|
|
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span> </div>
|
|
<div class="line"><a name="l00941"></a><span class="lineno"><a class="line" href="structfaiss_1_1RemapDimensionsTransform.html#ab07ceccc4dc767a000879c72337ddd69"> 941</a></span> RemapDimensionsTransform::RemapDimensionsTransform (</div>
|
|
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keywordtype">int</span> d_in, <span class="keywordtype">int</span> d_out, <span class="keywordtype">bool</span> uniform): <a class="code" href="structfaiss_1_1VectorTransform.html">VectorTransform</a> (d_in, d_out)</div>
|
|
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span> {</div>
|
|
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a>.resize (d_out, -1);</div>
|
|
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span> </div>
|
|
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">if</span> (uniform) {</div>
|
|
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordflow">if</span> (d_in < d_out) {</div>
|
|
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < d_in; i++) {</div>
|
|
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a> [i * d_out / d_in] = i;</div>
|
|
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  }</div>
|
|
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++) {</div>
|
|
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a> [i] = i * d_in / <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  }</div>
|
|
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  }</div>
|
|
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < d_in && i < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; i++)</div>
|
|
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a> [i] = i;</div>
|
|
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  }</div>
|
|
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span> }</div>
|
|
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span> </div>
|
|
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span> </div>
|
|
<div class="line"><a name="l00963"></a><span class="lineno"><a class="line" href="structfaiss_1_1RemapDimensionsTransform.html#a550be3d40c221d2134bf06a13dd33c4d"> 963</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a550be3d40c221d2134bf06a13dd33c4d">RemapDimensionsTransform::apply_noalloc</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * x,</div>
|
|
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="keywordtype">float</span> *xt)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="keywordflow">for</span> (idx_t i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; j++) {</div>
|
|
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  xt[j] = <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a>[j] < 0 ? 0 : x[<a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a>[j]];</div>
|
|
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  }</div>
|
|
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  x += d_in;</div>
|
|
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  xt += <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  }</div>
|
|
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span> }</div>
|
|
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> </div>
|
|
<div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="structfaiss_1_1RemapDimensionsTransform.html#a2fc83e79e4d3c7853bfd6931cbbaf82a"> 975</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a2fc83e79e4d3c7853bfd6931cbbaf82a">RemapDimensionsTransform::reverse_transform</a> (idx_t n, <span class="keyword">const</span> <span class="keywordtype">float</span> * xt,</div>
|
|
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  memset (x, 0, <span class="keyword">sizeof</span> (*x) * n * d_in);</div>
|
|
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">for</span> (idx_t i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>; j++) {</div>
|
|
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">if</span> (<a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a>[j] >= 0) x[<a class="code" href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">map</a>[j]] = xt[j];</div>
|
|
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  }</div>
|
|
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  x += d_in;</div>
|
|
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  xt += <a class="code" href="structfaiss_1_1VectorTransform.html#a589d612f7b1773614619a0cbecd728a9">d_out</a>;</div>
|
|
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  }</div>
|
|
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span> }</div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html_a1642efca4f5eb524c29722b0441c4d13"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html#a1642efca4f5eb524c29722b0441c4d13">faiss::LinearTransform::transform_transpose</a></div><div class="ttdeci">void transform_transpose(idx_t n, const float *y, float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00134">VectorTransform.cpp:134</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_1ClusteringParameters_html_a5c7c6f05c75e1668befdb3be148fd5f9"><div class="ttname"><a href="structfaiss_1_1ClusteringParameters.html#a5c7c6f05c75e1668befdb3be148fd5f9">faiss::ClusteringParameters::niter</a></div><div class="ttdeci">int niter</div><div class="ttdoc">clustering iterations </div><div class="ttdef"><b>Definition:</b> <a href="Clustering_8h_source.html#l00025">Clustering.h:25</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_a12cb3e05989dee37592b682070c31000"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a12cb3e05989dee37592b682070c31000">faiss::OPQMatrix::niter</a></div><div class="ttdeci">int niter</div><div class="ttdoc">Number of outer training iterations. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00183">VectorTransform.h:183</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a7afbf9d96276f021981e99f064254208"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a7afbf9d96276f021981e99f064254208">faiss::ProductQuantizer::decode</a></div><div class="ttdeci">void decode(const uint8_t *code, float *x) const </div><div class="ttdoc">decode a vector from a given code (or n vectors if third argument) </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00338">ProductQuantizer.cpp:338</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a7466bd32de31640860393a701eaac5ad"><div class="ttname"><a href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">faiss::fvec_L2sqr</a></div><div class="ttdeci">float fvec_L2sqr(const float *x, const float *y, size_t d)</div><div class="ttdoc">Squared L2 distance between two vectors. </div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l00574">utils.cpp:574</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RandomRotationMatrix_html_a857ad8c32fb76b3298d4eea4338ff66f"><div class="ttname"><a href="structfaiss_1_1RandomRotationMatrix.html#a857ad8c32fb76b3298d4eea4338ff66f">faiss::RandomRotationMatrix::init</a></div><div class="ttdeci">void init(int seed)</div><div class="ttdoc">must be called before the transform is used </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00164">VectorTransform.cpp:164</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_a8e48ac9fde5e76e378553b2a6ec2c86e"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a8e48ac9fde5e76e378553b2a6ec2c86e">faiss::IndexPreTransform::reset</a></div><div class="ttdeci">void reset() override</div><div class="ttdoc">removes all elements from the database. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00894">VectorTransform.cpp:894</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a849361f5f0ab0aba8d419c86f2594191"><div class="ttname"><a href="structfaiss_1_1Index.html#a849361f5f0ab0aba8d419c86f2594191">faiss::Index::reset</a></div><div class="ttdeci">virtual void reset()=0</div><div class="ttdoc">removes all elements from the database. </div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_ab88c87a3931ec356904abf5f1f797a83"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#ab88c87a3931ec356904abf5f1f797a83">faiss::OPQMatrix::niter_pq</a></div><div class="ttdeci">int niter_pq</div><div class="ttdoc">Number of training iterations for the PQ. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00184">VectorTransform.h:184</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html_aa40e156ef57fe206cd5f3a58ec0660da"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html#aa40e156ef57fe206cd5f3a58ec0660da">faiss::LinearTransform::A</a></div><div class="ttdeci">std::vector< float > A</div><div class="ttdoc">! whether to use the bias term </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00082">VectorTransform.h:82</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a14884d253128c7af5891a65082ad7dc6"><div class="ttname"><a href="namespacefaiss.html#a14884d253128c7af5891a65082ad7dc6">faiss::fvecs_maybe_subsample</a></div><div class="ttdeci">const float * fvecs_maybe_subsample(size_t d, size_t *n, size_t nmax, const float *x, bool verbose, long seed)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01973">utils.cpp:1973</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a1ffe916c958605c38b0b1bfad42485e4"><div class="ttname"><a href="structfaiss_1_1Index.html#a1ffe916c958605c38b0b1bfad42485e4">faiss::Index::train</a></div><div class="ttdeci">virtual void train(idx_t, const float *)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00089">Index.h:89</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_a4e48e801f98ba2cf57c03b0913d6fafc"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#a4e48e801f98ba2cf57c03b0913d6fafc">faiss::PCAMatrix::eigen_power</a></div><div class="ttdeci">float eigen_power</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00132">VectorTransform.h:132</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IDSelector_html"><div class="ttname"><a href="structfaiss_1_1IDSelector.html">faiss::IDSelector</a></div><div class="ttdef"><b>Definition:</b> <a href="AuxIndexStructures_8h_source.html#l00052">AuxIndexStructures.h:52</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html_a2fffd6064defb7c3fdaf143c0c4a9bc7"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html#a2fffd6064defb7c3fdaf143c0c4a9bc7">faiss::LinearTransform::LinearTransform</a></div><div class="ttdeci">LinearTransform(int d_in=0, int d_out=0, bool have_bias=false)</div><div class="ttdoc">both d_in &gt; d_out and d_out &lt; d_in are supported </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00099">VectorTransform.cpp:99</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html">faiss::PCAMatrix</a></div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00124">VectorTransform.h:124</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aa6931dfe054b33b02c842ff75f7a0c7f"><div class="ttname"><a href="structfaiss_1_1Index.html#aa6931dfe054b33b02c842ff75f7a0c7f">faiss::Index::add_with_ids</a></div><div class="ttdeci">virtual void add_with_ids(idx_t n, const float *x, const long *xids)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00030">Index.cpp:30</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html">faiss::OPQMatrix</a></div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00180">VectorTransform.h:180</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScopeDeleter_html"><div class="ttname"><a href="structfaiss_1_1ScopeDeleter.html">faiss::ScopeDeleter</a></div><div class="ttdef"><b>Definition:</b> <a href="FaissException_8h_source.html#l00039">FaissException.h:39</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_a8f2dd12da8dce3cbeb22da9c5d4ec3e7"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#a8f2dd12da8dce3cbeb22da9c5d4ec3e7">faiss::PCAMatrix::train</a></div><div class="ttdeci">void train(Index::idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00271">VectorTransform.cpp:271</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_a721c338c1df5c99471db82e6d3dc8f93"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#a721c338c1df5c99471db82e6d3dc8f93">faiss::PCAMatrix::mean</a></div><div class="ttdeci">std::vector< float > mean</div><div class="ttdoc">Mean, size d_in. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00144">VectorTransform.h:144</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RemapDimensionsTransform_html_a09202a195ff5f75f83e68792751a637f"><div class="ttname"><a href="structfaiss_1_1RemapDimensionsTransform.html#a09202a195ff5f75f83e68792751a637f">faiss::RemapDimensionsTransform::map</a></div><div class="ttdeci">std::vector< int > map</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00207">VectorTransform.h:207</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_aa773a5763ebdd1561152b34453fda96d"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#aa773a5763ebdd1561152b34453fda96d">faiss::IndexPreTransform::apply_chain</a></div><div class="ttdeci">const float * apply_chain(idx_t n, const float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00847">VectorTransform.cpp:847</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_aef5c130774e5d4f697a3e1c82647bfd3"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#aef5c130774e5d4f697a3e1c82647bfd3">faiss::PCAMatrix::PCAMat</a></div><div class="ttdeci">std::vector< float > PCAMat</div><div class="ttdoc">PCA matrix, size d_in * d_in. </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00150">VectorTransform.h:150</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_a416aaf28d7a533dcf7d2d7de434e993c"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a416aaf28d7a533dcf7d2d7de434e993c">faiss::IndexPreTransform::train</a></div><div class="ttdeci">void train(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00791">VectorTransform.cpp:791</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ae5a340ee5a4b1d35a565b167de2a2ef1"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">faiss::ProductQuantizer::compute_codes</a></div><div class="ttdeci">void compute_codes(const float *x, uint8_t *codes, size_t n) const </div><div class="ttdoc">same as compute_code for several vectors </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8cpp_source.html#l00385">ProductQuantizer.cpp:385</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a2a002388d2c081c2dbab8508dcefe73d"><div class="ttname"><a href="structfaiss_1_1Index.html#a2a002388d2c081c2dbab8508dcefe73d">faiss::Index::d</a></div><div class="ttdeci">int d</div><div class="ttdoc">vector dimension </div><div class="ttdef"><b>Definition:</b> <a href="Index_8h_source.html#l00064">Index.h:64</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html_ab0383f690aeb823876e9143febad1a87"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html#ab0383f690aeb823876e9143febad1a87">faiss::LinearTransform::b</a></div><div class="ttdeci">std::vector< float > b</div><div class="ttdoc">bias vector, size d_out </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00085">VectorTransform.h:85</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a1936604fffe16b0ef2a3879305950738"><div class="ttname"><a href="structfaiss_1_1Index.html#a1936604fffe16b0ef2a3879305950738">faiss::Index::reconstruct_n</a></div><div class="ttdeci">virtual void reconstruct_n(idx_t i0, idx_t ni, float *recons) const </div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00048">Index.cpp:48</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_a1b5e9ac70adbce0897dd6c8276ad96f2"><div class="ttname"><a href="structfaiss_1_1Index.html#a1b5e9ac70adbce0897dd6c8276ad96f2">faiss::Index::add</a></div><div class="ttdeci">virtual void add(idx_t n, const float *x)=0</div></div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html">faiss::LinearTransform</a></div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00077">VectorTransform.h:77</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_a1e314577db0c6cd4a709503f73eb71e2"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a1e314577db0c6cd4a709503f73eb71e2">faiss::OPQMatrix::train</a></div><div class="ttdeci">void train(Index::idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00548">VectorTransform.cpp:548</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_ac9a4c97b5861081dfd8ca5881bb1a677"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#ac9a4c97b5861081dfd8ca5881bb1a677">faiss::PCAMatrix::balanced_bins</a></div><div class="ttdeci">int balanced_bins</div><div class="ttdoc">try to distribute output eigenvectors in this many bins </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00141">VectorTransform.h:141</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_ab511f1ddf608c00204555881ca28cb02"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#ab511f1ddf608c00204555881ca28cb02">faiss::VectorTransform::is_trained</a></div><div class="ttdeci">bool is_trained</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00042">VectorTransform.h:42</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_1IndexPreTransform_html_a370dd6ef091393401fa9b60e3d1d25b2"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a370dd6ef091393401fa9b60e3d1d25b2">faiss::IndexPreTransform::reconstruct_n</a></div><div class="ttdeci">void reconstruct_n(idx_t i0, idx_t ni, float *recons) const override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00906">VectorTransform.cpp:906</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_1NormalizationTransform_html_a80c94dc7d17c9a7a9edc627150401571"><div class="ttname"><a href="structfaiss_1_1NormalizationTransform.html#a80c94dc7d17c9a7a9edc627150401571">faiss::NormalizationTransform::apply_noalloc</a></div><div class="ttdeci">void apply_noalloc(idx_t n, const float *x, float *xt) const override</div><div class="ttdoc">same as apply, but result is pre-allocated </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00731">VectorTransform.cpp:731</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a3a41c6286095e731be744548d9535a35a4960d143d2aa49cf92028cf3470c47a0">faiss::ProductQuantizer::Train_hot_start</a></div><div class="ttdoc">the centroids are already initialized </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00042">ProductQuantizer.h:42</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_af2a71f7d5402ae02ce169a4cc83020eb"><div class="ttname"><a href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">faiss::getmillisecs</a></div><div class="ttdeci">double getmillisecs()</div><div class="ttdoc">ms elapsed since some arbitrary epoch </div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l00074">utils.cpp:74</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_af8bf7bd97aeed8ad5fc48b242379a68a"><div class="ttname"><a href="structfaiss_1_1Index.html#af8bf7bd97aeed8ad5fc48b242379a68a">faiss::Index::remove_ids</a></div><div class="ttdeci">virtual long remove_ids(const IDSelector &sel)</div><div class="ttdef"><b>Definition:</b> <a href="Index_8cpp_source.html#l00037">Index.cpp:37</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Index_html_aced51b1ebc33c47ab3ae15ea906559a7"><div class="ttname"><a href="structfaiss_1_1Index.html#aced51b1ebc33c47ab3ae15ea906559a7">faiss::Index::search</a></div><div class="ttdeci">virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const =0</div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html">faiss::VectorTransform</a></div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00028">VectorTransform.h:28</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_afb68fe89ad5e948974da1b70d7b4157c"><div class="ttname"><a href="namespacefaiss.html#afb68fe89ad5e948974da1b70d7b4157c">faiss::matrix_qr</a></div><div class="ttdeci">void matrix_qr(int m, int n, float *a)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01320">utils.cpp:1320</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_1OPQMatrix_html_a6406e97b05c831cc19b9343be3b43a1f"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a6406e97b05c831cc19b9343be3b43a1f">faiss::OPQMatrix::niter_pq_0</a></div><div class="ttdeci">int niter_pq_0</div><div class="ttdoc">same, for the first outer iteration </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00185">VectorTransform.h:185</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_a8e61a84ea6bcbdee1809028b6aaa3aae"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a8e61a84ea6bcbdee1809028b6aaa3aae">faiss::OPQMatrix::reverse_transform</a></div><div class="ttdeci">void reverse_transform(idx_t n, const float *xt, float *x) const override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00709">VectorTransform.cpp:709</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_af265acf5aa1bcda60898002287e6a3d6"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#af265acf5aa1bcda60898002287e6a3d6">faiss::ProductQuantizer::cp</a></div><div class="ttdeci">ClusteringParameters cp</div><div class="ttdoc">parameters used during clustering </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00049">ProductQuantizer.h:49</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a4369329c9dbdfe23e3f35d09ba7b5c6e"><div class="ttname"><a href="namespacefaiss.html#a4369329c9dbdfe23e3f35d09ba7b5c6e">faiss::ivec_checksum</a></div><div class="ttdeci">size_t ivec_checksum(size_t n, const int *a)</div><div class="ttdoc">compute a checksum on a table. </div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01670">utils.cpp:1670</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_a7350d4dd28d60866d55ba4f75d2da84c"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#a7350d4dd28d60866d55ba4f75d2da84c">faiss::VectorTransform::train</a></div><div class="ttdeci">virtual void train(idx_t n, const float *x)</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00080">VectorTransform.cpp:80</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RandomRotationMatrix_html_a3ad86e9ae3bdc2090c1f5fc62a335c16"><div class="ttname"><a href="structfaiss_1_1RandomRotationMatrix.html#a3ad86e9ae3bdc2090c1f5fc62a335c16">faiss::RandomRotationMatrix::reverse_transform</a></div><div class="ttdeci">void reverse_transform(idx_t n, const float *xt, float *x) const override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00189">VectorTransform.cpp:189</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_a101ce54f1c60df19478801aa942470d9"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#a101ce54f1c60df19478801aa942470d9">faiss::VectorTransform::reverse_transform</a></div><div class="ttdeci">virtual void reverse_transform(idx_t n, const float *xt, float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00085">VectorTransform.cpp:85</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RemapDimensionsTransform_html_a2fc83e79e4d3c7853bfd6931cbbaf82a"><div class="ttname"><a href="structfaiss_1_1RemapDimensionsTransform.html#a2fc83e79e4d3c7853bfd6931cbbaf82a">faiss::RemapDimensionsTransform::reverse_transform</a></div><div class="ttdeci">void reverse_transform(idx_t n, const float *xt, float *x) const override</div><div class="ttdoc">reverse transform correct only when the mapping is a permuation </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00975">VectorTransform.cpp:975</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_abf427521a66cbfaaf0b7aae16bcb6e93"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#abf427521a66cbfaaf0b7aae16bcb6e93">faiss::PCAMatrix::reverse_transform</a></div><div class="ttdeci">void reverse_transform(idx_t n, const float *xt, float *x) const override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00522">VectorTransform.cpp:522</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_afdd5b2c74d19ccc5c7a6e0199333321a"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#afdd5b2c74d19ccc5c7a6e0199333321a">faiss::OPQMatrix::max_train_points</a></div><div class="ttdeci">size_t max_train_points</div><div class="ttdoc">if there are too many training points, resample </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00188">VectorTransform.h:188</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_ae586dc89db6c57753c687473417742a6"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#ae586dc89db6c57753c687473417742a6">faiss::PCAMatrix::copy_from</a></div><div class="ttdeci">void copy_from(const PCAMatrix &other)</div><div class="ttdoc">copy pre-trained PCA matrix </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00413">VectorTransform.cpp:413</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_1OPQMatrix_html_a6eb9d18ff15b1c598d3aa3bc9ab84519"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a6eb9d18ff15b1c598d3aa3bc9ab84519">faiss::OPQMatrix::OPQMatrix</a></div><div class="ttdeci">OPQMatrix(int d=0, int M=1, int d2=-1)</div><div class="ttdoc">if d2 != -1, output vectors of this dimension </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00535">VectorTransform.cpp:535</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_1PCAMatrix_html_a117a70b8fca6d125725fe49fddebf97b"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#a117a70b8fca6d125725fe49fddebf97b">faiss::PCAMatrix::prepare_Ab</a></div><div class="ttdeci">void prepare_Ab()</div><div class="ttdoc">called after mean, PCAMat and eigenvalues are computed </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00423">VectorTransform.cpp:423</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_a03c77c582a3421952e2cba2057083059"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a03c77c582a3421952e2cba2057083059">faiss::IndexPreTransform::add</a></div><div class="ttdeci">void add(idx_t n, const float *x) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00862">VectorTransform.cpp:862</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RemapDimensionsTransform_html_a550be3d40c221d2134bf06a13dd33c4d"><div class="ttname"><a href="structfaiss_1_1RemapDimensionsTransform.html#a550be3d40c221d2134bf06a13dd33c4d">faiss::RemapDimensionsTransform::apply_noalloc</a></div><div class="ttdeci">void apply_noalloc(idx_t n, const float *x, float *xt) const override</div><div class="ttdoc">same as apply, but result is pre-allocated </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00963">VectorTransform.cpp:963</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html">faiss::ProductQuantizer</a></div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00025">ProductQuantizer.h:25</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_1PCAMatrix_html_ae80e130c0667b66cea608c4926d7d561"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#ae80e130c0667b66cea608c4926d7d561">faiss::PCAMatrix::eigenvalues</a></div><div class="ttdeci">std::vector< float > eigenvalues</div><div class="ttdoc">eigenvalues of covariance matrix (= squared singular values) </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00147">VectorTransform.h:147</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_a7c2c820895d87083742969c281ae4911"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a7c2c820895d87083742969c281ae4911">faiss::IndexPreTransform::search</a></div><div class="ttdeci">void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00884">VectorTransform.cpp:884</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_a07fef0553b2ef2907f394470f61898b2"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#a07fef0553b2ef2907f394470f61898b2">faiss::IndexPreTransform::add_with_ids</a></div><div class="ttdeci">void add_with_ids(idx_t n, const float *x, const long *xids) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00871">VectorTransform.cpp:871</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_af111f055b7571703a3aa270d89e99321"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#af111f055b7571703a3aa270d89e99321">faiss::PCAMatrix::random_rotation</a></div><div class="ttdeci">bool random_rotation</div><div class="ttdoc">random rotation after PCA </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00135">VectorTransform.h:135</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PCAMatrix_html_abdce90f57a3c4401f5230f03da901e0d"><div class="ttname"><a href="structfaiss_1_1PCAMatrix.html#abdce90f57a3c4401f5230f03da901e0d">faiss::PCAMatrix::max_points_per_d</a></div><div class="ttdeci">size_t max_points_per_d</div><div class="ttdoc">ratio between # training vectors and dimension </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00138">VectorTransform.h:138</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ClusteringParameters_html_a993e0a035248faad6e292a5ef9af1953"><div class="ttname"><a href="structfaiss_1_1ClusteringParameters.html#a993e0a035248faad6e292a5ef9af1953">faiss::ClusteringParameters::max_points_per_centroid</a></div><div class="ttdeci">int max_points_per_centroid</div><div class="ttdoc">to limit size of dataset </div><div class="ttdef"><b>Definition:</b> <a href="Clustering_8h_source.html#l00034">Clustering.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_af3b3a8bf95911f4b28128001c83f91a5"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#af3b3a8bf95911f4b28128001c83f91a5">faiss::VectorTransform::apply</a></div><div class="ttdeci">float * apply(idx_t n, const float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00072">VectorTransform.cpp:72</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndexPreTransform_html_ad4e59f4dacc1d8183a788510680f0df5"><div class="ttname"><a href="structfaiss_1_1IndexPreTransform.html#ad4e59f4dacc1d8183a788510680f0df5">faiss::IndexPreTransform::remove_ids</a></div><div class="ttdeci">long remove_ids(const IDSelector &sel) override</div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00899">VectorTransform.cpp:899</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1VectorTransform_html_a90f1a218c224c049f1bd8b77a78d6aa0"><div class="ttname"><a href="structfaiss_1_1VectorTransform.html#a90f1a218c224c049f1bd8b77a78d6aa0">faiss::VectorTransform::apply_noalloc</a></div><div class="ttdeci">virtual void apply_noalloc(idx_t n, const float *x, float *xt) const =0</div><div class="ttdoc">same as apply, but result is pre-allocated </div></div>
|
|
<div class="ttc" id="structfaiss_1_1OPQMatrix_html_a07ad0c0c84f96a6880c1c8eaf09596e3"><div class="ttname"><a href="structfaiss_1_1OPQMatrix.html#a07ad0c0c84f96a6880c1c8eaf09596e3">faiss::OPQMatrix::M</a></div><div class="ttdeci">int M</div><div class="ttdoc">nb of subquantizers </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8h_source.html#l00182">VectorTransform.h:182</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1LinearTransform_html_af9c20b4ae67691b5713489884ca9f80f"><div class="ttname"><a href="structfaiss_1_1LinearTransform.html#af9c20b4ae67691b5713489884ca9f80f">faiss::LinearTransform::apply_noalloc</a></div><div class="ttdeci">void apply_noalloc(idx_t n, const float *x, float *xt) const override</div><div class="ttdoc">same as apply, but result is pre-allocated </div><div class="ttdef"><b>Definition:</b> <a href="VectorTransform_8cpp_source.html#l00105">VectorTransform.cpp:105</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>
|