faiss 0.1.7 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +7 -7
  4. data/ext/faiss/ext.cpp +1 -1
  5. data/ext/faiss/extconf.rb +8 -2
  6. data/ext/faiss/index.cpp +102 -69
  7. data/ext/faiss/index_binary.cpp +24 -30
  8. data/ext/faiss/kmeans.cpp +20 -16
  9. data/ext/faiss/numo.hpp +867 -0
  10. data/ext/faiss/pca_matrix.cpp +13 -14
  11. data/ext/faiss/product_quantizer.cpp +23 -24
  12. data/ext/faiss/utils.cpp +10 -37
  13. data/ext/faiss/utils.h +2 -13
  14. data/lib/faiss/version.rb +1 -1
  15. data/lib/faiss.rb +0 -5
  16. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  17. data/vendor/faiss/faiss/AutoTune.h +55 -56
  18. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  19. data/vendor/faiss/faiss/Clustering.h +88 -35
  20. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  21. data/vendor/faiss/faiss/IVFlib.h +48 -51
  22. data/vendor/faiss/faiss/Index.cpp +85 -103
  23. data/vendor/faiss/faiss/Index.h +54 -48
  24. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  25. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  26. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  27. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  28. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  29. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  30. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  31. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  32. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  33. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  34. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  35. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  36. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  37. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  38. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  39. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  40. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  41. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  42. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  43. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +125 -133
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  54. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  55. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +115 -131
  69. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  73. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  74. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  75. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  76. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  77. data/vendor/faiss/faiss/IndexShards.h +85 -73
  78. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  79. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  80. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  81. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  82. data/vendor/faiss/faiss/MetricType.h +7 -7
  83. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  84. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  85. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  86. data/vendor/faiss/faiss/clone_index.h +4 -9
  87. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  88. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  89. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  90. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  91. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  92. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  93. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  94. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  95. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  96. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  97. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  101. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  102. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  103. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  104. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  106. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  108. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  110. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  112. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  113. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  114. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  115. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  116. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  121. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  122. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  124. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  125. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  126. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  128. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  129. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  130. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  131. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  133. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  135. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  136. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  137. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  138. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  139. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  140. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  142. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  144. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  145. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  146. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  148. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  149. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  151. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  153. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  154. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  156. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  157. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  158. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  159. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  160. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  161. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  162. data/vendor/faiss/faiss/impl/io.h +31 -41
  163. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  164. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  165. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  166. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  167. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  171. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  172. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  173. data/vendor/faiss/faiss/index_factory.h +6 -7
  174. data/vendor/faiss/faiss/index_io.h +23 -26
  175. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  177. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  178. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  179. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  180. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  181. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  183. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  185. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  186. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  187. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  188. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  189. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  190. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  191. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  192. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  193. data/vendor/faiss/faiss/utils/distances.h +133 -118
  194. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  195. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  196. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  197. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  198. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  199. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  200. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  201. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  202. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  203. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  204. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  205. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  206. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  207. data/vendor/faiss/faiss/utils/random.h +13 -16
  208. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  209. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  210. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  211. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  212. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  213. data/vendor/faiss/faiss/utils/utils.h +53 -48
  214. metadata +26 -12
  215. data/lib/faiss/index.rb +0 -20
  216. data/lib/faiss/index_binary.rb +0 -20
  217. data/lib/faiss/kmeans.rb +0 -15
  218. data/lib/faiss/pca_matrix.rb +0 -15
  219. data/lib/faiss/product_quantizer.rb +0 -22
@@ -10,62 +10,56 @@
10
10
  #ifndef FAISS_POLYSEMOUS_TRAINING_INCLUDED
11
11
  #define FAISS_POLYSEMOUS_TRAINING_INCLUDED
12
12
 
13
-
14
13
  #include <faiss/impl/ProductQuantizer.h>
15
14
 
