faiss 0.1.2 → 0.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/faiss/extconf.rb +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/benchs/bench_6bit_codec.cpp +80 -0
- data/vendor/faiss/c_api/AutoTune_c.h +2 -0
- data/vendor/faiss/c_api/IndexShards_c.cpp +0 -6
- data/vendor/faiss/c_api/IndexShards_c.h +1 -4
- data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +4 -2
- data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +1 -1
- data/vendor/faiss/demos/demo_imi_flat.cpp +5 -2
- data/vendor/faiss/demos/demo_imi_pq.cpp +6 -2
- data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +7 -2
- data/vendor/faiss/{AutoTune.cpp → faiss/AutoTune.cpp} +9 -9
- data/vendor/faiss/{AutoTune.h → faiss/AutoTune.h} +0 -0
- data/vendor/faiss/{Clustering.cpp → faiss/Clustering.cpp} +13 -12
- data/vendor/faiss/{Clustering.h → faiss/Clustering.h} +0 -0
- data/vendor/faiss/{DirectMap.cpp → faiss/DirectMap.cpp} +0 -0
- data/vendor/faiss/{DirectMap.h → faiss/DirectMap.h} +0 -0
- data/vendor/faiss/{IVFlib.cpp → faiss/IVFlib.cpp} +86 -11
- data/vendor/faiss/{IVFlib.h → faiss/IVFlib.h} +26 -8
- data/vendor/faiss/{Index.cpp → faiss/Index.cpp} +0 -0
- data/vendor/faiss/{Index.h → faiss/Index.h} +1 -1
- data/vendor/faiss/{Index2Layer.cpp → faiss/Index2Layer.cpp} +12 -11
- data/vendor/faiss/{Index2Layer.h → faiss/Index2Layer.h} +0 -0
- data/vendor/faiss/{IndexBinary.cpp → faiss/IndexBinary.cpp} +2 -1
- data/vendor/faiss/{IndexBinary.h → faiss/IndexBinary.h} +0 -0
- data/vendor/faiss/{IndexBinaryFlat.cpp → faiss/IndexBinaryFlat.cpp} +0 -0
- data/vendor/faiss/{IndexBinaryFlat.h → faiss/IndexBinaryFlat.h} +0 -0
- data/vendor/faiss/{IndexBinaryFromFloat.cpp → faiss/IndexBinaryFromFloat.cpp} +1 -0
- data/vendor/faiss/{IndexBinaryFromFloat.h → faiss/IndexBinaryFromFloat.h} +0 -0
- data/vendor/faiss/{IndexBinaryHNSW.cpp → faiss/IndexBinaryHNSW.cpp} +1 -2
- data/vendor/faiss/{IndexBinaryHNSW.h → faiss/IndexBinaryHNSW.h} +0 -0
- data/vendor/faiss/{IndexBinaryHash.cpp → faiss/IndexBinaryHash.cpp} +16 -7
- data/vendor/faiss/{IndexBinaryHash.h → faiss/IndexBinaryHash.h} +2 -1
- data/vendor/faiss/{IndexBinaryIVF.cpp → faiss/IndexBinaryIVF.cpp} +10 -16
- data/vendor/faiss/{IndexBinaryIVF.h → faiss/IndexBinaryIVF.h} +1 -1
- data/vendor/faiss/{IndexFlat.cpp → faiss/IndexFlat.cpp} +0 -0
- data/vendor/faiss/{IndexFlat.h → faiss/IndexFlat.h} +0 -0
- data/vendor/faiss/{IndexHNSW.cpp → faiss/IndexHNSW.cpp} +63 -32
- data/vendor/faiss/{IndexHNSW.h → faiss/IndexHNSW.h} +0 -0
- data/vendor/faiss/{IndexIVF.cpp → faiss/IndexIVF.cpp} +129 -46
- data/vendor/faiss/{IndexIVF.h → faiss/IndexIVF.h} +7 -3
- data/vendor/faiss/{IndexIVFFlat.cpp → faiss/IndexIVFFlat.cpp} +6 -5
- data/vendor/faiss/{IndexIVFFlat.h → faiss/IndexIVFFlat.h} +0 -0
- data/vendor/faiss/{IndexIVFPQ.cpp → faiss/IndexIVFPQ.cpp} +9 -8
- data/vendor/faiss/{IndexIVFPQ.h → faiss/IndexIVFPQ.h} +4 -2
- data/vendor/faiss/{IndexIVFPQR.cpp → faiss/IndexIVFPQR.cpp} +3 -1
- data/vendor/faiss/{IndexIVFPQR.h → faiss/IndexIVFPQR.h} +0 -0
- data/vendor/faiss/{IndexIVFSpectralHash.cpp → faiss/IndexIVFSpectralHash.cpp} +1 -1
- data/vendor/faiss/{IndexIVFSpectralHash.h → faiss/IndexIVFSpectralHash.h} +0 -0
- data/vendor/faiss/{IndexLSH.cpp → faiss/IndexLSH.cpp} +0 -0
- data/vendor/faiss/{IndexLSH.h → faiss/IndexLSH.h} +0 -0
- data/vendor/faiss/{IndexLattice.cpp → faiss/IndexLattice.cpp} +0 -0
- data/vendor/faiss/{IndexLattice.h → faiss/IndexLattice.h} +0 -0
- data/vendor/faiss/{IndexPQ.cpp → faiss/IndexPQ.cpp} +6 -6
- data/vendor/faiss/{IndexPQ.h → faiss/IndexPQ.h} +3 -1
- data/vendor/faiss/{IndexPreTransform.cpp → faiss/IndexPreTransform.cpp} +0 -0
- data/vendor/faiss/{IndexPreTransform.h → faiss/IndexPreTransform.h} +0 -0
- data/vendor/faiss/{IndexReplicas.cpp → faiss/IndexReplicas.cpp} +102 -10
- data/vendor/faiss/{IndexReplicas.h → faiss/IndexReplicas.h} +6 -0
- data/vendor/faiss/{IndexScalarQuantizer.cpp → faiss/IndexScalarQuantizer.cpp} +3 -3
- data/vendor/faiss/{IndexScalarQuantizer.h → faiss/IndexScalarQuantizer.h} +0 -0
- data/vendor/faiss/{IndexShards.cpp → faiss/IndexShards.cpp} +37 -12
- data/vendor/faiss/{IndexShards.h → faiss/IndexShards.h} +3 -4
- data/vendor/faiss/{InvertedLists.cpp → faiss/InvertedLists.cpp} +2 -2
- data/vendor/faiss/{InvertedLists.h → faiss/InvertedLists.h} +1 -0
- data/vendor/faiss/{MatrixStats.cpp → faiss/MatrixStats.cpp} +0 -0
- data/vendor/faiss/{MatrixStats.h → faiss/MatrixStats.h} +0 -0
- data/vendor/faiss/{MetaIndexes.cpp → faiss/MetaIndexes.cpp} +5 -3
- data/vendor/faiss/{MetaIndexes.h → faiss/MetaIndexes.h} +0 -0
- data/vendor/faiss/{MetricType.h → faiss/MetricType.h} +0 -0
- data/vendor/faiss/{OnDiskInvertedLists.cpp → faiss/OnDiskInvertedLists.cpp} +141 -3
- data/vendor/faiss/{OnDiskInvertedLists.h → faiss/OnDiskInvertedLists.h} +27 -7
- data/vendor/faiss/{VectorTransform.cpp → faiss/VectorTransform.cpp} +4 -3
- data/vendor/faiss/{VectorTransform.h → faiss/VectorTransform.h} +0 -0
- data/vendor/faiss/{clone_index.cpp → faiss/clone_index.cpp} +0 -0
- data/vendor/faiss/{clone_index.h → faiss/clone_index.h} +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.cpp +14 -14
- data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.h +6 -7
- data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuDistance.h +12 -4
- data/vendor/faiss/{gpu → faiss/gpu}/GpuFaissAssert.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndex.h +3 -9
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexBinaryFlat.h +7 -7
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexFlat.h +35 -10
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVF.h +1 -2
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFFlat.h +4 -3
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFPQ.h +21 -4
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFScalarQuantizer.h +4 -3
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndicesOptions.h +0 -0
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +200 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +264 -0
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +572 -0
- data/vendor/faiss/{gpu → faiss/gpu}/StandardGpuResources.h +83 -15
- data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper-inl.h +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper.h +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfIVFPQAdd.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/perf/WriteIndex.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexBinaryFlat.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexFlat.cpp +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFFlat.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFPQ.cpp +141 -52
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuMemoryException.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.cpp +4 -2
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/demo_ivfpq_indexing_gpu.cpp +7 -5
- data/vendor/faiss/{gpu → faiss/gpu}/utils/DeviceUtils.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +213 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/StackDeviceMemory.h +25 -40
- data/vendor/faiss/{gpu → faiss/gpu}/utils/StaticUtils.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.cpp +1 -0
- data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.h +3 -1
- data/vendor/faiss/{impl → faiss/impl}/FaissAssert.h +1 -0
- data/vendor/faiss/{impl → faiss/impl}/FaissException.cpp +26 -0
- data/vendor/faiss/{impl → faiss/impl}/FaissException.h +4 -0
- data/vendor/faiss/{impl → faiss/impl}/HNSW.cpp +26 -26
- data/vendor/faiss/{impl → faiss/impl}/HNSW.h +19 -11
- data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.cpp +1 -1
- data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.h +1 -1
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer-inl.h +0 -1
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.cpp +9 -9
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.cpp +63 -39
- data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.h +1 -1
- data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex-inl.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/index_read.cpp +99 -116
- data/vendor/faiss/{impl → faiss/impl}/index_write.cpp +15 -50
- data/vendor/faiss/{impl → faiss/impl}/io.cpp +15 -10
- data/vendor/faiss/{impl → faiss/impl}/io.h +22 -8
- data/vendor/faiss/faiss/impl/io_macros.h +57 -0
- data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.cpp +52 -36
- data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.h +3 -3
- data/vendor/faiss/faiss/impl/platform_macros.h +24 -0
- data/vendor/faiss/{index_factory.cpp → faiss/index_factory.cpp} +33 -12
- data/vendor/faiss/{index_factory.h → faiss/index_factory.h} +0 -0
- data/vendor/faiss/{index_io.h → faiss/index_io.h} +55 -1
- data/vendor/faiss/faiss/python/python_callbacks.cpp +112 -0
- data/vendor/faiss/faiss/python/python_callbacks.h +45 -0
- data/vendor/faiss/{utils → faiss/utils}/Heap.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/Heap.h +1 -3
- data/vendor/faiss/{utils → faiss/utils}/WorkerThread.cpp +0 -0
- data/vendor/faiss/{utils → faiss/utils}/WorkerThread.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/distances.cpp +28 -13
- data/vendor/faiss/{utils → faiss/utils}/distances.h +2 -1
- data/vendor/faiss/{utils → faiss/utils}/distances_simd.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/extra_distances.cpp +8 -7
- data/vendor/faiss/{utils → faiss/utils}/extra_distances.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/hamming-inl.h +1 -3
- data/vendor/faiss/{utils → faiss/utils}/hamming.cpp +8 -7
- data/vendor/faiss/{utils → faiss/utils}/hamming.h +7 -1
- data/vendor/faiss/{utils → faiss/utils}/random.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/random.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/utils.cpp +27 -28
- data/vendor/faiss/{utils → faiss/utils}/utils.h +4 -0
- data/vendor/faiss/misc/test_blas.cpp +4 -1
- data/vendor/faiss/tests/test_binary_flat.cpp +0 -2
- data/vendor/faiss/tests/test_dealloc_invlists.cpp +6 -1
- data/vendor/faiss/tests/test_ivfpq_codec.cpp +4 -1
- data/vendor/faiss/tests/test_ivfpq_indexing.cpp +6 -4
- data/vendor/faiss/tests/test_lowlevel_ivf.cpp +12 -5
- data/vendor/faiss/tests/test_merge.cpp +6 -3
- data/vendor/faiss/tests/test_ondisk_ivf.cpp +7 -2
- data/vendor/faiss/tests/test_pairs_decoding.cpp +5 -1
- data/vendor/faiss/tests/test_params_override.cpp +7 -2
- data/vendor/faiss/tests/test_sliding_ivf.cpp +10 -4
- data/vendor/faiss/tutorial/cpp/1-Flat.cpp +14 -8
- data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +11 -7
- data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +12 -7
- data/vendor/faiss/tutorial/cpp/4-GPU.cpp +6 -3
- data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +7 -3
- metadata +154 -153
- data/vendor/faiss/gpu/GpuResources.cpp +0 -52
- data/vendor/faiss/gpu/GpuResources.h +0 -73
- data/vendor/faiss/gpu/StandardGpuResources.cpp +0 -303
- data/vendor/faiss/gpu/utils/DeviceMemory.cpp +0 -77
- data/vendor/faiss/gpu/utils/DeviceMemory.h +0 -71
- data/vendor/faiss/gpu/utils/MemorySpace.cpp +0 -89
- data/vendor/faiss/gpu/utils/MemorySpace.h +0 -44
- data/vendor/faiss/gpu/utils/StackDeviceMemory.cpp +0 -239
@@ -14,7 +14,7 @@
|
|
14
14
|
#include <cstring>
|
15
15
|
#include <cmath>
|
16
16
|
|
17
|
-
#ifdef
|
17
|
+
#ifdef __SSE3__
|
18
18
|
#include <immintrin.h>
|
19
19
|
#endif
|
20
20
|
|
@@ -133,7 +133,7 @@ void fvec_L2sqr_ny_ref (float * dis,
|
|
133
133
|
* SSE and AVX implementations
|
134
134
|
*/
|
135
135
|
|
136
|
-
#ifdef
|
136
|
+
#ifdef __SSE3__
|
137
137
|
|
138
138
|
// reads 0 <= d < 4 floats as __m128
|
139
139
|
static inline __m128 masked_read (int d, const float *x)
|
@@ -477,7 +477,7 @@ float fvec_Linf (const float * x, const float * y, size_t d)
|
|
477
477
|
return _mm_cvtss_f32 (msum2);
|
478
478
|
}
|
479
479
|
|
480
|
-
#elif defined(
|
480
|
+
#elif defined(__SSE3__) // But not AVX
|
481
481
|
|
482
482
|
float fvec_L1 (const float * x, const float * y, size_t d)
|
483
483
|
{
|
@@ -677,7 +677,7 @@ static inline void fvec_madd_ref (size_t n, const float *a,
|
|
677
677
|
c[i] = a[i] + bf * b[i];
|
678
678
|
}
|
679
679
|
|
680
|
-
#ifdef
|
680
|
+
#ifdef __SSE3__
|
681
681
|
|
682
682
|
static inline void fvec_madd_sse (size_t n, const float *a,
|
683
683
|
float bf, const float *b, float *c) {
|
@@ -730,7 +730,7 @@ static inline int fvec_madd_and_argmin_ref (size_t n, const float *a,
|
|
730
730
|
return imin;
|
731
731
|
}
|
732
732
|
|
733
|
-
#ifdef
|
733
|
+
#ifdef __SSE3__
|
734
734
|
|
735
735
|
static inline int fvec_madd_and_argmin_sse (
|
736
736
|
size_t n, const float *a,
|
@@ -9,6 +9,7 @@
|
|
9
9
|
|
10
10
|
#include <faiss/utils/distances.h>
|
11
11
|
|
12
|
+
#include <algorithm>
|
12
13
|
#include <cmath>
|
13
14
|
#include <omp.h>
|
14
15
|
|
@@ -163,7 +164,7 @@ void knn_extra_metrics_template (
|
|
163
164
|
size_t i1 = std::min(i0 + check_period, nx);
|
164
165
|
|
165
166
|
#pragma omp parallel for
|
166
|
-
for (
|
167
|
+
for (int64_t i = i0; i < i1; i++) {
|
167
168
|
const float * x_i = x + i * d;
|
168
169
|
const float * y_j = y;
|
169
170
|
size_t j;
|
@@ -245,7 +246,7 @@ void pairwise_extra_distances (
|
|
245
246
|
switch(mt) {
|
246
247
|
#define HANDLE_VAR(kw) \
|
247
248
|
case METRIC_ ## kw: { \
|
248
|
-
VectorDistance ## kw vd
|
249
|
+
VectorDistance ## kw vd = {(size_t)d}; \
|
249
250
|
pairwise_extra_distances_template (vd, nq, xq, nb, xb, \
|
250
251
|
dis, ldq, ldb, ldd); \
|
251
252
|
break; \
|
@@ -258,7 +259,7 @@ void pairwise_extra_distances (
|
|
258
259
|
HANDLE_VAR(JensenShannon);
|
259
260
|
#undef HANDLE_VAR
|
260
261
|
case METRIC_Lp: {
|
261
|
-
VectorDistanceLp vd
|
262
|
+
VectorDistanceLp vd = {(size_t)d, metric_arg};
|
262
263
|
pairwise_extra_distances_template (vd, nq, xq, nb, xb,
|
263
264
|
dis, ldq, ldb, ldd);
|
264
265
|
break;
|
@@ -280,7 +281,7 @@ void knn_extra_metrics (
|
|
280
281
|
switch(mt) {
|
281
282
|
#define HANDLE_VAR(kw) \
|
282
283
|
case METRIC_ ## kw: { \
|
283
|
-
VectorDistance ## kw vd
|
284
|
+
VectorDistance ## kw vd = {(size_t)d}; \
|
284
285
|
knn_extra_metrics_template (vd, x, y, nx, ny, res); \
|
285
286
|
break; \
|
286
287
|
}
|
@@ -292,7 +293,7 @@ void knn_extra_metrics (
|
|
292
293
|
HANDLE_VAR(JensenShannon);
|
293
294
|
#undef HANDLE_VAR
|
294
295
|
case METRIC_Lp: {
|
295
|
-
VectorDistanceLp vd
|
296
|
+
VectorDistanceLp vd = {(size_t)d, metric_arg};
|
296
297
|
knn_extra_metrics_template (vd, x, y, nx, ny, res);
|
297
298
|
break;
|
298
299
|
}
|
@@ -311,7 +312,7 @@ DistanceComputer *get_extra_distance_computer (
|
|
311
312
|
switch(mt) {
|
312
313
|
#define HANDLE_VAR(kw) \
|
313
314
|
case METRIC_ ## kw: { \
|
314
|
-
VectorDistance ## kw vd
|
315
|
+
VectorDistance ## kw vd = {(size_t)d}; \
|
315
316
|
return new ExtraDistanceComputer<VectorDistance ## kw>(vd, xb, nb); \
|
316
317
|
}
|
317
318
|
HANDLE_VAR(L2);
|
@@ -322,7 +323,7 @@ DistanceComputer *get_extra_distance_computer (
|
|
322
323
|
HANDLE_VAR(JensenShannon);
|
323
324
|
#undef HANDLE_VAR
|
324
325
|
case METRIC_Lp: {
|
325
|
-
VectorDistanceLp vd
|
326
|
+
VectorDistanceLp vd = {(size_t)d, metric_arg};
|
326
327
|
return new ExtraDistanceComputer<VectorDistanceLp> (vd, xb, nb);
|
327
328
|
break;
|
328
329
|
}
|
File without changes
|
@@ -5,15 +5,13 @@
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
6
6
|
*/
|
7
7
|
|
8
|
-
|
9
|
-
|
10
8
|
namespace faiss {
|
11
9
|
|
12
10
|
|
13
11
|
inline BitstringWriter::BitstringWriter(uint8_t *code, int code_size):
|
14
12
|
code (code), code_size (code_size), i(0)
|
15
13
|
{
|
16
|
-
|
14
|
+
memset (code, 0, code_size);
|
17
15
|
}
|
18
16
|
|
19
17
|
inline void BitstringWriter::write(uint64_t x, int nbit) {
|
@@ -26,6 +26,7 @@
|
|
26
26
|
|
27
27
|
#include <faiss/utils/hamming.h>
|
28
28
|
|
29
|
+
#include <algorithm>
|
29
30
|
#include <vector>
|
30
31
|
#include <memory>
|
31
32
|
#include <stdio.h>
|
@@ -280,7 +281,7 @@ void hammings_knn_hc (
|
|
280
281
|
for (size_t j0 = 0; j0 < n2; j0 += block_size) {
|
281
282
|
const size_t j1 = std::min(j0 + block_size, n2);
|
282
283
|
#pragma omp parallel for
|
283
|
-
for (
|
284
|
+
for (int64_t i = 0; i < ha->nh; i++) {
|
284
285
|
HammingComputer hc (bs1 + i * bytes_per_code, bytes_per_code);
|
285
286
|
|
286
287
|
const uint8_t * bs2_ = bs2 + j0 * bytes_per_code;
|
@@ -332,7 +333,7 @@ void hammings_knn_mc (
|
|
332
333
|
for (size_t j0 = 0; j0 < nb; j0 += block_size) {
|
333
334
|
const size_t j1 = std::min(j0 + block_size, nb);
|
334
335
|
#pragma omp parallel for
|
335
|
-
for (
|
336
|
+
for (int64_t i = 0; i < na; ++i) {
|
336
337
|
for (size_t j = j0; j < j1; ++j) {
|
337
338
|
cs[i].update_counter(b + j * bytes_per_code, j);
|
338
339
|
}
|
@@ -379,7 +380,7 @@ void hammings_knn_hc_1 (
|
|
379
380
|
}
|
380
381
|
|
381
382
|
#pragma omp parallel for
|
382
|
-
for (
|
383
|
+
for (int64_t i = 0; i < ha->nh; i++) {
|
383
384
|
const uint64_t bs1_ = bs1 [i];
|
384
385
|
const uint64_t * bs2_ = bs2;
|
385
386
|
hamdis_t dis;
|
@@ -435,7 +436,7 @@ void fvecs2bitvecs (const float * x, uint8_t * b, size_t d, size_t n)
|
|
435
436
|
{
|
436
437
|
const int64_t ncodes = ((d + 7) / 8);
|
437
438
|
#pragma omp parallel for if(n > 100000)
|
438
|
-
for (
|
439
|
+
for (int64_t i = 0; i < n; i++)
|
439
440
|
fvec2bitvec (x + i * d, b + i * ncodes, d);
|
440
441
|
}
|
441
442
|
|
@@ -449,7 +450,7 @@ void bitvecs2fvecs (
|
|
449
450
|
|
450
451
|
const int64_t ncodes = ((d + 7) / 8);
|
451
452
|
#pragma omp parallel for if(n > 100000)
|
452
|
-
for (
|
453
|
+
for (int64_t i = 0; i < n; i++) {
|
453
454
|
binary_to_real (d, b + i * ncodes, x + i * d);
|
454
455
|
}
|
455
456
|
}
|
@@ -497,7 +498,7 @@ void bitvec_shuffle (size_t n, size_t da, size_t db,
|
|
497
498
|
size_t ldb = (db + 7) / 8;
|
498
499
|
|
499
500
|
#pragma omp parallel for if(n > 10000)
|
500
|
-
for (
|
501
|
+
for (int64_t i = 0; i < n; i++) {
|
501
502
|
const uint8_t *ai = a + i * lda;
|
502
503
|
uint8_t *bi = b + i * ldb;
|
503
504
|
memset (bi, 0, ldb);
|
@@ -653,7 +654,7 @@ void hamming_range_search_template (
|
|
653
654
|
RangeSearchPartialResult pres (res);
|
654
655
|
|
655
656
|
#pragma omp for
|
656
|
-
for (
|
657
|
+
for (int64_t i = 0; i < na; i++) {
|
657
658
|
HammingComputer hc (a + i * code_size, code_size);
|
658
659
|
const uint8_t * yi = b;
|
659
660
|
RangeQueryResult & qres = pres.new_result (i);
|
@@ -27,6 +27,12 @@
|
|
27
27
|
|
28
28
|
#include <stdint.h>
|
29
29
|
|
30
|
+
#ifdef _MSC_VER
|
31
|
+
#include <intrin.h>
|
32
|
+
#define __builtin_popcountl __popcnt64
|
33
|
+
#endif // _MSC_VER
|
34
|
+
|
35
|
+
#include <faiss/impl/platform_macros.h>
|
30
36
|
#include <faiss/utils/Heap.h>
|
31
37
|
|
32
38
|
|
@@ -109,7 +115,7 @@ struct BitstringReader {
|
|
109
115
|
|
110
116
|
|
111
117
|
|
112
|
-
extern size_t hamming_batch_size;
|
118
|
+
FAISS_API extern size_t hamming_batch_size;
|
113
119
|
|
114
120
|
inline int popcount64(uint64_t x) {
|
115
121
|
return __builtin_popcountl(x);
|
@@ -61,7 +61,7 @@ void float_rand (float * x, size_t n, int64_t seed)
|
|
61
61
|
int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
|
62
62
|
|
63
63
|
#pragma omp parallel for
|
64
|
-
for (
|
64
|
+
for (int64_t j = 0; j < nblock; j++) {
|
65
65
|
|
66
66
|
RandomGenerator rng (a0 + j * b0);
|
67
67
|
|
@@ -83,7 +83,7 @@ void float_randn (float * x, size_t n, int64_t seed)
|
|
83
83
|
int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
|
84
84
|
|
85
85
|
#pragma omp parallel for
|
86
|
-
for (
|
86
|
+
for (int64_t j = 0; j < nblock; j++) {
|
87
87
|
RandomGenerator rng (a0 + j * b0);
|
88
88
|
|
89
89
|
double a = 0, b = 0, s = 0;
|
@@ -120,7 +120,7 @@ void int64_rand (int64_t * x, size_t n, int64_t seed)
|
|
120
120
|
int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
|
121
121
|
|
122
122
|
#pragma omp parallel for
|
123
|
-
for (
|
123
|
+
for (int64_t j = 0; j < nblock; j++) {
|
124
124
|
|
125
125
|
RandomGenerator rng (a0 + j * b0);
|
126
126
|
|
@@ -140,7 +140,7 @@ void int64_rand_max (int64_t * x, size_t n, uint64_t max, int64_t seed)
|
|
140
140
|
int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
|
141
141
|
|
142
142
|
#pragma omp parallel for
|
143
|
-
for (
|
143
|
+
for (int64_t j = 0; j < nblock; j++) {
|
144
144
|
|
145
145
|
RandomGenerator rng (a0 + j * b0);
|
146
146
|
|
@@ -176,7 +176,7 @@ void byte_rand (uint8_t * x, size_t n, int64_t seed)
|
|
176
176
|
int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
|
177
177
|
|
178
178
|
#pragma omp parallel for
|
179
|
-
for (
|
179
|
+
for (int64_t j = 0; j < nblock; j++) {
|
180
180
|
|
181
181
|
RandomGenerator rng (a0 + j * b0);
|
182
182
|
|
File without changes
|
@@ -14,9 +14,16 @@
|
|
14
14
|
#include <cstring>
|
15
15
|
#include <cmath>
|
16
16
|
|
17
|
-
#include <sys/time.h>
|
18
17
|
#include <sys/types.h>
|
18
|
+
|
19
|
+
#ifdef _MSC_VER
|
20
|
+
#define NOMINMAX
|
21
|
+
#include <windows.h>
|
22
|
+
#undef NOMINMAX
|
23
|
+
#else
|
24
|
+
#include <sys/time.h>
|
19
25
|
#include <unistd.h>
|
26
|
+
#endif // !_MSC_VER
|
20
27
|
|
21
28
|
#include <omp.h>
|
22
29
|
|
@@ -65,11 +72,22 @@ int sgemv_(const char *trans, FINTEGER *m, FINTEGER *n, float *alpha,
|
|
65
72
|
|
66
73
|
namespace faiss {
|
67
74
|
|
75
|
+
#ifdef _MSC_VER
|
76
|
+
double getmillisecs() {
|
77
|
+
LARGE_INTEGER ts;
|
78
|
+
LARGE_INTEGER freq;
|
79
|
+
QueryPerformanceFrequency(&freq);
|
80
|
+
QueryPerformanceCounter(&ts);
|
81
|
+
|
82
|
+
return (ts.QuadPart * 1e3) / freq.QuadPart;
|
83
|
+
}
|
84
|
+
#else // _MSC_VER
|
68
85
|
double getmillisecs () {
|
69
86
|
struct timeval tv;
|
70
87
|
gettimeofday (&tv, nullptr);
|
71
88
|
return tv.tv_sec * 1e3 + tv.tv_usec * 1e-3;
|
72
89
|
}
|
90
|
+
#endif // _MSC_VER
|
73
91
|
|
74
92
|
uint64_t get_cycles () {
|
75
93
|
#ifdef __x86_64__
|
@@ -103,11 +121,11 @@ size_t get_mem_usage_kb ()
|
|
103
121
|
return sz;
|
104
122
|
}
|
105
123
|
|
106
|
-
#
|
124
|
+
#else
|
107
125
|
|
108
126
|
size_t get_mem_usage_kb ()
|
109
127
|
{
|
110
|
-
fprintf(stderr, "WARN: get_mem_usage_kb not implemented on
|
128
|
+
fprintf(stderr, "WARN: get_mem_usage_kb not implemented on current architecture\n");
|
111
129
|
return 0;
|
112
130
|
}
|
113
131
|
|
@@ -173,25 +191,6 @@ void reflection_ref (const float * u, float * x, size_t n, size_t d, size_t nu)
|
|
173
191
|
* Some matrix manipulation functions
|
174
192
|
***************************************************************************/
|
175
193
|
|
176
|
-
|
177
|
-
/* This function exists because the Torch counterpart is extremly slow
|
178
|
-
(not multi-threaded + unexpected overhead even in single thread).
|
179
|
-
It is here to implement the usual property |x-y|^2=|x|^2+|y|^2-2<x|y> */
|
180
|
-
void inner_product_to_L2sqr (float * __restrict dis,
|
181
|
-
const float * nr1,
|
182
|
-
const float * nr2,
|
183
|
-
size_t n1, size_t n2)
|
184
|
-
{
|
185
|
-
|
186
|
-
#pragma omp parallel for
|
187
|
-
for (size_t j = 0 ; j < n1 ; j++) {
|
188
|
-
float * disj = dis + j * n2;
|
189
|
-
for (size_t i = 0 ; i < n2 ; i++)
|
190
|
-
disj[i] = nr1[j] + nr2[i] - 2 * disj[i];
|
191
|
-
}
|
192
|
-
}
|
193
|
-
|
194
|
-
|
195
194
|
void matrix_qr (int m, int n, float *a)
|
196
195
|
{
|
197
196
|
FAISS_THROW_IF_NOT (m >= n);
|
@@ -251,7 +250,7 @@ size_t merge_result_table_with (size_t n, size_t k,
|
|
251
250
|
std::vector<float> tmpD (k);
|
252
251
|
|
253
252
|
#pragma omp for
|
254
|
-
for (
|
253
|
+
for (int64_t i = 0; i < n; i++) {
|
255
254
|
int64_t *lI0 = I0 + i * k;
|
256
255
|
float *lD0 = D0 + i * k;
|
257
256
|
const int64_t *lI1 = I1 + i * k;
|
@@ -319,7 +318,7 @@ size_t ranklist_intersection_size (size_t k1, const int64_t *v1,
|
|
319
318
|
}
|
320
319
|
k2 = wp;
|
321
320
|
}
|
322
|
-
const int64_t seen_flag =
|
321
|
+
const int64_t seen_flag = int64_t{1} << 60;
|
323
322
|
size_t count = 0;
|
324
323
|
for (size_t i = 0; i < k1; i++) {
|
325
324
|
int64_t q = v1 [i];
|
@@ -436,7 +435,7 @@ namespace {
|
|
436
435
|
}
|
437
436
|
|
438
437
|
// compute sub-ranges for each thread
|
439
|
-
SegmentS s1s
|
438
|
+
std::vector<SegmentS> s1s(nt), s2s(nt), sws(nt);
|
440
439
|
s2s[0].i0 = s2.i0;
|
441
440
|
s2s[nt - 1].i1 = s2.i1;
|
442
441
|
|
@@ -529,7 +528,7 @@ void fvec_argsort_parallel (size_t n, const float *vals,
|
|
529
528
|
|
530
529
|
ArgsortComparator comp = {vals};
|
531
530
|
|
532
|
-
SegmentS segs
|
531
|
+
std::vector<SegmentS> segs(nt);
|
533
532
|
|
534
533
|
// independent sorts
|
535
534
|
#pragma omp parallel for
|
@@ -598,8 +597,8 @@ const float *fvecs_maybe_subsample (
|
|
598
597
|
|
599
598
|
size_t n2 = nmax;
|
600
599
|
if (verbose) {
|
601
|
-
printf (" Input training set too big (max size is %
|
602
|
-
"%
|
600
|
+
printf (" Input training set too big (max size is %zd), sampling "
|
601
|
+
"%zd / %zd vectors\n", nmax, n2, *n);
|
603
602
|
}
|
604
603
|
std::vector<int> subset (*n);
|
605
604
|
rand_perm (subset.data (), *n, seed);
|
@@ -7,6 +7,7 @@
|
|
7
7
|
|
8
8
|
#include <cstdio>
|
9
9
|
#include <cstdlib>
|
10
|
+
#include <random>
|
10
11
|
|
11
12
|
#undef FINTEGER
|
12
13
|
#define FINTEGER long
|
@@ -31,8 +32,10 @@ int sgeqrf_ (FINTEGER *m, FINTEGER *n, float *a, FINTEGER *lda,
|
|
31
32
|
float *new_random_vec(int size)
|
32
33
|
{
|
33
34
|
float *x = new float[size];
|
35
|
+
std::mt19937 rng;
|
36
|
+
std::uniform_real_distribution<> distrib;
|
34
37
|
for (int i = 0; i < size; i++)
|
35
|
-
x[i] =
|
38
|
+
x[i] = distrib(rng);
|
36
39
|
return x;
|
37
40
|
}
|
38
41
|
|
@@ -10,6 +10,7 @@
|
|
10
10
|
|
11
11
|
#include <memory>
|
12
12
|
#include <vector>
|
13
|
+
#include <random>
|
13
14
|
|
14
15
|
#include <gtest/gtest.h>
|
15
16
|
|
@@ -19,6 +20,7 @@
|
|
19
20
|
#include <faiss/index_io.h>
|
20
21
|
#include <faiss/IVFlib.h>
|
21
22
|
|
23
|
+
|
22
24
|
using namespace faiss;
|
23
25
|
|
24
26
|
namespace {
|
@@ -38,12 +40,15 @@ size_t nb = 1000;
|
|
38
40
|
// nb of queries
|
39
41
|
size_t nq = 200;
|
40
42
|
|
43
|
+
std::mt19937 rng;
|
41
44
|
|
42
45
|
std::vector<float> make_data(size_t n)
|
43
46
|
{
|
44
47
|
std::vector <float> database (n * d);
|
48
|
+
std::uniform_real_distribution<> distrib;
|
49
|
+
|
45
50
|
for (size_t i = 0; i < n * d; i++) {
|
46
|
-
database[i] =
|
51
|
+
database[i] = distrib(rng);
|
47
52
|
}
|
48
53
|
return database;
|
49
54
|
}
|