faiss 0.2.5 → 0.2.7

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/LICENSE.txt +1 -1
  4. data/ext/faiss/extconf.rb +1 -1
  5. data/ext/faiss/index.cpp +13 -0
  6. data/lib/faiss/version.rb +1 -1
  7. data/lib/faiss.rb +2 -2
  8. data/vendor/faiss/faiss/AutoTune.cpp +15 -4
  9. data/vendor/faiss/faiss/AutoTune.h +0 -1
  10. data/vendor/faiss/faiss/Clustering.cpp +1 -5
  11. data/vendor/faiss/faiss/Clustering.h +0 -2
  12. data/vendor/faiss/faiss/IVFlib.h +0 -2
  13. data/vendor/faiss/faiss/Index.h +1 -2
  14. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +17 -3
  15. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +10 -1
  16. data/vendor/faiss/faiss/IndexBinary.h +0 -1
  17. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -1
  18. data/vendor/faiss/faiss/IndexBinaryFlat.h +4 -0
  19. data/vendor/faiss/faiss/IndexBinaryHash.cpp +1 -3
  20. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +273 -48
  21. data/vendor/faiss/faiss/IndexBinaryIVF.h +18 -11
  22. data/vendor/faiss/faiss/IndexFastScan.cpp +13 -10
  23. data/vendor/faiss/faiss/IndexFastScan.h +5 -1
  24. data/vendor/faiss/faiss/IndexFlat.cpp +16 -3
  25. data/vendor/faiss/faiss/IndexFlat.h +1 -1
  26. data/vendor/faiss/faiss/IndexFlatCodes.cpp +5 -0
  27. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -2
  28. data/vendor/faiss/faiss/IndexHNSW.cpp +3 -6
  29. data/vendor/faiss/faiss/IndexHNSW.h +0 -1
  30. data/vendor/faiss/faiss/IndexIDMap.cpp +4 -4
  31. data/vendor/faiss/faiss/IndexIDMap.h +0 -2
  32. data/vendor/faiss/faiss/IndexIVF.cpp +155 -129
  33. data/vendor/faiss/faiss/IndexIVF.h +121 -61
  34. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +2 -2
  35. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +12 -11
  36. data/vendor/faiss/faiss/IndexIVFFastScan.h +6 -1
  37. data/vendor/faiss/faiss/IndexIVFPQ.cpp +221 -165
  38. data/vendor/faiss/faiss/IndexIVFPQ.h +1 -0
  39. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +6 -1
  40. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +0 -2
  41. data/vendor/faiss/faiss/IndexNNDescent.cpp +1 -2
  42. data/vendor/faiss/faiss/IndexNNDescent.h +0 -1
  43. data/vendor/faiss/faiss/IndexNSG.cpp +1 -2
  44. data/vendor/faiss/faiss/IndexPQ.cpp +7 -9
  45. data/vendor/faiss/faiss/IndexRefine.cpp +1 -1
  46. data/vendor/faiss/faiss/IndexReplicas.cpp +3 -4
  47. data/vendor/faiss/faiss/IndexReplicas.h +0 -1
  48. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +8 -1
  49. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +7 -0
  50. data/vendor/faiss/faiss/IndexShards.cpp +26 -109
  51. data/vendor/faiss/faiss/IndexShards.h +2 -3
  52. data/vendor/faiss/faiss/IndexShardsIVF.cpp +246 -0
  53. data/vendor/faiss/faiss/IndexShardsIVF.h +42 -0
  54. data/vendor/faiss/faiss/MetaIndexes.cpp +86 -0
  55. data/vendor/faiss/faiss/MetaIndexes.h +29 -0
  56. data/vendor/faiss/faiss/MetricType.h +14 -0
  57. data/vendor/faiss/faiss/VectorTransform.cpp +8 -10
  58. data/vendor/faiss/faiss/VectorTransform.h +1 -3
  59. data/vendor/faiss/faiss/clone_index.cpp +232 -18
  60. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +25 -3
  61. data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +7 -0
  62. data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +78 -0
  63. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +20 -6
  64. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +7 -1
  65. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +21 -7
  66. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +7 -0
  67. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +7 -0
  68. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +10 -3
  69. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +7 -1
  70. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +11 -3
  71. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +25 -2
  72. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +76 -29
  73. data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
  74. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +14 -13
  75. data/vendor/faiss/faiss/gpu/GpuDistance.h +18 -6
  76. data/vendor/faiss/faiss/gpu/GpuIndex.h +23 -21
  77. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +10 -10
  78. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +11 -12
  79. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +29 -50
  80. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +3 -3
  81. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +8 -8
  82. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +4 -4
  83. data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -5
  84. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +9 -7
  85. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +4 -4
  86. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
  87. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +1 -1
  88. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +55 -6
  89. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +20 -6
  90. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +95 -25
  91. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +67 -16
  92. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +4 -4
  93. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +7 -7
  94. data/vendor/faiss/faiss/gpu/test/TestUtils.h +4 -4
  95. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +1 -1
  96. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +6 -0
  97. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +0 -7
  98. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +9 -9
  99. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +1 -1
  100. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +2 -7
  101. data/vendor/faiss/faiss/impl/CodePacker.cpp +67 -0
  102. data/vendor/faiss/faiss/impl/CodePacker.h +71 -0
  103. data/vendor/faiss/faiss/impl/DistanceComputer.h +0 -2
  104. data/vendor/faiss/faiss/impl/HNSW.cpp +3 -7
  105. data/vendor/faiss/faiss/impl/HNSW.h +6 -9
  106. data/vendor/faiss/faiss/impl/IDSelector.cpp +1 -1
  107. data/vendor/faiss/faiss/impl/IDSelector.h +39 -1
  108. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +62 -51
  109. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +11 -12
  110. data/vendor/faiss/faiss/impl/NNDescent.cpp +3 -9
  111. data/vendor/faiss/faiss/impl/NNDescent.h +10 -10
  112. data/vendor/faiss/faiss/impl/NSG.cpp +1 -6
  113. data/vendor/faiss/faiss/impl/NSG.h +4 -7
  114. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +1 -15
  115. data/vendor/faiss/faiss/impl/PolysemousTraining.h +11 -10
  116. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +0 -7
  117. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +25 -12
  118. data/vendor/faiss/faiss/impl/ProductQuantizer.h +2 -4
  119. data/vendor/faiss/faiss/impl/Quantizer.h +6 -3
  120. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +796 -174
  121. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +16 -8
  122. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +3 -5
  123. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +4 -4
  124. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +3 -3
  125. data/vendor/faiss/faiss/impl/ThreadedIndex.h +4 -4
  126. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +291 -0
  127. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +74 -0
  128. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +123 -0
  129. data/vendor/faiss/faiss/impl/code_distance/code_distance_avx512.h +102 -0
  130. data/vendor/faiss/faiss/impl/index_read.cpp +13 -10
  131. data/vendor/faiss/faiss/impl/index_write.cpp +3 -4
  132. data/vendor/faiss/faiss/impl/kmeans1d.cpp +0 -1
  133. data/vendor/faiss/faiss/impl/kmeans1d.h +3 -3
  134. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +1 -1
  135. data/vendor/faiss/faiss/impl/platform_macros.h +61 -0
  136. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +48 -4
  137. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +18 -4
  138. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +2 -2
  139. data/vendor/faiss/faiss/index_factory.cpp +8 -10
  140. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +29 -12
  141. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +8 -2
  142. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
  143. data/vendor/faiss/faiss/invlists/DirectMap.h +2 -4
  144. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +118 -18
  145. data/vendor/faiss/faiss/invlists/InvertedLists.h +44 -4
  146. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +3 -3
  147. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  148. data/vendor/faiss/faiss/python/python_callbacks.cpp +1 -1
  149. data/vendor/faiss/faiss/python/python_callbacks.h +1 -1
  150. data/vendor/faiss/faiss/utils/AlignedTable.h +3 -1
  151. data/vendor/faiss/faiss/utils/Heap.cpp +139 -3
  152. data/vendor/faiss/faiss/utils/Heap.h +35 -1
  153. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +84 -0
  154. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +196 -0
  155. data/vendor/faiss/faiss/utils/approx_topk/generic.h +138 -0
  156. data/vendor/faiss/faiss/utils/approx_topk/mode.h +34 -0
  157. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +367 -0
  158. data/vendor/faiss/faiss/utils/distances.cpp +61 -7
  159. data/vendor/faiss/faiss/utils/distances.h +11 -0
  160. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +346 -0
  161. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +36 -0
  162. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +42 -0
  163. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +40 -0
  164. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +352 -0
  165. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +32 -0
  166. data/vendor/faiss/faiss/utils/distances_simd.cpp +515 -327
  167. data/vendor/faiss/faiss/utils/extra_distances-inl.h +17 -1
  168. data/vendor/faiss/faiss/utils/extra_distances.cpp +37 -8
  169. data/vendor/faiss/faiss/utils/extra_distances.h +2 -1
  170. data/vendor/faiss/faiss/utils/fp16-fp16c.h +7 -0
  171. data/vendor/faiss/faiss/utils/fp16-inl.h +7 -0
  172. data/vendor/faiss/faiss/utils/fp16.h +7 -0
  173. data/vendor/faiss/faiss/utils/hamming-inl.h +0 -456
  174. data/vendor/faiss/faiss/utils/hamming.cpp +104 -120
  175. data/vendor/faiss/faiss/utils/hamming.h +21 -10
  176. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +535 -0
  177. data/vendor/faiss/faiss/utils/hamming_distance/common.h +48 -0
  178. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +519 -0
  179. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +26 -0
  180. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +614 -0
  181. data/vendor/faiss/faiss/utils/partitioning.cpp +21 -25
  182. data/vendor/faiss/faiss/utils/simdlib_avx2.h +344 -3
  183. data/vendor/faiss/faiss/utils/simdlib_emulated.h +390 -0
  184. data/vendor/faiss/faiss/utils/simdlib_neon.h +655 -130
  185. data/vendor/faiss/faiss/utils/sorting.cpp +692 -0
  186. data/vendor/faiss/faiss/utils/sorting.h +71 -0
  187. data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +165 -0
  188. data/vendor/faiss/faiss/utils/utils.cpp +4 -176
  189. data/vendor/faiss/faiss/utils/utils.h +2 -9
  190. metadata +30 -4
  191. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +0 -26
@@ -8,7 +8,6 @@
8
8
  // -*- c++ -*-
9
9
 
10
10
  #include <faiss/impl/PolysemousTraining.h>
11
- #include "faiss/impl/FaissAssert.h"
12
11
 
13
12
  #include <omp.h>
14
13
  #include <stdint.h>
@@ -36,19 +35,6 @@ namespace faiss {
36
35
  * Optimization code
37
36
  ****************************************************/
38
37
 
39
- SimulatedAnnealingParameters::SimulatedAnnealingParameters() {
40
- // set some reasonable defaults for the optimization
41
- init_temperature = 0.7;
42
- temperature_decay = pow(0.9, 1 / 500.);
43
- // reduce by a factor 0.9 every 500 it
44
- n_iter = 500000;
45
- n_redo = 2;
46
- seed = 123;
47
- verbose = 0;
48
- only_bit_flips = false;
49
- init_random = false;
50
- }
51
-
52
38
  // what would the cost update be if iw and jw were swapped?
53
39
  // default implementation just computes both and computes the difference
54
40
  double PermutationObjective::cost_update(const int* perm, int iw, int jw)
@@ -906,7 +892,7 @@ void PolysemousTraining::optimize_ranking(
906
892
  ScopeDeleter1<PermutationObjective> del(obj);
907
893
 
908
894
  if (verbose > 0) {
909
- printf(" m=%d, nq=%zd, nb=%zd, intialize RankingScore "
895
+ printf(" m=%d, nq=%zd, nb=%zd, initialize RankingScore "
910
896
  "in %.3f ms\n",
911
897
  m,
912
898
  nq,
@@ -17,18 +17,19 @@ namespace faiss {
17
17
  /// parameters used for the simulated annealing method
18
18
  struct SimulatedAnnealingParameters {
19
19
  // optimization parameters
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
26
- int verbose;
27
- bool only_bit_flips; // restrict permutation changes to bit flips
28
- bool init_random; // initialize with a random permutation (not identity)
20
+ double init_temperature = 0.7; // init probability of accepting a bad swap
21
+ // at each iteration the temp is multiplied by this
22
+ double temperature_decay = 0.9997893011688015; // = 0.9^(1/500)
23
+ int n_iter = 500000; // nb of iterations
24
+ int n_redo = 2; // nb of runs of the simulation
25
+ int seed = 123; // random seed
26
+ int verbose = 0;
27
+ bool only_bit_flips = false; // restrict permutation changes to bit flips
28
+ bool init_random =
29
+ false; // initialize with a random permutation (not identity)
29
30
 
30
31
  // set reasonable defaults
31
- SimulatedAnnealingParameters();
32
+ SimulatedAnnealingParameters() {}
32
33
  };
33
34
 
34
35
  /// abstract class for the loss function
@@ -65,13 +65,6 @@ void ProductAdditiveQuantizer::init(
65
65
  M += q->M;
66
66
  nbits.insert(nbits.end(), q->nbits.begin(), q->nbits.end());
67
67
  }
68
- verbose = false;
69
- is_trained = false;
70
- norm_max = norm_min = NAN;
71
- code_size = 0;
72
- tot_bits = 0;
73
- total_codebook_size = 0;
74
- only_8bit = false;
75
68
  set_derived_values();
76
69
 
77
70
  // ProductAdditiveQuantizer
@@ -421,15 +421,28 @@ void ProductQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
421
421
 
422
422
  void ProductQuantizer::compute_distance_table(const float* x, float* dis_table)
423
423
  const {
424
- size_t m;
425
-
426
- for (m = 0; m < M; m++) {
427
- fvec_L2sqr_ny(
428
- dis_table + m * ksub,
429
- x + m * dsub,
430
- get_centroids(m, 0),
431
- dsub,
432
- ksub);
424
+ if (transposed_centroids.empty()) {
425
+ // use regular version
426
+ for (size_t m = 0; m < M; m++) {
427
+ fvec_L2sqr_ny(
428
+ dis_table + m * ksub,
429
+ x + m * dsub,
430
+ get_centroids(m, 0),
431
+ dsub,
432
+ ksub);
433
+ }
434
+ } else {
435
+ // transposed centroids are available, use'em
436
+ for (size_t m = 0; m < M; m++) {
437
+ fvec_L2sqr_ny_transposed(
438
+ dis_table + m * ksub,
439
+ x + m * dsub,
440
+ transposed_centroids.data() + m * ksub,
441
+ centroids_sq_lengths.data() + m * ksub,
442
+ dsub,
443
+ M * ksub,
444
+ ksub);
445
+ }
433
446
  }
434
447
  }
435
448
 
@@ -460,7 +473,7 @@ void ProductQuantizer::compute_distance_tables(
460
473
  #endif
461
474
  if (dsub < 16) {
462
475
 
463
- #pragma omp parallel for
476
+ #pragma omp parallel for if (nx > 1)
464
477
  for (int64_t i = 0; i < nx; i++) {
465
478
  compute_distance_table(x + i * d, dis_tables + i * ksub * M);
466
479
  }
@@ -494,7 +507,7 @@ void ProductQuantizer::compute_inner_prod_tables(
494
507
  #endif
495
508
  if (dsub < 16) {
496
509
 
497
- #pragma omp parallel for
510
+ #pragma omp parallel for if (nx > 1)
498
511
  for (int64_t i = 0; i < nx; i++) {
499
512
  compute_inner_prod_table(x + i * d, dis_tables + i * ksub * M);
500
513
  }
@@ -668,7 +681,7 @@ void pq_knn_search_with_tables(
668
681
  size_t k = res->k, nx = res->nh;
669
682
  size_t ksub = pq.ksub, M = pq.M;
670
683
 
671
- #pragma omp parallel for
684
+ #pragma omp parallel for if (nx > 1)
672
685
  for (int64_t i = 0; i < nx; i++) {
673
686
  /* query preparation for asymmetric search: compute look-up tables */
674
687
  const float* dis_table = dis_tables + i * ksub * M;
@@ -23,8 +23,6 @@ namespace faiss {
23
23
 
24
24
  /** Product Quantizer. Implemented only for METRIC_L2 */
25
25
  struct ProductQuantizer : Quantizer {
26
- using idx_t = Index::idx_t;
27
-
28
26
  size_t M; ///< number of subquantizers
29
27
  size_t nbits; ///< number of bits per quantization index
30
28
 
@@ -38,8 +36,8 @@ struct ProductQuantizer : Quantizer {
38
36
  Train_default,
39
37
  Train_hot_start, ///< the centroids are already initialized
40
38
  Train_shared, ///< share dictionary accross PQ segments
41
- Train_hypercube, ///< intialize centroids with nbits-D hypercube
42
- Train_hypercube_pca, ///< intialize centroids with nbits-D hypercube
39
+ Train_hypercube, ///< initialize centroids with nbits-D hypercube
40
+ Train_hypercube_pca, ///< initialize centroids with nbits-D hypercube
43
41
  };
44
42
  train_type_t train_type;
45
43
 
@@ -1,4 +1,9 @@
1
- // (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
2
7
 
3
8
  #pragma once
4
9
 
@@ -8,8 +13,6 @@ namespace faiss {
8
13
 
9
14
  /** Product Quantizer. Implemented only for METRIC_L2 */
10
15
  struct Quantizer {
11
- using idx_t = Index::idx_t;
12
-
13
16
  size_t d; ///< size of the input vectors
14
17
  size_t code_size; ///< bytes per indexed vector
15
18