10 #ifndef FAISS_INVERTEDLISTS_IVF_H
11 #define FAISS_INVERTEDLISTS_IVF_H
43 virtual size_t list_size(
size_t list_no)
const = 0;
50 virtual const uint8_t *
get_codes (
size_t list_no)
const = 0;
57 virtual const idx_t *
get_ids (
size_t list_no)
const = 0;
60 virtual void release_codes (
size_t list_no,
const uint8_t *codes)
const;
63 virtual void release_ids (
size_t list_no,
const idx_t *ids)
const;
66 virtual idx_t
get_single_id (
size_t list_no,
size_t offset)
const;
71 size_t list_no,
size_t offset)
const;
81 virtual size_t add_entry (
size_t list_no, idx_t theid,
84 virtual size_t add_entries (
85 size_t list_no,
size_t n_entry,
86 const idx_t* ids,
const uint8_t *code) = 0;
88 virtual void update_entry (
size_t list_no,
size_t offset,
89 idx_t
id,
const uint8_t *code);
91 virtual void update_entries (
size_t list_no,
size_t offset,
size_t n_entry,
92 const idx_t *ids,
const uint8_t *code) = 0;
94 virtual void resize (
size_t list_no,
size_t new_size) = 0;
96 virtual void reset ();
142 il (il), ids (il->
get_ids (list_no)), list_no (list_no)
145 const idx_t *
get() {
return ids; }
147 idx_t operator [] (
size_t i)
const {
158 const uint8_t *codes;
162 il (il), codes (il->
get_codes (list_no)), list_no (list_no)
170 const uint8_t *
get() {
return codes; }
183 std::vector < std::vector<uint8_t> > codes;
184 std::vector < std::vector<idx_t> >
ids;
188 size_t list_size(
size_t list_no)
const override;
189 const uint8_t *
get_codes (
size_t list_no)
const override;
190 const idx_t *
get_ids (
size_t list_no)
const override;
193 size_t list_no,
size_t n_entry,
194 const idx_t*
ids,
const uint8_t *code)
override;
196 void update_entries (
size_t list_no,
size_t offset,
size_t n_entry,
197 const idx_t *
ids,
const uint8_t *code)
override;
199 void resize (
size_t list_no,
size_t new_size)
override;
217 size_t list_no,
size_t n_entry,
218 const idx_t* ids,
const uint8_t *code)
override;
220 void update_entries (
size_t list_no,
size_t offset,
size_t n_entry,
221 const idx_t *ids,
const uint8_t *code)
override;
223 void resize (
size_t list_no,
size_t new_size)
override;
231 std::vector<const InvertedLists *>ils;
236 size_t list_size(
size_t list_no)
const override;
237 const uint8_t *
get_codes (
size_t list_no)
const override;
238 const idx_t *
get_ids (
size_t list_no)
const override;
242 void release_codes (
size_t list_no,
const uint8_t *codes)
const override;
243 void release_ids (
size_t list_no,
const idx_t *ids)
const override;
245 idx_t
get_single_id (
size_t list_no,
size_t offset)
const override;
248 size_t list_no,
size_t offset)
const override;
262 size_t list_size(
size_t list_no)
const override;
263 const uint8_t *
get_codes (
size_t list_no)
const override;
264 const idx_t *
get_ids (
size_t list_no)
const override;
266 void release_codes (
size_t list_no,
const uint8_t *codes)
const override;
267 void release_ids (
size_t list_no,
const idx_t *ids)
const override;
269 idx_t
get_single_id (
size_t list_no,
size_t offset)
const override;
272 size_t list_no,
size_t offset)
const override;
279 std::vector<const InvertedLists *>ils;
280 std::vector<idx_t> cumsz;
285 size_t list_size(
size_t list_no)
const override;
286 const uint8_t *
get_codes (
size_t list_no)
const override;
287 const idx_t *
get_ids (
size_t list_no)
const override;
289 void release_codes (
size_t list_no,
const uint8_t *codes)
const override;
290 void release_ids (
size_t list_no,
const idx_t *ids)
const override;
292 idx_t
get_single_id (
size_t list_no,
size_t offset)
const override;
295 size_t list_no,
size_t offset)
const override;
315 size_t list_size(
size_t list_no)
const override;
316 const uint8_t *
get_codes (
size_t list_no)
const override;
317 const idx_t *
get_ids (
size_t list_no)
const override;
319 void release_codes (
size_t list_no,
const uint8_t *codes)
const override;
320 void release_ids (
size_t list_no,
const idx_t *ids)
const override;
322 idx_t
get_single_id (
size_t list_no,
size_t offset)
const override;
325 size_t list_no,
size_t offset)
const override;
const uint8_t * get_codes(size_t list_no) const override
void prefetch_lists(const idx_t *list_nos, int nlist) const override
idx_t get_single_id(size_t list_no, size_t offset) const override
simple (default) implementation as an array of inverted lists
void release_ids(size_t list_no, const idx_t *ids) const override
release ids returned by get_ids
void release_ids(size_t list_no, const idx_t *ids) const override
release ids returned by get_ids
const idx_t * get_ids(size_t list_no) const override
virtual const idx_t * get_ids(size_t list_no) const =0
double imbalance_factor() const
1= perfectly balanced, >1: imbalanced
const idx_t * get_ids(size_t list_no) const override
idx_t get_single_id(size_t list_no, size_t offset) const override
vertical slice of indexes in another InvertedLists
void prefetch_lists(const idx_t *list_nos, int nlist) const override
virtual size_t list_size(size_t list_no) const =0
get the size of a list
size_t list_size(size_t list_no) const override
get the size of a list
const uint8_t * get_single_code(size_t list_no, size_t offset) const override
const uint8_t * get_single_code(size_t list_no, size_t offset) const override
void merge_from(InvertedLists *oivf, size_t add_id)
move all entries from oivf (empty on output)
virtual idx_t get_single_id(size_t list_no, size_t offset) const
long idx_t
all indices are this type
size_t code_size
code size per vector in bytes
virtual const uint8_t * get_single_code(size_t list_no, size_t offset) const
VStackInvertedLists(int nil, const InvertedLists **ils)
build InvertedLists by concatenating nil of them
size_t compute_ntotal() const
sum up list sizes
const uint8_t * get_codes(size_t list_no) const override
virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code)
add one entry to an inverted list
const uint8_t * get_codes(size_t list_no) const override
size_t list_size(size_t list_no) const override
get the size of a list
void prefetch_lists(const idx_t *list_nos, int nlist) const override
size_t list_size(size_t list_no) const override
get the size of a list
void prefetch_lists(const idx_t *list_nos, int nlist) const override
HStackInvertedLists(int nil, const InvertedLists **ils)
build InvertedLists by concatenating nil of them
const uint8_t * get_single_code(size_t list_no, size_t offset) const override
Horizontal stack of inverted lists.
idx_t get_single_id(size_t list_no, size_t offset) const override
const uint8_t * get_codes(size_t list_no) const override
const idx_t * get_ids(size_t list_no) const override
size_t list_size(size_t list_no) const override
get the size of a list
size_t nlist
number of possible key values
const uint8_t * get_single_code(size_t list_no, size_t offset) const override
std::vector< std::vector< idx_t > > ids
Inverted lists for indexes.
void release_ids(size_t list_no, const idx_t *ids) const override
release ids returned by get_ids
const idx_t * get_ids(size_t list_no) const override
void print_stats() const
display some stats about the inverted lists
virtual const uint8_t * get_codes(size_t list_no) const =0
virtual void prefetch_lists(const idx_t *list_nos, int nlist) const
virtual void release_ids(size_t list_no, const idx_t *ids) const
release ids returned by get_ids
void release_codes(size_t list_no, const uint8_t *codes) const override
release codes returned by get_codes (default implementation is nop
const uint8_t * get_codes(size_t list_no) const override
void release_ids(size_t list_no, const idx_t *ids) const override
release ids returned by get_ids
void release_codes(size_t list_no, const uint8_t *codes) const override
release codes returned by get_codes (default implementation is nop
size_t list_size(size_t list_no) const override
get the size of a list
virtual void release_codes(size_t list_no, const uint8_t *codes) const
release codes returned by get_codes (default implementation is nop
idx_t get_single_id(size_t list_no, size_t offset) const override
void release_codes(size_t list_no, const uint8_t *codes) const override
release codes returned by get_codes (default implementation is nop
void release_codes(size_t list_no, const uint8_t *codes) const override
release codes returned by get_codes (default implementation is nop
const idx_t * get_ids(size_t list_no) const override