#include <IndexIVF.h>
Public Member Functions | |
IndexIVF (Index *quantizer, size_t d, size_t nlist, MetricType metric=METRIC_INNER_PRODUCT) | |
void | reset () override |
removes all elements from the database. | |
void | train (idx_t n, const float *x) override |
Trains the quantizer and calls train_residual to train sub-quantizers. | |
void | add (idx_t n, const float *x) override |
Quantizes x and calls add_with_key. | |
virtual void | train_residual (idx_t n, const float *x) |
virtual void | search_preassigned (idx_t n, const float *x, idx_t k, const idx_t *assign, const float *centroid_dis, float *distances, idx_t *labels, bool store_pairs) const =0 |
virtual void | search (idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override |
long | remove_ids (const IDSelector &sel) override |
Dataset manipulation functions. | |
virtual void | merge_from (IndexIVF &other, idx_t add_id) |
virtual void | copy_subset_to (IndexIVF &other, int subset_type, long a1, long a2) const |
size_t | get_list_size (size_t list_no) const |
void | make_direct_map (bool new_maintain_direct_map=true) |
double | imbalance_factor () const |
1= perfectly balanced, >1: imbalanced | |
void | print_stats () const |
display some stats about the inverted lists | |
![]() | |
Index (idx_t d=0, MetricType metric=METRIC_INNER_PRODUCT) | |
virtual void | add_with_ids (idx_t n, const float *x, const long *xids) |
virtual void | range_search (idx_t n, const float *x, float radius, RangeSearchResult *result) const |
void | assign (idx_t n, const float *x, idx_t *labels, idx_t k=1) |
virtual void | reconstruct (idx_t key, float *recons) const |
virtual void | reconstruct_n (idx_t i0, idx_t ni, float *recons) const |
void | compute_residual (const float *x, float *residual, idx_t key) const |
void | display () const |
Public Attributes | |
size_t | nlist |
number of possible key values | |
size_t | nprobe |
number of probes at query time | |
Index * | quantizer |
quantizer that maps vectors to inverted lists | |
bool | quantizer_trains_alone |
just pass over the trainset to quantizer | |
bool | own_fields |
whether object owns the quantizer | |
ClusteringParameters | cp |
to override default clustering params | |
std::vector< std::vector< long > > | ids |
Inverted lists for indexes. | |
size_t | code_size |
code size per vector in bytes | |
std::vector< std::vector < uint8_t > > | codes |
bool | maintain_direct_map |
map for direct access to the elements. Enables reconstruct(). | |
std::vector< long > | direct_map |
![]() | |
int | d |
vector dimension | |
idx_t | ntotal |
total nb of indexed vectors | |
bool | verbose |
verbosity level | |
bool | is_trained |
set if the Index does not require training, or if training is done already | |
MetricType | metric_type |
type of metric this index uses for search | |
Additional Inherited Members | |
![]() | |
typedef long | idx_t |
all indices are this type | |
Index based on a inverted file (IVF)
In the inverted file, the quantizer (an Index instance) provides a quantization index for each vector to be added. The quantization index maps to a list (aka inverted list or posting list), where the id of the vector is then stored.
At search time, the vector to be searched is also quantized, and only the list corresponding to the quantization index is searched. This speeds up the search by making it non-exhaustive. This can be relaxed using multi-probe search: a few (nprobe) quantization indices are selected and several inverted lists are visited.
Sub-classes implement a post-filtering of the index that refines the distance estimation from the query to databse vectors.
Definition at line 45 of file IndexIVF.h.
faiss::IndexIVF::IndexIVF | ( | Index * | quantizer, |
size_t | d, | ||
size_t | nlist, | ||
MetricType | metric = METRIC_INNER_PRODUCT |
||
) |
The Inverted file takes a quantizer (an Index) on input, which implements the function mapping a vector to a list identifier. The pointer is borrowed: the quantizer should not be deleted while the IndexIVF is in use.
Definition at line 31 of file IndexIVF.cpp.
|
virtual |
copy a subset of the entries index to the other index
if subset_type == 0: copies ids in [a1, a2) if subset_type == 1: copies ids if id % a1 == a2 if subset_type == 2: copies inverted lists such that a1 elements are left before and a2 elements are after
Definition at line 248 of file IndexIVF.cpp.
void faiss::IndexIVF::make_direct_map | ( | bool | new_maintain_direct_map = true | ) |
intialize a direct map
new_maintain_direct_map | if true, create a direct map, else clear it |
Definition at line 69 of file IndexIVF.cpp.
moves the entries from another dataset to self. On output, other is empty. add_id is added to all moved ids (for sequential ids, this would be this->ntotal
Reimplemented in faiss::IndexIVFPQR.
Definition at line 221 of file IndexIVF.cpp.
|
overridevirtual |
assign the vectors, then call search_preassign
Implements faiss::Index.
Reimplemented in faiss::IndexIVFPQR.
Definition at line 94 of file IndexIVF.cpp.
|
pure virtual |
search a set of vectors, that are pre-quantized by the IVF quantizer. Fill in the corresponding heaps with the query results. search() calls this.
n | nb of vectors to query |
x | query vectors, size nx * d |
assign | coarse quantization indices, size nx * nprobe |
centroid_dis | distances to coarse centroids, size nx * nprobe |
distance | output distances, size n * k |
labels | output labels, size n * k |
store_pairs | store inv list index + inv list offset instead in upper/lower 32 bit of result, instead of ids (used for reranking). |
Implemented in faiss::IndexIVFPQCompact, faiss::IndexIVFFlat, faiss::IndexIVFScalarQuantizer, and faiss::IndexIVFPQ.
|
virtual |
Sub-classes that encode the residuals can train their encoders here does nothing by default
Reimplemented in faiss::IndexIVFPQR, faiss::IndexIVFScalarQuantizer, and faiss::IndexIVFPQ.
Definition at line 184 of file IndexIVF.cpp.