faiss 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|