16
-
17
15
  namespace faiss {
18
16
 
19
-
20
17
  /// parameters used for the simulated annealing method
21
18
  struct SimulatedAnnealingParameters {
22
-
23
19
  // optimization parameters
24
- double init_temperature; // init probability of accepting a bad swap
25
- double temperature_decay; // at each iteration the temp is multiplied by this
26
- int n_iter; // nb of iterations
27
- int n_redo; // nb of runs of the simulation
28
- int seed; // random seed
20
+ double init_temperature; // init probability of accepting a bad swap
21
+ double temperature_decay; // at each iteration the temp is multiplied by
22
+ // this
23
+ int n_iter; // nb of iterations
24
+ int n_redo; // nb of runs of the simulation
25
+ int seed; // random seed
29
26
  int verbose;
30
27
  bool only_bit_flips; // restrict permutation changes to bit flips
31
- bool init_random; // initialize with a random permutation (not identity)
28
+ bool init_random; // initialize with a random permutation (not identity)
32
29
 
33
30
  // set reasonable defaults
34
- SimulatedAnnealingParameters ();
35
-
31
+ SimulatedAnnealingParameters();
36
32
  };
37
33
 
38
-
39
34
  /// abstract class for the loss function
40
35
  struct PermutationObjective {
41
-
42
36
  int n;
43
37
 
44
- virtual double compute_cost (const int *perm) const = 0;
38
+ virtual double compute_cost(const int* perm) const = 0;
45
39
 
46
40
  // what would the cost update be if iw and jw were swapped?
47
41
  // default implementation just computes both and computes the difference
48
- virtual double cost_update (const int *perm, int iw, int jw) const;
42
+ virtual double cost_update(const int* perm, int iw, int jw) const;
49
43
 
50
- virtual ~PermutationObjective () {}
44
+ virtual ~PermutationObjective() {}
51
45
  };
52
46
 
53
-
54
47
  struct ReproduceDistancesObjective : PermutationObjective {
55
-
56
48
  double dis_weight_factor;
57
49
 
58
- static double sqr (double x) { return x * x; }
50
+ static double sqr(double x) {
51
+ return x * x;
52
+ }
59
53
 
60
54
  // weighting of distances: it is more important to reproduce small
61
55
  // distances well
62
- double dis_weight (double x) const;
56
+ double dis_weight(double x) const;
63
57
 
64
58
  std::vector<double> source_dis; ///< "real" corrected distances (size n^2)
65
- const double * target_dis; ///< wanted distances (size n^2)
59
+ const double* target_dis; ///< wanted distances (size n^2)
66
60
  std::vector<double> weights; ///< weights for each distance (size n^2)
67
61
 
68
- double get_source_dis (int i, int j) const;
62
+ double get_source_dis(int i, int j) const;
69
63
 
70
64
  // cost = quadratic difference between actual distance and Hamming distance
71
65
  double compute_cost(const int* perm) const override;
@@ -74,16 +68,19 @@ struct ReproduceDistancesObjective : PermutationObjective {
74
68
  // computed in O(n) instead of O(n^2) for the full re-computation
75
69
  double cost_update(const int* perm, int iw, int jw) const override;
76
70
 
77
- ReproduceDistancesObjective (
78
- int n,
79
- const double *source_dis_in,
80
- const double *target_dis_in,
81
- double dis_weight_factor);
71
+ ReproduceDistancesObjective(
72
+ int n,
73
+ const double* source_dis_in,
74
+ const double* target_dis_in,
75
+ double dis_weight_factor);
82
76
 
83
- static void compute_mean_stdev (const double *tab, size_t n2,
84
- double *mean_out, double *stddev_out);
77
+ static void compute_mean_stdev(
78
+ const double* tab,
79
+ size_t n2,
80
+ double* mean_out,
81
+ double* stddev_out);
85
82
 
86
- void set_affine_target_dis (const double *source_dis_in);
83
+ void set_affine_target_dis(const double* source_dis_in);
87
84
 
88
85
  ~ReproduceDistancesObjective() override {}
89
86
  };
@@ -91,39 +88,36 @@ struct ReproduceDistancesObjective : PermutationObjective {
91
88
  struct RandomGenerator;
92
89
 
93
90
  /// Simulated annealing optimization algorithm for permutations.
94
- struct SimulatedAnnealingOptimizer: SimulatedAnnealingParameters {
95
-
96
- PermutationObjective *obj;
91
+ struct SimulatedAnnealingOptimizer : SimulatedAnnealingParameters {
92
+ PermutationObjective* obj;
97
93
  int n; ///< size of the permutation
98
- FILE *logfile; /// logs values of the cost function
94
+ FILE* logfile; /// logs values of the cost function
99
95
 
100
- SimulatedAnnealingOptimizer (PermutationObjective *obj,
101
- const SimulatedAnnealingParameters &p);
102
- RandomGenerator *rnd;
96
+ SimulatedAnnealingOptimizer(
97
+ PermutationObjective* obj,
98
+ const SimulatedAnnealingParameters& p);
99
+ RandomGenerator* rnd;
103
100
 
104
101
  /// remember initial cost of optimization
105
102
  double init_cost;
106
103
 
107
104
  // main entry point. Perform the optimization loop, starting from
108
105
  // and modifying permutation in-place
109
- double optimize (int *perm);
106
+ double optimize(int* perm);
110
107
 
111
108
  // run the optimization and return the best result in best_perm
112
- double run_optimization (int * best_perm);
109
+ double run_optimization(int* best_perm);
113
110
 
114
- virtual ~SimulatedAnnealingOptimizer ();
111
+ virtual ~SimulatedAnnealingOptimizer();
115
112
  };
116
113
 
117
-
118
-
119
-
120
114
  /// optimizes the order of indices in a ProductQuantizer
121
- struct PolysemousTraining: SimulatedAnnealingParameters {
122
-
115
+ struct PolysemousTraining : SimulatedAnnealingParameters {
123
116
  enum Optimization_type_t {
124
117
  OT_None,
125
- OT_ReproduceDistances_affine, ///< default
126
- OT_Ranking_weighted_diff ///< same as _2, but use rank of y+ - rank of y-
118
+ OT_ReproduceDistances_affine, ///< default
119
+ OT_Ranking_weighted_diff ///< same as _2, but use rank of y+ - rank of
120
+ ///< y-
127
121
  };
128
122
  Optimization_type_t optimization_type;
129
123
 
@@ -133,26 +127,29 @@ struct PolysemousTraining: SimulatedAnnealingParameters {
133
127
  int ntrain_permutation;
134
128
  double dis_weight_factor; ///< decay of exp that weights distance loss
135
129
 
130
+ /// refuse to train if it would require more than that amount of RAM
131
+ size_t max_memory;
132
+
136
133
  // filename pattern for the logging of iterations
137
134
  std::string log_pattern;
138
135
 
139
136
  // sets default values
140
- PolysemousTraining ();
137
+ PolysemousTraining();
141
138
 
142
139
  /// reorder the centroids so that the Hamming distance becomes a
143
140
  /// good approximation of the SDC distance (called by train)
144
- void optimize_pq_for_hamming (ProductQuantizer & pq,
145
- size_t n, const float *x) const;
141
+ void optimize_pq_for_hamming(ProductQuantizer& pq, size_t n, const float* x)
142
+ const;
146
143
 
147
144
  /// called by optimize_pq_for_hamming
148
- void optimize_ranking (ProductQuantizer &pq, size_t n, const float *x) const;
145
+ void optimize_ranking(ProductQuantizer& pq, size_t n, const float* x) const;
149
146
  /// called by optimize_pq_for_hamming
150
- void optimize_reproduce_distances (ProductQuantizer &pq) const;
147
+ void optimize_reproduce_distances(ProductQuantizer& pq) const;
151
148
 
149
+ /// make sure we don't blow up the memory
150
+ size_t memory_usage_per_thread(const ProductQuantizer& pq) const;
152
151
  };
153
152
 
154
-
155
153
  } // namespace faiss
156
154
 
157
-
158
155
  #endif
@@ -7,20 +7,18 @@
7
7
 
8
8
  namespace faiss {
9
9
 
10
- inline
11
- PQEncoderGeneric::PQEncoderGeneric(uint8_t *code, int nbits,
12
- uint8_t offset)
13
- : code(code), offset(offset), nbits(nbits), reg(0)
14
- {
10
+ inline PQEncoderGeneric::PQEncoderGeneric(
11
+ uint8_t* code,
12
+ int nbits,
13
+ uint8_t offset)
14
+ : code(code), offset(offset), nbits(nbits), reg(0) {
15
15
  assert(nbits <= 64);
16
16
  if (offset > 0) {
17
17
  reg = (*code & ((1 << offset) - 1));
18
18
  }
19
19
  }
20
20
 
21
- inline
22
- void PQEncoderGeneric::encode(uint64_t x)
23
- {
21
+ inline void PQEncoderGeneric::encode(uint64_t x) {
24
22
  reg |= (uint8_t)(x << offset);
25
23
  x >>= (8 - offset);
26
24
  if (offset + nbits >= 8) {
@@ -39,51 +37,39 @@ void PQEncoderGeneric::encode(uint64_t x)
39
37
  }
40
38
  }
41
39
 
42
- inline
43
- PQEncoderGeneric::~PQEncoderGeneric()
44
- {
40
+ inline PQEncoderGeneric::~PQEncoderGeneric() {
45
41
  if (offset > 0) {
46
42
  *code = reg;
47
43
  }
48
44
  }
49
45
 
50
-
51
- inline
52
- PQEncoder8::PQEncoder8(uint8_t *code, int nbits)
53
- : code(code) {
46
+ inline PQEncoder8::PQEncoder8(uint8_t* code, int nbits) : code(code) {
54
47
  assert(8 == nbits);
55
48
  }
56
49
 
57
- inline
58
- void PQEncoder8::encode(uint64_t x) {
50
+ inline void PQEncoder8::encode(uint64_t x) {
59
51
  *code++ = (uint8_t)x;
60
52
  }
61
53
 
62
- inline
63
- PQEncoder16::PQEncoder16(uint8_t *code, int nbits)
64
- : code((uint16_t *)code) {
54
+ inline PQEncoder16::PQEncoder16(uint8_t* code, int nbits)
55
+ : code((uint16_t*)code) {
65
56
  assert(16 == nbits);
66
57
  }
67
58
 
68
- inline
69
- void PQEncoder16::encode(uint64_t x) {
59
+ inline void PQEncoder16::encode(uint64_t x) {
70
60
  *code++ = (uint16_t)x;
71
61
  }
72
62
 
73
-
74
- inline
75
- PQDecoderGeneric::PQDecoderGeneric(const uint8_t *code,
76
- int nbits)
77
- : code(code),
78
- offset(0),
79
- nbits(nbits),
80
- mask((1ull << nbits) - 1),
81
- reg(0) {
63
+ inline PQDecoderGeneric::PQDecoderGeneric(const uint8_t* code, int nbits)
64
+ : code(code),
65
+ offset(0),
66
+ nbits(nbits),
67
+ mask((1ull << nbits) - 1),
68
+ reg(0) {
82
69
  assert(nbits <= 64);
83
70
  }
84
71
 
85
- inline
86
- uint64_t PQDecoderGeneric::decode() {
72
+ inline uint64_t PQDecoderGeneric::decode() {
87
73
  if (offset == 0) {
88
74
  reg = *code;
89
75
  }
@@ -110,27 +96,20 @@ uint64_t PQDecoderGeneric::decode() {
110
96
  return c & mask;
111
97
  }
112
98
 
113
-
114
- inline
115
- PQDecoder8::PQDecoder8(const uint8_t *code, int nbits)
116
- : code(code) {
117
- assert(8 == nbits);
99
+ inline PQDecoder8::PQDecoder8(const uint8_t* code, int nbits_in) : code(code) {
100
+ assert(8 == nbits_in);
118
101
  }
119
102
 
120
- inline
121
- uint64_t PQDecoder8::decode() {
103
+ inline uint64_t PQDecoder8::decode() {
122
104
  return (uint64_t)(*code++);
123
105
  }
124
106
 
125
-
126
- inline
127
- PQDecoder16::PQDecoder16(const uint8_t *code, int nbits)
128
- : code((uint16_t *)code) {
129
- assert(16 == nbits);
107
+ inline PQDecoder16::PQDecoder16(const uint8_t* code, int nbits_in)
108
+ : code((uint16_t*)code) {
109
+ assert(16 == nbits_in);
130
110
  }
131
111
 
132
- inline
133
- uint64_t PQDecoder16::decode() {
112
+ inline uint64_t PQDecoder16::decode() {
134
113
  return (uint64_t)(*code++);
135
114
  }
136
115