| /* |
| * Copyright (c) Meta Platforms, Inc. and affiliates. |
| * |
| * This source code is licensed under the MIT license found in the |
| * LICENSE file in the root directory of this source tree. |
| */ |
| |
| // -*- c -*- |
| |
| #ifndef FAISS_AUX_INDEX_STRUCTURES_C_H |
| #define FAISS_AUX_INDEX_STRUCTURES_C_H |
| |
| #include "../Index_c.h" |
| #include "../faiss_c.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| FAISS_DECLARE_CLASS(RangeSearchResult) |
| |
| FAISS_DECLARE_GETTER(RangeSearchResult, size_t, nq) |
| |
| int faiss_RangeSearchResult_new(FaissRangeSearchResult** p_rsr, idx_t nq); |
| |
| int faiss_RangeSearchResult_new_with( |
| FaissRangeSearchResult** p_rsr, |
| idx_t nq, |
| int alloc_lims); |
| |
| /// called when lims contains the nb of elements result entries |
| /// for each query |
| int faiss_RangeSearchResult_do_allocation(FaissRangeSearchResult* rsr); |
| |
| FAISS_DECLARE_DESTRUCTOR(RangeSearchResult) |
| |
| /// getter for buffer_size |
| FAISS_DECLARE_GETTER(RangeSearchResult, size_t, buffer_size) |
| |
| /// getter for lims: size (nq + 1) |
| void faiss_RangeSearchResult_lims(FaissRangeSearchResult* rsr, size_t** lims); |
| |
| /// getter for labels and respective distances (not sorted): |
| /// result for query i is labels[lims[i]:lims[i+1]] |
| void faiss_RangeSearchResult_labels( |
| FaissRangeSearchResult* rsr, |
| idx_t** labels, |
| float** distances); |
| |
| /** Encapsulates a set of ids to remove. */ |
| FAISS_DECLARE_CLASS(IDSelector) |
| FAISS_DECLARE_DESTRUCTOR(IDSelector) |
| |
| int faiss_IDSelector_is_member(const FaissIDSelector* sel, idx_t id); |
| |
| /** remove ids between [imni, imax) */ |
| FAISS_DECLARE_CLASS(IDSelectorRange) |
| FAISS_DECLARE_DESTRUCTOR(IDSelectorRange) |
| |
| FAISS_DECLARE_GETTER(IDSelectorRange, idx_t, imin) |
| FAISS_DECLARE_GETTER(IDSelectorRange, idx_t, imax) |
| |
| int faiss_IDSelectorRange_new( |
| FaissIDSelectorRange** p_sel, |
| idx_t imin, |
| idx_t imax); |
| |
| /** Remove ids from a set. Repetitions of ids in the indices set |
| * passed to the constructor does not hurt performance. The hash |
| * function used for the bloom filter and GCC's implementation of |
| * unordered_set are just the least significant bits of the id. This |
| * works fine for random ids or ids in sequences but will produce many |
| * hash collisions if lsb's are always the same */ |
| FAISS_DECLARE_CLASS(IDSelectorBatch) |
| |
| FAISS_DECLARE_GETTER(IDSelectorBatch, int, nbits) |
| FAISS_DECLARE_GETTER(IDSelectorBatch, idx_t, mask) |
| |
| int faiss_IDSelectorBatch_new( |
| FaissIDSelectorBatch** p_sel, |
| size_t n, |
| const idx_t* indices); |
| |
| FAISS_DECLARE_CLASS(IDSelectorBitmap) |
| FAISS_DECLARE_DESTRUCTOR(IDSelectorBitmap) |
| |
| FAISS_DECLARE_GETTER(IDSelectorBitmap, size_t, n) |
| FAISS_DECLARE_GETTER(IDSelectorBitmap, const uint8_t*, bitmap) |
| |
| int faiss_IDSelectorBitmap_new( |
| FaissIDSelectorBitmap** p_sel, |
| size_t n, |
| const uint8_t* bitmap); |
| |
| FAISS_DECLARE_CLASS(IDSelectorNot) |
| int faiss_IDSelectorNot_new( |
| FaissIDSelectorNot** p_sel, |
| const FaissIDSelector* sel); |
| |
| FAISS_DECLARE_CLASS(IDSelectorAnd) |
| int faiss_IDSelectorAnd_new( |
| FaissIDSelectorAnd** p_sel, |
| const FaissIDSelector* lhs_sel, |
| const FaissIDSelector* rhs_sel); |
| |
| FAISS_DECLARE_CLASS(IDSelectorOr) |
| int faiss_IDSelectorOr_new( |
| FaissIDSelectorOr** p_sel, |
| const FaissIDSelector* lhs_sel, |
| const FaissIDSelector* rhs_sel); |
| |
| FAISS_DECLARE_CLASS(IDSelectorXOr) |
| int faiss_IDSelectorXOr_new( |
| FaissIDSelectorXOr** p_sel, |
| const FaissIDSelector* lhs_sel, |
| const FaissIDSelector* rhs_sel); |
| |
| // Below are structures used only by Index implementations |
| |
| /** List of temporary buffers used to store results before they are |
| * copied to the RangeSearchResult object. */ |
| FAISS_DECLARE_CLASS(BufferList) |
| FAISS_DECLARE_DESTRUCTOR(BufferList) |
| |
| FAISS_DECLARE_GETTER(BufferList, size_t, buffer_size) |
| FAISS_DECLARE_GETTER(BufferList, size_t, wp) |
| |
| typedef struct FaissBuffer { |
| idx_t* ids; |
| float* dis; |
| } FaissBuffer; |
| |
| int faiss_BufferList_append_buffer(FaissBufferList* bl); |
| |
| int faiss_BufferList_new(FaissBufferList** p_bl, size_t buffer_size); |
| |
| int faiss_BufferList_add(FaissBufferList* bl, idx_t id, float dis); |
| |
| /// copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to |
| /// tables dest_ids, dest_dis |
| int faiss_BufferList_copy_range( |
| FaissBufferList* bl, |
| size_t ofs, |
| size_t n, |
| idx_t* dest_ids, |
| float* dest_dis); |
| |
| /// the entries in the buffers are split per query |
| FAISS_DECLARE_CLASS(RangeSearchPartialResult) |
| |
| /// result structure for a single query |
| FAISS_DECLARE_CLASS(RangeQueryResult) |
| FAISS_DECLARE_GETTER(RangeQueryResult, idx_t, qno) |
| FAISS_DECLARE_GETTER(RangeQueryResult, size_t, nres) |
| FAISS_DECLARE_GETTER(RangeQueryResult, FaissRangeSearchPartialResult*, pres) |
| |
| int faiss_RangeQueryResult_add(FaissRangeQueryResult* qr, float dis, idx_t id); |
| |
| FAISS_DECLARE_GETTER(RangeSearchPartialResult, FaissRangeSearchResult*, res) |
| |
| int faiss_RangeSearchPartialResult_new( |
| FaissRangeSearchPartialResult** p_res, |
| FaissRangeSearchResult* res_in); |
| |
| int faiss_RangeSearchPartialResult_finalize(FaissRangeSearchPartialResult* res); |
| |
| /// called by range_search before do_allocation |
| int faiss_RangeSearchPartialResult_set_lims(FaissRangeSearchPartialResult* res); |
| |
| int faiss_RangeSearchPartialResult_new_result( |
| FaissRangeSearchPartialResult* res, |
| idx_t qno, |
| FaissRangeQueryResult** qr); |
| |
| FAISS_DECLARE_CLASS(DistanceComputer) |
| /// called before computing distances |
| int faiss_DistanceComputer_set_query(FaissDistanceComputer* dc, const float* x); |
| |
| /** |
| * Compute distance of vector i to current query. |
| * This function corresponds to the function call operator: |
| * DistanceComputer::operator() |
| */ |
| int faiss_DistanceComputer_vector_to_query_dis( |
| FaissDistanceComputer* dc, |
| idx_t i, |
| float* qd); |
| /// compute distance between two stored vectors |
| int faiss_DistanceComputer_symmetric_dis( |
| FaissDistanceComputer* dc, |
| idx_t i, |
| idx_t j, |
| float* vd); |
| |
| FAISS_DECLARE_DESTRUCTOR(DistanceComputer) |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |