12 #include "IndexFlat.h"
18 #include "FaissAssert.h"
22 IndexFlat::IndexFlat (idx_t d,
MetricType metric):
29 void IndexFlat::set_typename()
37 index_typename = s.str();
42 for (
idx_t i = 0; i < n *
d; i++)
55 float *distances,
idx_t *labels)
const
61 size_t(n), size_t(k), labels, distances};
65 size_t(n), size_t(k), labels, distances};
74 case METRIC_INNER_PRODUCT:
90 const idx_t *labels)
const
93 case METRIC_INNER_PRODUCT:
94 fvec_inner_products_by_idx (
96 x,
xb.data(), labels,
d, n, k);
101 x,
xb.data(), labels,
d, n, k);
111 memcpy (recons, &(
xb[key *
d]),
sizeof(*recons) * d);
118 IndexFlatL2BaseShift::IndexFlatL2BaseShift (idx_t d,
size_t nshift,
const float *shift):
121 memcpy (this->shift.data(), shift,
sizeof(float) * nshift);
131 FAISS_ASSERT(shift.size() ==
ntotal);
134 size_t(n), size_t(k), labels, distances};
144 IndexRefineFlat::IndexRefineFlat (
Index *base_index):
145 Index (base_index->d, base_index->metric_type),
146 refine_index (base_index->d, base_index->metric_type),
147 base_index (base_index), own_fields (false),
151 assert (base_index->
ntotal == 0 ||
152 !
"base_index should be empty in the beginning");
156 IndexRefineFlat::IndexRefineFlat () {
162 void IndexRefineFlat::set_typename ()
167 index_typename = s.str();
195 static void reorder_2_heaps (
197 idx_t k, idx_t *labels,
float *distances,
198 idx_t k_base,
const idx_t *base_labels,
const float *base_distances)
200 #pragma omp parallel for
201 for (idx_t i = 0; i < n; i++) {
202 idx_t *idxo = labels + i * k;
203 float *diso = distances + i * k;
204 const idx_t *idxi = base_labels + i * k_base;
205 const float *disi = base_distances + i * k_base;
207 heap_heapify<C> (k, diso, idxo, disi, idxi, k);
209 heap_addn<C> (k, diso, idxo, disi + k, idxi + k, k_base - k);
211 heap_reorder<C> (k, diso, idxo);
220 idx_t n,
const float *x, idx_t k,
221 float *distances, idx_t *labels)
const
225 idx_t * base_labels = labels;
226 float * base_distances = distances;
229 base_labels =
new idx_t [n * k_base];
230 base_distances =
new float [n * k_base];
235 for (
int i = 0; i < n * k_base; i++)
236 assert (base_labels[i] >= -1 &&
241 n, x, k_base, base_distances, base_labels);
247 n, k, labels, distances,
248 k_base, base_labels, base_distances);
253 n, k, labels, distances,
254 k_base, base_labels, base_distances);
258 delete [] base_labels;
259 delete [] base_distances;
265 IndexRefineFlat::~IndexRefineFlat ()
275 IndexFlat1D::IndexFlat1D (
bool continuous_update):
277 continuous_update (continuous_update)
289 fvec_argsort_parallel (
ntotal,
xb.data(), (
size_t*)
perm.data());
314 !
"Call update_permutation before search");
316 #pragma omp parallel for
317 for (idx_t i = 0; i < n; i++) {
320 float *D = distances + i * k;
321 idx_t *I = labels + i * k;
324 idx_t i0 = 0, i1 =
ntotal;
332 if (
xb[
perm[i1 - 1]] <= q) {
337 while (i0 + 1 < i1) {
338 idx_t imed = (i0 + i1) / 2;
339 if (
xb[
perm[imed]] <= q) i0 = imed;
347 float xleft =
xb[
perm[i0]];
348 float xright =
xb[perm[i1]];
350 if (q - xleft < xright - q) {
354 if (i0 < 0) {
goto finish_right; }
359 if (i1 >=
ntotal) {
goto finish_left; }
void knn_L2sqr_base_shift(const float *x, const float *y, size_t d, size_t nx, size_t ny, float_maxheap_array_t *res, const float *base_shift)
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override
virtual void reset() override
removes all elements from the database.
virtual void reset()=0
removes all elements from the database.
bool continuous_update
is the permutation updated continuously?
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override
virtual void reset() override
removes all elements from the database.
void update_permutation()
virtual void reconstruct(idx_t key, float *recons) const override
virtual void add(idx_t n, const float *x) override
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override
Index * base_index
faster index to pre-select the vectors that should be filtered
IndexFlat refine_index
storage for full vectors
bool own_fields
should the base index be deallocated?
virtual void range_search(idx_t n, const float *x, float radius, RangeSearchResult *result) const override
virtual void train(idx_t n, const float *x) override
virtual void add(idx_t n, const float *x)=0
long idx_t
all indices are this type
void range_search_inner_product(const float *x, const float *y, size_t d, size_t nx, size_t ny, float radius, RangeSearchResult *res)
same as range_search_L2sqr for the inner product similarity
idx_t ntotal
total nb of indexed vectors
virtual std::string get_typename() const
void knn_inner_product(const float *x, const float *y, size_t d, size_t nx, size_t ny, float_minheap_array_t *res)
virtual void add(idx_t n, const float *x) override
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override
Warn: the distances returned are L1 not L2.
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const =0
void range_search_L2sqr(const float *x, const float *y, size_t d, size_t nx, size_t ny, float radius, RangeSearchResult *res)
void compute_distance_subset(idx_t n, const float *x, idx_t k, float *distances, const idx_t *labels) const
MetricType metric_type
type of metric this index uses for search
void knn_L2sqr(const float *x, const float *y, size_t d, size_t nx, size_t ny, float_maxheap_array_t *res)
bool is_trained
set if the Index does not require training, or if training is done already
virtual void train(idx_t n, const float *x)
std::vector< float > xb
database vectors, size ntotal * d
virtual void reset() override
removes all elements from the database.
std::vector< idx_t > perm
sorted database indices
MetricType
Some algorithms support both an inner product vetsion and a L2 search version.
virtual void add(idx_t n, const float *x) override