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
1085 lines
158 KiB
HTML
1085 lines
158 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/PolysemousTraining.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/PolysemousTraining.cpp</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright (c) 2015-present, Facebook, Inc.</span></div>
|
|
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * All rights reserved.</span></div>
|
|
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * This source code is licensed under the BSD+Patents license found in the</span></div>
|
|
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * LICENSE file in the root directory of this source tree.</span></div>
|
|
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div>
|
|
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include "PolysemousTraining.h"</span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <cstdlib></span></div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <cmath></span></div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include <cstring></span></div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div>
|
|
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include "utils.h"</span></div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include "hamming.h"</span></div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "FaissAssert.h"</span></div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"> * Mixed PQ / Hamming</span></div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="keyword">namespace </span>faiss {</div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment">/****************************************************</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * Optimization code</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> ****************************************************/</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> SimulatedAnnealingParameters::SimulatedAnnealingParameters ()</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="comment">// set some reasonable defaults for the optimization</span></div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  init_temperature = 0.7;</div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  temperature_decay = pow (0.9, 1/500.);</div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="comment">// reduce by a factor 0.9 every 500 it</span></div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  n_iter = 500000;</div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  n_redo = 2;</div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  seed = 123;</div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  verbose = 0;</div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  only_bit_flips = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  init_random = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> }</div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment">// what would the cost update be if iw and jw were swapped?</span></div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment">// default implementation just computes both and computes the difference</span></div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="keywordtype">double</span> PermutationObjective::cost_update (</div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordtype">double</span> orig_cost = compute_cost (perm);</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>  std::vector<int> perm2 (n);</div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  perm2[i] = perm[i];</div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  perm2[iw] = perm[jw];</div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  perm2[jw] = perm[iw];</div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordtype">double</span> new_cost = compute_cost (perm2.data());</div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordflow">return</span> new_cost - orig_cost;</div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> }</div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </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> </div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#ab258eaf892742e37dd2c3bfd3b1c39e1"> 67</a></span> <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#ab258eaf892742e37dd2c3bfd3b1c39e1">SimulatedAnnealingOptimizer::SimulatedAnnealingOptimizer</a> (</div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <a class="code" href="structfaiss_1_1PermutationObjective.html">PermutationObjective</a> *obj,</div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keyword">const</span> <a class="code" href="structfaiss_1_1SimulatedAnnealingParameters.html">SimulatedAnnealingParameters</a> &p):</div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <a class="code" href="structfaiss_1_1SimulatedAnnealingParameters.html">SimulatedAnnealingParameters</a> (p),</div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  obj (obj),</div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  n(obj->n),</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  logfile (nullptr)</div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> {</div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  rnd = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1RandomGenerator.html">RandomGenerator</a> (p.seed);</div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  FAISS_THROW_IF_NOT (n < 100000 && n >=0 );</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> SimulatedAnnealingOptimizer::~SimulatedAnnealingOptimizer ()</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> {</div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keyword">delete</span> rnd;</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> <span class="comment">// run the optimization and return the best result in best_perm</span></div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">double</span> SimulatedAnnealingOptimizer::run_optimization (<span class="keywordtype">int</span> * best_perm)</div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> {</div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">double</span> min_cost = 1e30;</div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="comment">// just do a few runs of the annealing and keep the lowest output cost</span></div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> it = 0; it < n_redo; it++) {</div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  std::vector<int> perm(n);</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#a90edfc401372aa1a2a832b403e26bfd1">n</a>; i++)</div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  perm[i] = i;</div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">if</span> (init_random) {</div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#a90edfc401372aa1a2a832b403e26bfd1">n</a>; i++) {</div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordtype">int</span> j = i + rnd-><a class="code" href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">rand_int</a> (n - i);</div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  std::swap (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  }</div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordtype">float</span> cost = optimize (perm.data());</div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordflow">if</span> (logfile) fprintf (logfile, <span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span>(verbose > 1) {</div>
|
|
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  printf (<span class="stringliteral">" optimization run %d: cost=%g %s\n"</span>,</div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  it, cost, cost < min_cost ? <span class="stringliteral">"keep"</span> : <span class="stringliteral">""</span>);</div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  }</div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">if</span> (cost < min_cost) {</div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  memcpy (best_perm, perm.data(), <span class="keyword">sizeof</span>(perm[0]) * n);</div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  min_cost = cost;</div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  }</div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">return</span> min_cost;</div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> }</div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment">// perform the optimization loop, starting from and modifying</span></div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment">// permutation in-place</span></div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="keywordtype">double</span> SimulatedAnnealingOptimizer::optimize (<span class="keywordtype">int</span> *perm)</div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> {</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordtype">double</span> cost = <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#aa8ff19f97482c6213b2a8ff3b190412b">init_cost</a> = obj->compute_cost (perm);</div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordtype">int</span> log2n = 0;</div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordflow">while</span> (!(n <= (1 << log2n))) log2n++;</div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordtype">double</span> temperature = init_temperature;</div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">int</span> n_swap = 0, n_hot = 0;</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> it = 0; it < n_iter; it++) {</div>
|
|
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  temperature = temperature * temperature_decay;</div>
|
|
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordtype">int</span> iw, jw;</div>
|
|
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">if</span> (only_bit_flips) {</div>
|
|
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  iw = rnd-><a class="code" href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">rand_int</a> (n);</div>
|
|
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  jw = iw ^ (1 << rnd-><a class="code" href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">rand_int</a> (log2n));</div>
|
|
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  iw = rnd-><a class="code" href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">rand_int</a> (n);</div>
|
|
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  jw = rnd-><a class="code" href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">rand_int</a> (n - 1);</div>
|
|
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span> (jw == iw) jw++;</div>
|
|
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  }</div>
|
|
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordtype">double</span> delta_cost = obj->cost_update (perm, iw, jw);</div>
|
|
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">if</span> (delta_cost < 0 || rnd->rand_float () < temperature) {</div>
|
|
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  std::swap (perm[iw], perm[jw]);</div>
|
|
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  cost += delta_cost;</div>
|
|
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  n_swap++;</div>
|
|
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (delta_cost >= 0) n_hot++;</div>
|
|
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  }</div>
|
|
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">if</span> (verbose > 2 || (verbose > 1 && it % 10000 == 0)) {</div>
|
|
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  printf (<span class="stringliteral">" iteration %d cost %g temp %g n_swap %d "</span></div>
|
|
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="stringliteral">"(%d hot) \r"</span>,</div>
|
|
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  it, cost, temperature, n_swap, n_hot);</div>
|
|
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  fflush(stdout);</div>
|
|
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div>
|
|
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keywordflow">if</span> (logfile) {</div>
|
|
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  fprintf (logfile, <span class="stringliteral">"%d %g %g %d %d\n"</span>,</div>
|
|
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  it, cost, temperature, n_swap, n_hot);</div>
|
|
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  }</div>
|
|
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  }</div>
|
|
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">if</span> (verbose > 1) printf(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">return</span> cost;</div>
|
|
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> }</div>
|
|
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div>
|
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div>
|
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div>
|
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </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"> * Cost functions: ReproduceDistanceTable</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"> 164</span> </div>
|
|
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span> </div>
|
|
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div>
|
|
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div>
|
|
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div>
|
|
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> hamming_dis (uint64_t a, uint64_t b)</div>
|
|
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> {</div>
|
|
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">return</span> __builtin_popcountl (a ^ b);</div>
|
|
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> }</div>
|
|
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> </div>
|
|
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="comment">/// optimize permutation to reproduce a distance table with Hamming distances</span></div>
|
|
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="comment"></span><span class="keyword">struct </span>ReproduceWithHammingObjective : PermutationObjective {</div>
|
|
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordtype">int</span> nbits;</div>
|
|
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordtype">double</span> dis_weight_factor;</div>
|
|
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div>
|
|
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keyword">static</span> <span class="keywordtype">double</span> sqr (<span class="keywordtype">double</span> x) { <span class="keywordflow">return</span> x * x; }</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>  <span class="comment">// weihgting of distances: it is more important to reproduce small</span></div>
|
|
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="comment">// distances well</span></div>
|
|
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordtype">double</span> dis_weight (<span class="keywordtype">double</span> x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">return</span> exp (-dis_weight_factor * x);</div>
|
|
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  }</div>
|
|
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div>
|
|
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  std::vector<double> target_dis; <span class="comment">// wanted distances (size n^2)</span></div>
|
|
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  std::vector<double> weights; <span class="comment">// weights for each distance (size n^2)</span></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>  <span class="comment">// cost = quadratic difference between actual distance and Hamming distance</span></div>
|
|
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordtype">double</span> compute_cost(<span class="keyword">const</span> <span class="keywordtype">int</span>* perm)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordtype">double</span> cost = 0;</div>
|
|
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordtype">double</span> wanted = target_dis[i * n + j];</div>
|
|
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordtype">double</span> w = weights[i * n + j];</div>
|
|
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordtype">double</span> actual = hamming_dis(perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  cost += w * sqr(wanted - actual);</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>  }</div>
|
|
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">return</span> cost;</div>
|
|
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  }</div>
|
|
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div>
|
|
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div>
|
|
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// what would the cost update be if iw and jw were swapped?</span></div>
|
|
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="comment">// computed in O(n) instead of O(n^2) for the full re-computation</span></div>
|
|
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordtype">double</span> cost_update(<span class="keyword">const</span> <span class="keywordtype">int</span>* perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordtype">double</span> delta_cost = 0;</div>
|
|
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> </div>
|
|
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span> (i == iw) {</div>
|
|
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordtype">double</span> wanted = target_dis[i * n + j], w = weights[i * n + j];</div>
|
|
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordtype">double</span> actual = hamming_dis(perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  delta_cost -= w * sqr(wanted - actual);</div>
|
|
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordtype">double</span> new_actual =</div>
|
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  hamming_dis(perm[jw], perm[j == iw ? jw : j == jw ? iw : j]);</div>
|
|
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  delta_cost += w * sqr(wanted - new_actual);</div>
|
|
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  }</div>
|
|
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (i == jw) {</div>
|
|
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">double</span> wanted = target_dis[i * n + j], w = weights[i * n + j];</div>
|
|
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordtype">double</span> actual = hamming_dis(perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  delta_cost -= w * sqr(wanted - actual);</div>
|
|
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordtype">double</span> new_actual =</div>
|
|
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  hamming_dis(perm[iw], perm[j == iw ? jw : j == jw ? iw : j]);</div>
|
|
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  delta_cost += w * sqr(wanted - new_actual);</div>
|
|
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  }</div>
|
|
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordtype">int</span> j = iw;</div>
|
|
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  {</div>
|
|
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordtype">double</span> wanted = target_dis[i * n + j], w = weights[i * n + j];</div>
|
|
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordtype">double</span> actual = hamming_dis(perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  delta_cost -= w * sqr(wanted - actual);</div>
|
|
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordtype">double</span> new_actual = hamming_dis(perm[i], perm[jw]);</div>
|
|
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  delta_cost += w * sqr(wanted - new_actual);</div>
|
|
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  }</div>
|
|
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  j = jw;</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> wanted = target_dis[i * n + j], w = weights[i * n + j];</div>
|
|
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordtype">double</span> actual = hamming_dis(perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  delta_cost -= w * sqr(wanted - actual);</div>
|
|
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordtype">double</span> new_actual = hamming_dis(perm[i], perm[iw]);</div>
|
|
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  delta_cost += w * sqr(wanted - new_actual);</div>
|
|
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  }</div>
|
|
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</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>  <span class="keywordflow">return</span> delta_cost;</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> </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> </div>
|
|
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  ReproduceWithHammingObjective (</div>
|
|
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordtype">int</span> nbits,</div>
|
|
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keyword">const</span> std::vector<double> & dis_table,</div>
|
|
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">double</span> dis_weight_factor):</div>
|
|
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  nbits (nbits), dis_weight_factor (dis_weight_factor)</div>
|
|
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  {</div>
|
|
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  n = 1 << nbits;</div>
|
|
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  FAISS_THROW_IF_NOT (dis_table.size() == n * n);</div>
|
|
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  set_affine_target_dis (dis_table);</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>  <span class="keywordtype">void</span> set_affine_target_dis (<span class="keyword">const</span> std::vector<double> & dis_table)</div>
|
|
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  {</div>
|
|
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordtype">double</span> sum = 0, sum2 = 0;</div>
|
|
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordtype">int</span> n2 = n * n;</div>
|
|
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n2; i++) {</div>
|
|
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  sum += dis_table [i];</div>
|
|
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  sum2 += dis_table [i] * dis_table [i];</div>
|
|
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div>
|
|
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordtype">double</span> mean = sum / n2;</div>
|
|
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordtype">double</span> stddev = sqrt(sum2 / n2 - (sum / n2) * (sum / n2));</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>  target_dis.resize (n2);</div>
|
|
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div>
|
|
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n2; i++) {</div>
|
|
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="comment">// the mapping function</span></div>
|
|
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordtype">double</span> td = (dis_table [i] - mean) / stddev * sqrt(nbits / 4) +</div>
|
|
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  nbits / 2;</div>
|
|
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  target_dis[i] = td;</div>
|
|
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="comment">// compute a weight</span></div>
|
|
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  weights.push_back (dis_weight (td));</div>
|
|
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  }</div>
|
|
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </div>
|
|
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div>
|
|
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span> </div>
|
|
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  ~ReproduceWithHammingObjective()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a name="l00294"></a><span class="lineno"> 294</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> } <span class="comment">// anonymous namespace</span></div>
|
|
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div>
|
|
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span> <span class="comment">// weihgting of distances: it is more important to reproduce small</span></div>
|
|
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span> <span class="comment">// distances well</span></div>
|
|
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span> <span class="keywordtype">double</span> ReproduceDistancesObjective::dis_weight (<span class="keywordtype">double</span> x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">return</span> exp (-dis_weight_factor * x);</div>
|
|
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span> }</div>
|
|
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span> </div>
|
|
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div>
|
|
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="keywordtype">double</span> ReproduceDistancesObjective::get_source_dis (<span class="keywordtype">int</span> i, <span class="keywordtype">int</span> j)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a6681846eb7751b32a907d075fff6770b">source_dis</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span> }</div>
|
|
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span> </div>
|
|
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="comment">// cost = quadratic difference between actual distance and Hamming distance</span></div>
|
|
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="keywordtype">double</span> ReproduceDistancesObjective::compute_cost (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordtype">double</span> cost = 0;</div>
|
|
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordtype">double</span> wanted = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordtype">double</span> w = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordtype">double</span> actual = get_source_dis (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  cost += w * sqr (wanted - actual);</div>
|
|
<div class="line"><a name="l00321"></a><span class="lineno"> 321</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>  <span class="keywordflow">return</span> cost;</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> </div>
|
|
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="comment">// what would the cost update be if iw and jw were swapped?</span></div>
|
|
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span> <span class="comment">// computed in O(n) instead of O(n^2) for the full re-computation</span></div>
|
|
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span> <span class="keywordtype">double</span> ReproduceDistancesObjective::cost_update(</div>
|
|
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordtype">double</span> delta_cost = 0;</div>
|
|
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">if</span> (i == iw) {</div>
|
|
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordtype">double</span> wanted = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a> [i * n + j],</div>
|
|
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  w = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordtype">double</span> actual = get_source_dis (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  delta_cost -= w * sqr (wanted - actual);</div>
|
|
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordtype">double</span> new_actual = get_source_dis (</div>
|
|
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  perm[jw],</div>
|
|
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  perm[j == iw ? jw : j == jw ? iw : j]);</div>
|
|
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  delta_cost += w * sqr (wanted - new_actual);</div>
|
|
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  }</div>
|
|
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (i == jw) {</div>
|
|
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keywordtype">double</span> wanted = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a> [i * n + j],</div>
|
|
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  w = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordtype">double</span> actual = get_source_dis (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  delta_cost -= w * sqr (wanted - actual);</div>
|
|
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordtype">double</span> new_actual = get_source_dis (</div>
|
|
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  perm[iw],</div>
|
|
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  perm[j == iw ? jw : j == jw ? iw : j]);</div>
|
|
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  delta_cost += w * sqr (wanted - new_actual);</div>
|
|
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div>
|
|
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordtype">int</span> j = iw;</div>
|
|
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  {</div>
|
|
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordtype">double</span> wanted = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a> [i * n + j],</div>
|
|
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  w = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="keywordtype">double</span> actual = get_source_dis (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  delta_cost -= w * sqr (wanted - actual);</div>
|
|
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordtype">double</span> new_actual = get_source_dis (perm[i], perm[jw]);</div>
|
|
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  delta_cost += w * sqr (wanted - new_actual);</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>  j = jw;</div>
|
|
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div>
|
|
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordtype">double</span> wanted = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a> [i * n + j],</div>
|
|
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  w = <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i * n + j];</div>
|
|
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordtype">double</span> actual = get_source_dis (perm[i], perm[j]);</div>
|
|
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  delta_cost -= w * sqr (wanted - actual);</div>
|
|
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordtype">double</span> new_actual = get_source_dis (perm[i], perm[iw]);</div>
|
|
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  delta_cost += w * sqr (wanted - new_actual);</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>  }</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>  <span class="keywordflow">return</span> delta_cost;</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> </div>
|
|
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </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> ReproduceDistancesObjective::ReproduceDistancesObjective (</div>
|
|
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keywordtype">int</span> n,</div>
|
|
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> *source_dis_in,</div>
|
|
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> *target_dis_in,</div>
|
|
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordtype">double</span> dis_weight_factor):</div>
|
|
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  dis_weight_factor (dis_weight_factor),</div>
|
|
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  target_dis (target_dis_in)</div>
|
|
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span> {</div>
|
|
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  this->n = <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#a90edfc401372aa1a2a832b403e26bfd1">n</a>;</div>
|
|
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  set_affine_target_dis (source_dis_in);</div>
|
|
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> }</div>
|
|
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span> </div>
|
|
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="keywordtype">void</span> ReproduceDistancesObjective::compute_mean_stdev (</div>
|
|
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> *tab, <span class="keywordtype">size_t</span> n2,</div>
|
|
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordtype">double</span> *mean_out, <span class="keywordtype">double</span> *stddev_out)</div>
|
|
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span> {</div>
|
|
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordtype">double</span> sum = 0, sum2 = 0;</div>
|
|
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n2; i++) {</div>
|
|
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  sum += tab [i];</div>
|
|
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  sum2 += tab [i] * tab [i];</div>
|
|
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  }</div>
|
|
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="keywordtype">double</span> mean = sum / n2;</div>
|
|
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordtype">double</span> stddev = sqrt(sum2 / n2 - (sum / n2) * (sum / n2));</div>
|
|
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  *mean_out = mean;</div>
|
|
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  *stddev_out = stddev;</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> <span class="keywordtype">void</span> ReproduceDistancesObjective::set_affine_target_dis (</div>
|
|
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> *source_dis_in)</div>
|
|
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span> {</div>
|
|
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordtype">int</span> n2 = n * n;</div>
|
|
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span> </div>
|
|
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordtype">double</span> mean_src, stddev_src;</div>
|
|
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  compute_mean_stdev (source_dis_in, n2, &mean_src, &stddev_src);</div>
|
|
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div>
|
|
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="keywordtype">double</span> mean_target, stddev_target;</div>
|
|
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  compute_mean_stdev (<a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a>, n2, &mean_target, &stddev_target);</div>
|
|
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div>
|
|
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  printf (<span class="stringliteral">"map mean %g std %g -> mean %g std %g\n"</span>,</div>
|
|
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  mean_src, stddev_src, mean_target, stddev_target);</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>  <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a6681846eb7751b32a907d075fff6770b">source_dis</a>.resize (n2);</div>
|
|
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a>.resize (n2);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n2; i++) {</div>
|
|
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="comment">// the mapping function</span></div>
|
|
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a6681846eb7751b32a907d075fff6770b">source_dis</a>[i] = (source_dis_in[i] - mean_src) / stddev_src</div>
|
|
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  * stddev_target + mean_target;</div>
|
|
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span> </div>
|
|
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">// compute a weight</span></div>
|
|
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">weights</a> [i] = dis_weight (<a class="code" href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">target_dis</a>[i]);</div>
|
|
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  }</div>
|
|
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span> </div>
|
|
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span> }</div>
|
|
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span> </div>
|
|
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span> <span class="comment">/****************************************************</span></div>
|
|
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span> <span class="comment"> * Cost functions: RankingScore</span></div>
|
|
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span> <span class="comment"> ****************************************************/</span></div>
|
|
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <span class="comment">/// Maintains a 3D table of elementary costs.</span></div>
|
|
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span> <span class="comment">/// Accumulates elements based on Hamming distance comparisons</span></div>
|
|
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span> <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> Ttab, <span class="keyword">typename</span> Taccu></div>
|
|
<div class="line"><a name="l00443"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html"> 443</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1Score3Computer.html">Score3Computer</a>: <a class="code" href="structfaiss_1_1PermutationObjective.html">PermutationObjective</a> {</div>
|
|
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div>
|
|
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keywordtype">int</span> nc;</div>
|
|
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div>
|
|
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="comment">// cost matrix of size nc * nc *nc</span></div>
|
|
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="comment">// n_gt (i,j,k) = count of d_gt(x, y-) < d_gt(x, y+)</span></div>
|
|
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="comment">// where x has PQ code i, y- PQ code j and y+ PQ code k</span></div>
|
|
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  std::vector<Ttab> n_gt;</div>
|
|
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span> </div>
|
|
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span> <span class="comment"> /// the cost is a triple loop on the nc * nc * nc matrix of entries.</span></div>
|
|
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span> <span class="comment"> ///</span></div>
|
|
<div class="line"><a name="l00455"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#a07a726903418960a2d8000506d88f8e6"> 455</a></span> <span class="comment"></span> Taccu <a class="code" href="structfaiss_1_1Score3Computer.html#a07a726903418960a2d8000506d88f8e6">compute</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> * perm)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keyword">const</span> Ttab *p = n_gt.data();</div>
|
|
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nc; i++) {</div>
|
|
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">int</span> ip = perm [i];</div>
|
|
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nc; j++) {</div>
|
|
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordtype">int</span> jp = perm [j];</div>
|
|
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < nc; k++) {</div>
|
|
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordtype">int</span> kp = perm [k];</div>
|
|
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span> (hamming_dis (ip, jp) <</div>
|
|
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  hamming_dis (ip, kp)) {</div>
|
|
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  accu += *p; <span class="comment">// n_gt [ ( i * nc + j) * nc + k];</span></div>
|
|
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div>
|
|
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  p++;</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>  }</div>
|
|
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  }</div>
|
|
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span> </div>
|
|
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="comment"> /** cost update if entries iw and jw of the permutation would be</span></div>
|
|
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span> <span class="comment"> * swapped.</span></div>
|
|
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span> <span class="comment"> * The computation is optimized by avoiding elements in the</span></div>
|
|
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span> <span class="comment"> * nc*nc*nc cube that are known not to change. For nc=256, this</span></div>
|
|
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span> <span class="comment"> * reduces the nb of cells to visit to about 6/256 th of the</span></div>
|
|
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span> <span class="comment"> * cells. Practical speedup is about 8x, and the code is quite</span></div>
|
|
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span> <span class="comment"> * complex :-/</span></div>
|
|
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00486"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#a567feac7ddd3bb467a9ed30671caccb1"> 486</a></span>  Taccu <a class="code" href="structfaiss_1_1Score3Computer.html#a567feac7ddd3bb467a9ed30671caccb1">compute_update</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  assert (iw != jw);</div>
|
|
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">if</span> (iw > jw) std::swap (iw, jw);</div>
|
|
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div>
|
|
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keyword">const</span> Ttab * n_gt_i = n_gt.data();</div>
|
|
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nc; i++) {</div>
|
|
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordtype">int</span> ip0 = perm [i];</div>
|
|
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordtype">int</span> ip = perm [i == iw ? jw : i == jw ? iw : i];</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>  <span class="comment">//accu += update_i (perm, iw, jw, ip0, ip, n_gt_i);</span></div>
|
|
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span> </div>
|
|
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  accu += <a class="code" href="structfaiss_1_1Score3Computer.html#acf371848bac76ba275ceb5e10f805d33">update_i_cross</a> (perm, iw, jw,</div>
|
|
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  ip0, ip, n_gt_i);</div>
|
|
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span> </div>
|
|
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">if</span> (ip != ip0)</div>
|
|
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  accu += update_i_plane (perm, iw, jw,</div>
|
|
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  ip0, ip, n_gt_i);</div>
|
|
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span> </div>
|
|
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  n_gt_i += nc * nc;</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>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div>
|
|
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div>
|
|
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div>
|
|
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  Taccu update_i (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw,</div>
|
|
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">int</span> ip0, <span class="keywordtype">int</span> ip, <span class="keyword">const</span> Ttab * n_gt_i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keyword">const</span> Ttab *n_gt_ij = n_gt_i;</div>
|
|
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nc; j++) {</div>
|
|
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordtype">int</span> jp0 = perm[j];</div>
|
|
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordtype">int</span> jp = perm [j == iw ? jw : j == jw ? iw : j];</div>
|
|
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < nc; k++) {</div>
|
|
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordtype">int</span> kp0 = perm [k];</div>
|
|
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordtype">int</span> kp = perm [k == iw ? jw : k == jw ? iw : k];</div>
|
|
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordtype">int</span> ng = n_gt_ij [k];</div>
|
|
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">if</span> (hamming_dis (ip, jp) < hamming_dis (ip, kp)) {</div>
|
|
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  accu += ng;</div>
|
|
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  }</div>
|
|
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="keywordflow">if</span> (hamming_dis (ip0, jp0) < hamming_dis (ip0, kp0)) {</div>
|
|
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  accu -= ng;</div>
|
|
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div>
|
|
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  }</div>
|
|
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  n_gt_ij += nc;</div>
|
|
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  }</div>
|
|
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  }</div>
|
|
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span> </div>
|
|
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="comment">// 2 inner loops for the case ip0 != ip</span></div>
|
|
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  Taccu update_i_plane (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw,</div>
|
|
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordtype">int</span> ip0, <span class="keywordtype">int</span> ip, <span class="keyword">const</span> Ttab * n_gt_i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keyword">const</span> Ttab *n_gt_ij = n_gt_i;</div>
|
|
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div>
|
|
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nc; j++) {</div>
|
|
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keywordflow">if</span> (j != iw && j != jw) {</div>
|
|
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">int</span> jp = perm[j];</div>
|
|
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < nc; k++) {</div>
|
|
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">if</span> (k != iw && k != jw) {</div>
|
|
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordtype">int</span> kp = perm [k];</div>
|
|
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  Ttab ng = n_gt_ij [k];</div>
|
|
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">if</span> (hamming_dis (ip, jp) < hamming_dis (ip, kp)) {</div>
|
|
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  accu += ng;</div>
|
|
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  }</div>
|
|
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <span class="keywordflow">if</span> (hamming_dis (ip0, jp) < hamming_dis (ip0, kp)) {</div>
|
|
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  accu -= ng;</div>
|
|
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  }</div>
|
|
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  }</div>
|
|
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  }</div>
|
|
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div>
|
|
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  n_gt_ij += nc;</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="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  }</div>
|
|
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="comment"> /// used for the 8 cells were the 3 indices are swapped</span></div>
|
|
<div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#a227601c3dc8779bb13747ba04934e0c8"> 566</a></span> <span class="comment"></span> <span class="keyword">inline</span> Taccu <a class="code" href="structfaiss_1_1Score3Computer.html#a227601c3dc8779bb13747ba04934e0c8">update_k</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw,</div>
|
|
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <span class="keywordtype">int</span> ip0, <span class="keywordtype">int</span> ip, <span class="keywordtype">int</span> jp0, <span class="keywordtype">int</span> jp,</div>
|
|
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordtype">int</span> k,</div>
|
|
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keyword">const</span> Ttab * n_gt_ij)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordtype">int</span> kp0 = perm [k];</div>
|
|
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordtype">int</span> kp = perm [k == iw ? jw : k == jw ? iw : k];</div>
|
|
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  Ttab ng = n_gt_ij [k];</div>
|
|
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordflow">if</span> (hamming_dis (ip, jp) < hamming_dis (ip, kp)) {</div>
|
|
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  accu += ng;</div>
|
|
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  }</div>
|
|
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">if</span> (hamming_dis (ip0, jp0) < hamming_dis (ip0, kp0)) {</div>
|
|
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  accu -= ng;</div>
|
|
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div>
|
|
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div>
|
|
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="comment"> /// compute update on a line of k's, where i and j are swapped</span></div>
|
|
<div class="line"><a name="l00585"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#a98da6005edbb5ec26311bc947866122d"> 585</a></span> <span class="comment"></span> Taccu <a class="code" href="structfaiss_1_1Score3Computer.html#a98da6005edbb5ec26311bc947866122d">update_j_line</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw,</div>
|
|
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordtype">int</span> ip0, <span class="keywordtype">int</span> ip, <span class="keywordtype">int</span> jp0, <span class="keywordtype">int</span> jp,</div>
|
|
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keyword">const</span> Ttab * n_gt_ij)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k < nc; k++) {</div>
|
|
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">if</span> (k == iw || k == jw) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordtype">int</span> kp = perm [k];</div>
|
|
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  Ttab ng = n_gt_ij [k];</div>
|
|
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">if</span> (hamming_dis (ip, jp) < hamming_dis (ip, kp)) {</div>
|
|
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  accu += ng;</div>
|
|
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  }</div>
|
|
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">if</span> (hamming_dis (ip0, jp0) < hamming_dis (ip0, kp)) {</div>
|
|
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  accu -= ng;</div>
|
|
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  }</div>
|
|
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  }</div>
|
|
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordflow">return</span> accu;</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> </div>
|
|
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment"> /// considers the 2 pairs of crossing lines j=iw or jw and k = iw or kw</span></div>
|
|
<div class="line"><a name="l00606"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#acf371848bac76ba275ceb5e10f805d33"> 606</a></span> <span class="comment"></span> Taccu <a class="code" href="structfaiss_1_1Score3Computer.html#acf371848bac76ba275ceb5e10f805d33">update_i_cross</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> *perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw,</div>
|
|
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordtype">int</span> ip0, <span class="keywordtype">int</span> ip, <span class="keyword">const</span> Ttab * n_gt_i)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="keyword"> </span>{</div>
|
|
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  Taccu accu = 0;</div>
|
|
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keyword">const</span> Ttab *n_gt_ij = n_gt_i;</div>
|
|
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span> </div>
|
|
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nc; j++) {</div>
|
|
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordtype">int</span> jp0 = perm[j];</div>
|
|
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="keywordtype">int</span> jp = perm [j == iw ? jw : j == jw ? iw : j];</div>
|
|
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div>
|
|
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  accu += <a class="code" href="structfaiss_1_1Score3Computer.html#a227601c3dc8779bb13747ba04934e0c8">update_k</a> (perm, iw, jw, ip0, ip, jp0, jp, iw, n_gt_ij);</div>
|
|
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  accu += <a class="code" href="structfaiss_1_1Score3Computer.html#a227601c3dc8779bb13747ba04934e0c8">update_k</a> (perm, iw, jw, ip0, ip, jp0, jp, jw, n_gt_ij);</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>  <span class="keywordflow">if</span> (jp != jp0)</div>
|
|
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  accu += <a class="code" href="structfaiss_1_1Score3Computer.html#a98da6005edbb5ec26311bc947866122d">update_j_line</a> (perm, iw, jw, ip0, ip, jp0, jp, n_gt_ij);</div>
|
|
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </div>
|
|
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  n_gt_ij += nc;</div>
|
|
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div>
|
|
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">return</span> accu;</div>
|
|
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  }</div>
|
|
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> </div>
|
|
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment"> /// PermutationObjective implementeation (just negates the scores</span></div>
|
|
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment"> /// for minimization)</span></div>
|
|
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00631"></a><span class="lineno"><a class="line" href="structfaiss_1_1Score3Computer.html#a1c4537d67802aef28ccc57c4bd87f766"> 631</a></span>  <span class="keywordtype">double</span> <a class="code" href="structfaiss_1_1Score3Computer.html#a1c4537d67802aef28ccc57c4bd87f766">compute_cost</a>(<span class="keyword">const</span> <span class="keywordtype">int</span>* perm)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordflow">return</span> -<a class="code" href="structfaiss_1_1Score3Computer.html#a07a726903418960a2d8000506d88f8e6">compute</a>(perm);</div>
|
|
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  }</div>
|
|
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div>
|
|
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordtype">double</span> cost_update(<span class="keyword">const</span> <span class="keywordtype">int</span>* perm, <span class="keywordtype">int</span> iw, <span class="keywordtype">int</span> jw)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordtype">double</span> ret = -<a class="code" href="structfaiss_1_1Score3Computer.html#a567feac7ddd3bb467a9ed30671caccb1">compute_update</a>(perm, iw, jw);</div>
|
|
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">return</span> ret;</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>  ~Score3Computer()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span> };</div>
|
|
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span> </div>
|
|
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span> </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> </div>
|
|
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span> </div>
|
|
<div class="line"><a name="l00647"></a><span class="lineno"><a class="line" href="structfaiss_1_1IndirectSort.html"> 647</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1IndirectSort.html">IndirectSort</a> {</div>
|
|
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *tab;</div>
|
|
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordtype">bool</span> operator () (<span class="keywordtype">int</span> a, <span class="keywordtype">int</span> b) {<span class="keywordflow">return</span> tab[a] < tab[b]; }</div>
|
|
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span> };</div>
|
|
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> </div>
|
|
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span> </div>
|
|
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span> </div>
|
|
<div class="line"><a name="l00654"></a><span class="lineno"><a class="line" href="structfaiss_1_1RankingScore2.html"> 654</a></span> <span class="keyword">struct </span><a class="code" href="structfaiss_1_1RankingScore2.html">RankingScore2</a>: <a class="code" href="structfaiss_1_1Score3Computer.html">Score3Computer</a><float, double> {</div>
|
|
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keywordtype">int</span> nbits;</div>
|
|
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordtype">int</span> nq, nb;</div>
|
|
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keyword">const</span> uint32_t *qcodes, *bcodes;</div>
|
|
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *gt_distances;</div>
|
|
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span> </div>
|
|
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <a class="code" href="structfaiss_1_1RankingScore2.html">RankingScore2</a> (<span class="keywordtype">int</span> nbits, <span class="keywordtype">int</span> nq, <span class="keywordtype">int</span> nb,</div>
|
|
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keyword">const</span> uint32_t *qcodes, <span class="keyword">const</span> uint32_t *bcodes,</div>
|
|
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *gt_distances):</div>
|
|
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  nbits(nbits), nq(nq), nb(nb), qcodes(qcodes),</div>
|
|
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  bcodes(bcodes), gt_distances(gt_distances)</div>
|
|
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  {</div>
|
|
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  n = nc = 1 << nbits;</div>
|
|
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  n_gt.resize (nc * nc * nc);</div>
|
|
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  init_n_gt ();</div>
|
|
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  }</div>
|
|
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span> </div>
|
|
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div>
|
|
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordtype">double</span> rank_weight (<span class="keywordtype">int</span> r)</div>
|
|
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  {</div>
|
|
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">return</span> 1.0 / (r + 1);</div>
|
|
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  }</div>
|
|
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span> <span class="comment"></span></div>
|
|
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="comment"> /// count nb of i, j in a x b st. i < j</span></div>
|
|
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span> <span class="comment"> /// a and b should be sorted on input</span></div>
|
|
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span> <span class="comment"> /// they are the ranks of j and k respectively.</span></div>
|
|
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="comment"> /// specific version for diff-of-rank weighting, cannot optimized</span></div>
|
|
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span> <span class="comment"> /// with a cumulative table</span></div>
|
|
<div class="line"><a name="l00682"></a><span class="lineno"><a class="line" href="structfaiss_1_1RankingScore2.html#a16c753a4136b3c851ea81133a26a02da"> 682</a></span> <span class="comment"></span> <span class="keywordtype">double</span> <a class="code" href="structfaiss_1_1RankingScore2.html#a16c753a4136b3c851ea81133a26a02da">accum_gt_weight_diff</a> (<span class="keyword">const</span> std::vector<int> & a,</div>
|
|
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keyword">const</span> std::vector<int> & b)</div>
|
|
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  {</div>
|
|
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordtype">int</span> nb = b.size(), na = a.size();</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>  <span class="keywordtype">double</span> accu = 0;</div>
|
|
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordtype">int</span> j = 0;</div>
|
|
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < na; i++) {</div>
|
|
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordtype">int</span> ai = a[i];</div>
|
|
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="keywordflow">while</span> (j < nb && ai >= b[j]) j++;</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>  <span class="keywordtype">double</span> accu_i = 0;</div>
|
|
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = j; k < b.size(); k++)</div>
|
|
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  accu_i += rank_weight (b[k] - ai);</div>
|
|
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span> </div>
|
|
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  accu += rank_weight (ai) * accu_i;</div>
|
|
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> </div>
|
|
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  }</div>
|
|
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordflow">return</span> accu;</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>  <span class="keywordtype">void</span> init_n_gt ()</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q = 0; q < nq; q++) {</div>
|
|
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *gtd = gt_distances + q * nb;</div>
|
|
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="keyword">const</span> uint32_t *cb = bcodes;<span class="comment">// all same codes</span></div>
|
|
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="keywordtype">float</span> * n_gt_q = & n_gt [qcodes[q] * nc * nc];</div>
|
|
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span> </div>
|
|
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  printf(<span class="stringliteral">"init gt for q=%d/%d \r"</span>, q, nq); fflush(stdout);</div>
|
|
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div>
|
|
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  std::vector<int> rankv (nb);</div>
|
|
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordtype">int</span> * ranks = rankv.data();</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>  <span class="comment">// elements in each code bin, ordered by rank within each bin</span></div>
|
|
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  std::vector<std::vector<int> > tab (nc);</div>
|
|
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> </div>
|
|
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  { <span class="comment">// build rank table</span></div>
|
|
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <a class="code" href="structfaiss_1_1IndirectSort.html">IndirectSort</a> s = {gtd};</div>
|
|
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nb; j++) ranks[j] = j;</div>
|
|
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  std::sort (ranks, ranks + nb, s);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> rank = 0; rank < nb; rank++) {</div>
|
|
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="keywordtype">int</span> i = ranks [rank];</div>
|
|
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  tab [cb[i]].push_back (rank);</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="comment">// this is very expensive. Any suggestion for improvement</span></div>
|
|
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="comment">// welcome.</span></div>
|
|
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nc; i++) {</div>
|
|
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  std::vector<int> & di = tab[i];</div>
|
|
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < nc; j++) {</div>
|
|
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  std::vector<int> & dj = tab[j];</div>
|
|
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  n_gt_q [i * nc + j] += <a class="code" href="structfaiss_1_1RankingScore2.html#a16c753a4136b3c851ea81133a26a02da">accum_gt_weight_diff</a> (di, dj);</div>
|
|
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span> </div>
|
|
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div>
|
|
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  }</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>  }</div>
|
|
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span> </div>
|
|
<div class="line"><a name="l00743"></a><span class="lineno"> 743</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> };</div>
|
|
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span> </div>
|
|
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span> </div>
|
|
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span> <span class="comment">/*****************************************</span></div>
|
|
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="comment"> * PolysemousTraining</span></div>
|
|
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span> <span class="comment"> ******************************************/</span></div>
|
|
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span> </div>
|
|
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span> </div>
|
|
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span> </div>
|
|
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span> PolysemousTraining::PolysemousTraining ()</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>  optimization_type = <a class="code" href="structfaiss_1_1PolysemousTraining.html#aeb5a523056697934972f95fd428f61efa4f1f59a0027c1662a7aaf66f2a78fb23">OT_ReproduceDistances_affine</a>;</div>
|
|
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  ntrain_permutation = 0;</div>
|
|
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  dis_weight_factor = log(2);</div>
|
|
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span> }</div>
|
|
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span> </div>
|
|
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span> </div>
|
|
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span> </div>
|
|
<div class="line"><a name="l00763"></a><span class="lineno"><a class="line" href="structfaiss_1_1PolysemousTraining.html#a6989e2b573d4368e7f863edbbb2f00b8"> 763</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PolysemousTraining.html#a6989e2b573d4368e7f863edbbb2f00b8">PolysemousTraining::optimize_reproduce_distances</a> (</div>
|
|
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> &pq)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span> </div>
|
|
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keywordtype">int</span> dsub = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span> </div>
|
|
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordtype">int</span> n = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordtype">int</span> nbits = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a>;</div>
|
|
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> </div>
|
|
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  std::vector<double> dis_table;</div>
|
|
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span> </div>
|
|
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="comment">// printf ("Optimizing quantizer %d\n", m);</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>  <span class="keywordtype">float</span> * centroids = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, 0);</div>
|
|
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span> </div>
|
|
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) {</div>
|
|
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < n; j++) {</div>
|
|
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  dis_table.push_back (<a class="code" href="namespacefaiss.html#a7466bd32de31640860393a701eaac5ad">fvec_L2sqr</a> (centroids + i * dsub,</div>
|
|
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  centroids + j * dsub,</div>
|
|
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  dsub));</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>  std::vector<int> perm (n);</div>
|
|
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  ReproduceWithHammingObjective obj (</div>
|
|
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  nbits, dis_table,</div>
|
|
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  dis_weight_factor);</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> </div>
|
|
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html">SimulatedAnnealingOptimizer</a> optim (&obj, *<span class="keyword">this</span>);</div>
|
|
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span> </div>
|
|
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="keywordflow">if</span> (log_pattern.size()) {</div>
|
|
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="keywordtype">char</span> fname[256];</div>
|
|
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  snprintf (fname, 256, log_pattern.c_str(), m);</div>
|
|
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  printf (<span class="stringliteral">"opening log file %s\n"</span>, fname);</div>
|
|
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  optim.logfile = fopen (fname, <span class="stringliteral">"w"</span>);</div>
|
|
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  FAISS_THROW_IF_NOT_MSG (optim.logfile, <span class="stringliteral">"could not open logfile"</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>  <span class="keywordtype">double</span> final_cost = optim.run_optimization (perm.data());</div>
|
|
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span> </div>
|
|
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">if</span> (verbose > 0) {</div>
|
|
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  printf (<span class="stringliteral">"SimulatedAnnealingOptimizer for m=%d: %g -> %g\n"</span>,</div>
|
|
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  m, optim.<a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#aa8ff19f97482c6213b2a8ff3b190412b">init_cost</a>, final_cost);</div>
|
|
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div>
|
|
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span> </div>
|
|
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keywordflow">if</span> (log_pattern.size()) fclose (optim.logfile);</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>  std::vector<float> centroids_copy;</div>
|
|
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < dsub * n; i++)</div>
|
|
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  centroids_copy.push_back (centroids[i]);</div>
|
|
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span> </div>
|
|
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  memcpy (centroids + perm[i] * dsub,</div>
|
|
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  centroids_copy.data() + i * dsub,</div>
|
|
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  dsub * <span class="keyword">sizeof</span>(centroids[0]));</div>
|
|
<div class="line"><a name="l00820"></a><span class="lineno"> 820</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> }</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> </div>
|
|
<div class="line"><a name="l00826"></a><span class="lineno"><a class="line" href="structfaiss_1_1PolysemousTraining.html#a0ac61389b6fcc7f98e998d9d0cc2664a"> 826</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PolysemousTraining.html#a0ac61389b6fcc7f98e998d9d0cc2664a">PolysemousTraining::optimize_ranking</a> (</div>
|
|
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> &pq, <span class="keywordtype">size_t</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span> </div>
|
|
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordtype">int</span> dsub = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">dsub</a>;</div>
|
|
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span> </div>
|
|
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="keywordtype">int</span> nbits = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">nbits</a>;</div>
|
|
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span> </div>
|
|
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  std::vector<uint8_t> all_codes (pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> * n);</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>  pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#ae5a340ee5a4b1d35a565b167de2a2ef1">compute_codes</a> (x, all_codes.data(), n);</div>
|
|
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span> </div>
|
|
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  FAISS_THROW_IF_NOT (pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">byte_per_idx</a> == 1);</div>
|
|
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span> </div>
|
|
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="keywordflow">if</span> (n == 0)</div>
|
|
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  pq.compute_sdc_table ();</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> <span class="preprocessor">#pragma omp parallel for</span></div>
|
|
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span> <span class="preprocessor"></span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> m = 0; m < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">M</a>; m++) {</div>
|
|
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordtype">size_t</span> nq, nb;</div>
|
|
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  std::vector <uint32_t> codes; <span class="comment">// query codes, then db codes</span></div>
|
|
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  std::vector <float> gt_distances; <span class="comment">// nq * nb matrix of distances</span></div>
|
|
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span> </div>
|
|
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keywordflow">if</span> (n > 0) {</div>
|
|
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  std::vector<float> xtrain (n * dsub);</div>
|
|
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  memcpy (xtrain.data() + i * dsub,</div>
|
|
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  x + i * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">d</a> + m * dsub,</div>
|
|
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keyword">sizeof</span>(float) * dsub);</div>
|
|
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span> </div>
|
|
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  codes.resize (n);</div>
|
|
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++)</div>
|
|
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  codes [i] = all_codes [i * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">code_size</a> + m];</div>
|
|
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span> </div>
|
|
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  nq = n / 4; nb = n - nq;</div>
|
|
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xq = xtrain.data();</div>
|
|
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> *xb = xq + nq * dsub;</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>  gt_distances.resize (nq * nb);</div>
|
|
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span> </div>
|
|
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <a class="code" href="namespacefaiss.html#a3d9c7db82d43c1f0ab1d28b92bc9fe57">pairwise_L2sqr</a> (dsub,</div>
|
|
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  nq, xq,</div>
|
|
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  nb, xb,</div>
|
|
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  gt_distances.data());</div>
|
|
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  nq = nb = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>;</div>
|
|
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  codes.resize (2 * nq);</div>
|
|
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < nq; i++)</div>
|
|
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  codes[i] = codes [i + nq] = i;</div>
|
|
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span> </div>
|
|
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  gt_distances.resize (nq * nb);</div>
|
|
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span> </div>
|
|
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  memcpy (gt_distances.data (),</div>
|
|
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">sdc_table</a>.data () + m * nq * nb,</div>
|
|
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keyword">sizeof</span> (float) * nq * nb);</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>  <span class="keywordtype">double</span> t0 = <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> ();</div>
|
|
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> </div>
|
|
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <a class="code" href="structfaiss_1_1PermutationObjective.html">PermutationObjective</a> *obj = <span class="keyword">new</span> <a class="code" href="structfaiss_1_1RankingScore2.html">RankingScore2</a> (</div>
|
|
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  nbits, nq, nb,</div>
|
|
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  codes.data(), codes.data() + nq,</div>
|
|
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  gt_distances.data ());</div>
|
|
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <a class="code" href="structfaiss_1_1ScopeDeleter1.html">ScopeDeleter1<PermutationObjective></a> del (obj);</div>
|
|
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span> </div>
|
|
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keywordflow">if</span> (verbose > 0) {</div>
|
|
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  printf(<span class="stringliteral">" m=%d, nq=%ld, nb=%ld, intialize RankingScore "</span></div>
|
|
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="stringliteral">"in %.3f ms\n"</span>,</div>
|
|
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  m, nq, nb, <a class="code" href="namespacefaiss.html#af2a71f7d5402ae02ce169a4cc83020eb">getmillisecs</a> () - t0);</div>
|
|
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  }</div>
|
|
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span> </div>
|
|
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html">SimulatedAnnealingOptimizer</a> optim (obj, *<span class="keyword">this</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"> 899</span>  <span class="keywordflow">if</span> (log_pattern.size()) {</div>
|
|
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keywordtype">char</span> fname[256];</div>
|
|
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  snprintf (fname, 256, log_pattern.c_str(), m);</div>
|
|
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  printf (<span class="stringliteral">"opening log file %s\n"</span>, fname);</div>
|
|
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  optim.logfile = fopen (fname, <span class="stringliteral">"w"</span>);</div>
|
|
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  FAISS_THROW_IF_NOT_FMT (optim.logfile,</div>
|
|
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="stringliteral">"could not open logfile %s"</span>, fname);</div>
|
|
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  }</div>
|
|
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span> </div>
|
|
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  std::vector<int> perm (pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>);</div>
|
|
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span> </div>
|
|
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keywordtype">double</span> final_cost = optim.run_optimization (perm.data());</div>
|
|
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  printf (<span class="stringliteral">"SimulatedAnnealingOptimizer for m=%d: %g -> %g\n"</span>,</div>
|
|
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  m, optim.<a class="code" href="structfaiss_1_1SimulatedAnnealingOptimizer.html#aa8ff19f97482c6213b2a8ff3b190412b">init_cost</a>, final_cost);</div>
|
|
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span> </div>
|
|
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">if</span> (log_pattern.size()) fclose (optim.logfile);</div>
|
|
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span> </div>
|
|
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  <span class="keywordtype">float</span> * centroids = pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">get_centroids</a> (m, 0);</div>
|
|
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> </div>
|
|
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  std::vector<float> centroids_copy;</div>
|
|
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < dsub * pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++)</div>
|
|
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  centroids_copy.push_back (centroids[i]);</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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < pq.<a class="code" href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">ksub</a>; i++)</div>
|
|
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  memcpy (centroids + perm[i] * dsub,</div>
|
|
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  centroids_copy.data() + i * dsub,</div>
|
|
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  dsub * <span class="keyword">sizeof</span>(centroids[0]));</div>
|
|
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span> </div>
|
|
<div class="line"><a name="l00927"></a><span class="lineno"> 927</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> </div>
|
|
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span> </div>
|
|
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span> </div>
|
|
<div class="line"><a name="l00933"></a><span class="lineno"><a class="line" href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82"> 933</a></span> <span class="keywordtype">void</span> <a class="code" href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82">PolysemousTraining::optimize_pq_for_hamming</a> (<a class="code" href="structfaiss_1_1ProductQuantizer.html">ProductQuantizer</a> &pq,</div>
|
|
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordtype">size_t</span> n, <span class="keyword">const</span> <span class="keywordtype">float</span> *x)<span class="keyword"> const</span></div>
|
|
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="keyword"></span>{</div>
|
|
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="keywordflow">if</span> (optimization_type == OT_None) {</div>
|
|
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span> </div>
|
|
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (optimization_type == <a class="code" href="structfaiss_1_1PolysemousTraining.html#aeb5a523056697934972f95fd428f61efa4f1f59a0027c1662a7aaf66f2a78fb23">OT_ReproduceDistances_affine</a>) {</div>
|
|
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <a class="code" href="structfaiss_1_1PolysemousTraining.html#a6989e2b573d4368e7f863edbbb2f00b8">optimize_reproduce_distances</a> (pq);</div>
|
|
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <a class="code" href="structfaiss_1_1PolysemousTraining.html#a0ac61389b6fcc7f98e998d9d0cc2664a">optimize_ranking</a> (pq, n, x);</div>
|
|
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  }</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>  pq.compute_sdc_table ();</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> }</div>
|
|
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span> </div>
|
|
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span> </div>
|
|
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span> </div>
|
|
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> } <span class="comment">// namespace faiss</span></div>
|
|
<div class="ttc" id="structfaiss_1_1RandomGenerator_html"><div class="ttname"><a href="structfaiss_1_1RandomGenerator.html">faiss::RandomGenerator</a></div><div class="ttdoc">random generator that can be used in multithreaded contexts </div><div class="ttdef"><b>Definition:</b> <a href="utils_8h_source.html#l00048">utils.h:48</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_ac920fea11f02e8407d12cc99a09f5ea5"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#ac920fea11f02e8407d12cc99a09f5ea5">faiss::ProductQuantizer::nbits</a></div><div class="ttdeci">size_t nbits</div><div class="ttdoc">number of bits per quantization index </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00029">ProductQuantizer.h:29</a></div></div>
|
|
<div class="ttc" id="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_1ProductQuantizer_html_a13bf69a0dc7b4e45792d10f458e4a92d"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a13bf69a0dc7b4e45792d10f458e4a92d">faiss::ProductQuantizer::byte_per_idx</a></div><div class="ttdeci">size_t byte_per_idx</div><div class="ttdoc">nb bytes per code component (1 or 2) </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00033">ProductQuantizer.h:33</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Score3Computer_html_a567feac7ddd3bb467a9ed30671caccb1"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#a567feac7ddd3bb467a9ed30671caccb1">faiss::Score3Computer::compute_update</a></div><div class="ttdeci">Taccu compute_update(const int *perm, int iw, int jw) const </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00486">PolysemousTraining.cpp:486</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a6bd65fb4407452f73acb7242931d09e4"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a6bd65fb4407452f73acb7242931d09e4">faiss::ProductQuantizer::sdc_table</a></div><div class="ttdeci">std::vector< float > sdc_table</div><div class="ttdoc">Symmetric Distance Table. </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00155">ProductQuantizer.h:155</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SimulatedAnnealingOptimizer_html_ab258eaf892742e37dd2c3bfd3b1c39e1"><div class="ttname"><a href="structfaiss_1_1SimulatedAnnealingOptimizer.html#ab258eaf892742e37dd2c3bfd3b1c39e1">faiss::SimulatedAnnealingOptimizer::SimulatedAnnealingOptimizer</a></div><div class="ttdeci">SimulatedAnnealingOptimizer(PermutationObjective *obj, const SimulatedAnnealingParameters &p)</div><div class="ttdoc">logs values of the cost function </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00067">PolysemousTraining.cpp:67</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ScopeDeleter1_html"><div class="ttname"><a href="structfaiss_1_1ScopeDeleter1.html">faiss::ScopeDeleter1</a></div><div class="ttdef"><b>Definition:</b> <a href="FaissException_8h_source.html#l00052">FaissException.h:52</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SimulatedAnnealingOptimizer_html_a90edfc401372aa1a2a832b403e26bfd1"><div class="ttname"><a href="structfaiss_1_1SimulatedAnnealingOptimizer.html#a90edfc401372aa1a2a832b403e26bfd1">faiss::SimulatedAnnealingOptimizer::n</a></div><div class="ttdeci">int n</div><div class="ttdoc">size of the permutation </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00101">PolysemousTraining.h:101</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Score3Computer_html_a07a726903418960a2d8000506d88f8e6"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#a07a726903418960a2d8000506d88f8e6">faiss::Score3Computer::compute</a></div><div class="ttdeci">Taccu compute(const int *perm) const </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00455">PolysemousTraining.cpp:455</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a467b451ca203544e42c250e4be65b983"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a467b451ca203544e42c250e4be65b983">faiss::ProductQuantizer::dsub</a></div><div class="ttdeci">size_t dsub</div><div class="ttdoc">dimensionality of each subvector </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00032">ProductQuantizer.h:32</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_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_1Score3Computer_html_a98da6005edbb5ec26311bc947866122d"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#a98da6005edbb5ec26311bc947866122d">faiss::Score3Computer::update_j_line</a></div><div class="ttdeci">Taccu update_j_line(const int *perm, int iw, int jw, int ip0, int ip, int jp0, int jp, const Ttab *n_gt_ij) const </div><div class="ttdoc">compute update on a line of k&#39;s, where i and j are swapped </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00585">PolysemousTraining.cpp:585</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ReproduceDistancesObjective_html_ac99d739f81e13e841ba7d81d90629aef"><div class="ttname"><a href="structfaiss_1_1ReproduceDistancesObjective.html#ac99d739f81e13e841ba7d81d90629aef">faiss::ReproduceDistancesObjective::target_dis</a></div><div class="ttdeci">const double * target_dis</div><div class="ttdoc">wanted distances (size n^2) </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00069">PolysemousTraining.h:69</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_aa61330eadb84772b71018b093773a5f9"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#aa61330eadb84772b71018b093773a5f9">faiss::ProductQuantizer::code_size</a></div><div class="ttdeci">size_t code_size</div><div class="ttdoc">byte per indexed vector </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00034">ProductQuantizer.h:34</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SimulatedAnnealingOptimizer_html_aa8ff19f97482c6213b2a8ff3b190412b"><div class="ttname"><a href="structfaiss_1_1SimulatedAnnealingOptimizer.html#aa8ff19f97482c6213b2a8ff3b190412b">faiss::SimulatedAnnealingOptimizer::init_cost</a></div><div class="ttdeci">double init_cost</div><div class="ttdoc">remember intial cost of optimization </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00109">PolysemousTraining.h:109</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RandomGenerator_html_a583f124ecacdbe037ac96e23a44dd420"><div class="ttname"><a href="structfaiss_1_1RandomGenerator.html#a583f124ecacdbe037ac96e23a44dd420">faiss::RandomGenerator::rand_int</a></div><div class="ttdeci">int rand_int()</div><div class="ttdoc">random 31-bit positive integer </div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a0feee45e4151547b7a0444c14bad398f"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a0feee45e4151547b7a0444c14bad398f">faiss::ProductQuantizer::ksub</a></div><div class="ttdeci">size_t ksub</div><div class="ttdoc">number of centroids for each subquantizer </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00035">ProductQuantizer.h:35</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html_a0ac61389b6fcc7f98e998d9d0cc2664a"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html#a0ac61389b6fcc7f98e998d9d0cc2664a">faiss::PolysemousTraining::optimize_ranking</a></div><div class="ttdeci">void optimize_ranking(ProductQuantizer &pq, size_t n, const float *x) const </div><div class="ttdoc">called by optimize_pq_for_hamming </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00826">PolysemousTraining.cpp:826</a></div></div>
|
|
<div class="ttc" id="namespacefaiss_html_a3d9c7db82d43c1f0ab1d28b92bc9fe57"><div class="ttname"><a href="namespacefaiss.html#a3d9c7db82d43c1f0ab1d28b92bc9fe57">faiss::pairwise_L2sqr</a></div><div class="ttdeci">void pairwise_L2sqr(long d, long nq, const float *xq, long nb, const float *xb, float *dis, long ldq, long ldb, long ldd)</div><div class="ttdef"><b>Definition:</b> <a href="utils_8cpp_source.html#l01342">utils.cpp:1342</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Score3Computer_html_a1c4537d67802aef28ccc57c4bd87f766"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#a1c4537d67802aef28ccc57c4bd87f766">faiss::Score3Computer::compute_cost</a></div><div class="ttdeci">double compute_cost(const int *perm) const override</div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00631">PolysemousTraining.cpp:631</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Score3Computer_html"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html">faiss::Score3Computer</a></div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00443">PolysemousTraining.cpp:443</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_1ReproduceDistancesObjective_html_a982332b44ff32b9ae9694e374acd0aff"><div class="ttname"><a href="structfaiss_1_1ReproduceDistancesObjective.html#a982332b44ff32b9ae9694e374acd0aff">faiss::ReproduceDistancesObjective::weights</a></div><div class="ttdeci">std::vector< double > weights</div><div class="ttdoc">weights for each distance (size n^2) </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00070">PolysemousTraining.h:70</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RankingScore2_html_a16c753a4136b3c851ea81133a26a02da"><div class="ttname"><a href="structfaiss_1_1RankingScore2.html#a16c753a4136b3c851ea81133a26a02da">faiss::RankingScore2::accum_gt_weight_diff</a></div><div class="ttdeci">double accum_gt_weight_diff(const std::vector< int > &a, const std::vector< int > &b)</div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00682">PolysemousTraining.cpp:682</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SimulatedAnnealingParameters_html"><div class="ttname"><a href="structfaiss_1_1SimulatedAnnealingParameters.html">faiss::SimulatedAnnealingParameters</a></div><div class="ttdoc">parameters used for the simulated annealing method </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00025">PolysemousTraining.h:25</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1IndirectSort_html"><div class="ttname"><a href="structfaiss_1_1IndirectSort.html">faiss::IndirectSort</a></div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00647">PolysemousTraining.cpp:647</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1Score3Computer_html_acf371848bac76ba275ceb5e10f805d33"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#acf371848bac76ba275ceb5e10f805d33">faiss::Score3Computer::update_i_cross</a></div><div class="ttdeci">Taccu update_i_cross(const int *perm, int iw, int jw, int ip0, int ip, const Ttab *n_gt_i) const </div><div class="ttdoc">considers the 2 pairs of crossing lines j=iw or jw and k = iw or kw </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00606">PolysemousTraining.cpp:606</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a83600e328893ce5f41fe459f5a3acf41"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a83600e328893ce5f41fe459f5a3acf41">faiss::ProductQuantizer::M</a></div><div class="ttdeci">size_t M</div><div class="ttdoc">number of subquantizers </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00028">ProductQuantizer.h:28</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html_aeb5a523056697934972f95fd428f61efa4f1f59a0027c1662a7aaf66f2a78fb23"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html#aeb5a523056697934972f95fd428f61efa4f1f59a0027c1662a7aaf66f2a78fb23">faiss::PolysemousTraining::OT_ReproduceDistances_affine</a></div><div class="ttdoc">default </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00129">PolysemousTraining.h:129</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PermutationObjective_html"><div class="ttname"><a href="structfaiss_1_1PermutationObjective.html">faiss::PermutationObjective</a></div><div class="ttdoc">abstract class for the loss function </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00044">PolysemousTraining.h:44</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_1Score3Computer_html_a227601c3dc8779bb13747ba04934e0c8"><div class="ttname"><a href="structfaiss_1_1Score3Computer.html#a227601c3dc8779bb13747ba04934e0c8">faiss::Score3Computer::update_k</a></div><div class="ttdeci">Taccu update_k(const int *perm, int iw, int jw, int ip0, int ip, int jp0, int jp, int k, const Ttab *n_gt_ij) const </div><div class="ttdoc">used for the 8 cells were the 3 indices are swapped </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00566">PolysemousTraining.cpp:566</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ReproduceDistancesObjective_html_a6681846eb7751b32a907d075fff6770b"><div class="ttname"><a href="structfaiss_1_1ReproduceDistancesObjective.html#a6681846eb7751b32a907d075fff6770b">faiss::ReproduceDistancesObjective::source_dis</a></div><div class="ttdeci">std::vector< double > source_dis</div><div class="ttdoc">&quot;real&quot; corrected distances (size n^2) </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00068">PolysemousTraining.h:68</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a4f0f33c011dffe633a1748a48a082c22"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a4f0f33c011dffe633a1748a48a082c22">faiss::ProductQuantizer::get_centroids</a></div><div class="ttdeci">float * get_centroids(size_t m, size_t i)</div><div class="ttdoc">return the centroids associated with subvector m </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00055">ProductQuantizer.h:55</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html_a6989e2b573d4368e7f863edbbb2f00b8"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html#a6989e2b573d4368e7f863edbbb2f00b8">faiss::PolysemousTraining::optimize_reproduce_distances</a></div><div class="ttdeci">void optimize_reproduce_distances(ProductQuantizer &pq) const </div><div class="ttdoc">called by optimize_pq_for_hamming </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00763">PolysemousTraining.cpp:763</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1PolysemousTraining_html_a995374ba2f0bc2738edae72ca9142f82"><div class="ttname"><a href="structfaiss_1_1PolysemousTraining.html#a995374ba2f0bc2738edae72ca9142f82">faiss::PolysemousTraining::optimize_pq_for_hamming</a></div><div class="ttdeci">void optimize_pq_for_hamming(ProductQuantizer &pq, size_t n, const float *x) const </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00933">PolysemousTraining.cpp:933</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1ProductQuantizer_html_a567cd512438f9e3404d9339a232d7695"><div class="ttname"><a href="structfaiss_1_1ProductQuantizer.html#a567cd512438f9e3404d9339a232d7695">faiss::ProductQuantizer::d</a></div><div class="ttdeci">size_t d</div><div class="ttdoc">size of the input vectors </div><div class="ttdef"><b>Definition:</b> <a href="ProductQuantizer_8h_source.html#l00027">ProductQuantizer.h:27</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1RankingScore2_html"><div class="ttname"><a href="structfaiss_1_1RankingScore2.html">faiss::RankingScore2</a></div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8cpp_source.html#l00654">PolysemousTraining.cpp:654</a></div></div>
|
|
<div class="ttc" id="structfaiss_1_1SimulatedAnnealingOptimizer_html"><div class="ttname"><a href="structfaiss_1_1SimulatedAnnealingOptimizer.html">faiss::SimulatedAnnealingOptimizer</a></div><div class="ttdoc">Simulated annealing optimization algorithm for permutations. </div><div class="ttdef"><b>Definition:</b> <a href="PolysemousTraining_8h_source.html#l00098">PolysemousTraining.h:98</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>
|