10 #ifndef FAISS_INDEX_IVF_H
11 #define FAISS_INDEX_IVF_H
18 #include "InvertedLists.h"
19 #include "Clustering.h"
47 void train_q1 (
size_t n,
const float *x,
bool verbose,
68 struct InvertedListScanner;
110 std::vector <idx_t> direct_map;
121 void reset()
override;
124 void train(idx_t n,
const float* x)
override;
127 void add(idx_t n,
const float* x)
override;
130 void add_with_ids(idx_t n,
const float* x,
const idx_t* xids)
override;
139 const idx_t *list_nos,
140 uint8_t * codes)
const = 0;
166 const float *centroid_dis,
167 float *distances, idx_t *labels,
173 void search (idx_t n,
const float *x, idx_t k,
174 float *distances, idx_t *labels)
const override;
176 void range_search (idx_t n,
const float* x,
float radius,
179 void range_search_preassigned(idx_t nx,
const float *x,
float radius,
180 const idx_t *keys,
const float *coarse_dis,
185 bool store_pairs=
false)
const;
187 void reconstruct (idx_t key,
float* recons)
const override;
198 void reconstruct_n(idx_t i0, idx_t ni,
float* recons)
const override;
210 float *distances, idx_t *labels,
211 float *recons)
const override;
221 float* recons)
const;
246 idx_t a1, idx_t a2)
const;
250 size_t get_list_size (
size_t list_no)
const
266 struct RangeQueryResult;
277 virtual void set_query (
const float *query_vector) = 0;
280 virtual void set_list (idx_t list_no,
float coarse_dis) = 0;
297 const uint8_t *codes,
299 float *distances, idx_t *labels,
307 const uint8_t *codes,
321 size_t nheap_updates;
322 double quantization_time;
virtual void encode_vectors(idx_t n, const float *x, const idx_t *list_nos, uint8_t *codes) const =0
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 IVFSearchParameters *params=nullptr) const
result structure for a single query
void check_compatible_for_merge(const IndexIVF &other) const
void search_and_reconstruct(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels, float *recons) const override
size_t nprobe
number of probes at query time
void assign(idx_t n, const float *x, idx_t *labels, idx_t k=1)
idx_t remove_ids(const IDSelector &sel) override
Dataset manipulation functions.
virtual size_t list_size(size_t list_no) const =0
get the size of a list
void reconstruct(idx_t key, float *recons) const override
virtual void train_residual(idx_t n, const float *x)
void range_search(idx_t n, const float *x, float radius, RangeSearchResult *result) const override
long idx_t
all indices are this type
virtual void copy_subset_to(IndexIVF &other, int subset_type, idx_t a1, idx_t a2) const
virtual float distance_to_code(const uint8_t *code) const =0
compute a single query-to-code distance
void train(idx_t n, const float *x) override
Trains the quantizer and calls train_residual to train sub-quantizers.
void reconstruct_n(idx_t i0, idx_t ni, float *recons) const override
char quantizer_trains_alone
virtual void set_list(idx_t list_no, float coarse_dis)=0
following codes come from this inverted list
void add_with_ids(idx_t n, const float *x, const idx_t *xids) override
default implementation that calls encode_vectors
virtual InvertedListScanner * get_InvertedListScanner(bool store_pairs=false) const
get a scanner for this index (store_pairs means ignore labels)
virtual size_t scan_codes(size_t n, const uint8_t *codes, const idx_t *ids, float *distances, idx_t *labels, size_t k) const =0
void replace_invlists(InvertedLists *il, bool own=false)
replace the inverted lists, old one is deallocated if own_invlists
ClusteringParameters cp
to override default clustering params
void reset() override
removes all elements from the database.
Index * clustering_index
to override index used during clustering
void train_q1(size_t n, const float *x, bool verbose, MetricType metric_type)
Trains the quantizer and calls train_residual to train sub-quantizers.
size_t nprobe
number of probes at query time
void make_direct_map(bool new_maintain_direct_map=true)
InvertedLists * invlists
Acess to the actual data.
virtual void reconstruct_from_offset(idx_t list_no, idx_t offset, float *recons) const
void add(idx_t n, const float *x) override
Calls add_with_ids with NULL ids.
size_t max_codes
max nb of codes to visit to do a query
Index * quantizer
quantizer that maps vectors to inverted lists
size_t max_codes
max nb of codes to visit to do a query
bool maintain_direct_map
map for direct access to the elements. Enables reconstruct().
bool own_fields
whether object owns the quantizer
virtual void set_query(const float *query_vector)=0
from now on we handle this query.
void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels) const override
virtual void merge_from(IndexIVF &other, idx_t add_id)
size_t nlist
number of possible key values
size_t code_size
code size per vector in bytes
virtual void scan_codes_range(size_t n, const uint8_t *codes, const idx_t *ids, float radius, RangeQueryResult &result) const
MetricType
Some algorithms support both an inner product version and a L2 search version.