/* * 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++ -*- #include "IndexIVF_c.h" #include #include "Clustering_c.h" #include "Index_c.h" #include "impl/AuxIndexStructures_c.h" #include "macros_impl.h" using faiss::IndexIVF; using faiss::IndexIVFStats; using faiss::SearchParametersIVF; /// SearchParametersIVF definitions DEFINE_DESTRUCTOR(SearchParametersIVF) DEFINE_SEARCH_PARAMETERS_DOWNCAST(SearchParametersIVF) int faiss_SearchParametersIVF_new(FaissSearchParametersIVF** p_sp) { try { SearchParametersIVF* sp = new SearchParametersIVF; *p_sp = reinterpret_cast(sp); } CATCH_AND_HANDLE } int faiss_SearchParametersIVF_new_with( FaissSearchParametersIVF** p_sp, FaissIDSelector* sel, size_t nprobe, size_t max_codes) { try { SearchParametersIVF* sp = new SearchParametersIVF; sp->sel = reinterpret_cast(sel); sp->nprobe = nprobe; sp->max_codes = max_codes; *p_sp = reinterpret_cast(sp); } CATCH_AND_HANDLE } DEFINE_GETTER_PERMISSIVE(SearchParametersIVF, const FaissIDSelector*, sel) DEFINE_GETTER(SearchParametersIVF, size_t, nprobe) DEFINE_SETTER(SearchParametersIVF, size_t, nprobe) DEFINE_GETTER(SearchParametersIVF, size_t, max_codes) DEFINE_SETTER(SearchParametersIVF, size_t, max_codes) /// IndexIVF definitions DEFINE_DESTRUCTOR(IndexIVF) DEFINE_INDEX_DOWNCAST(IndexIVF) /// number of possible key values DEFINE_GETTER(IndexIVF, size_t, nlist) /// number of probes at query time DEFINE_GETTER(IndexIVF, size_t, nprobe) DEFINE_SETTER(IndexIVF, size_t, nprobe) /// quantizer that maps vectors to inverted lists DEFINE_GETTER_PERMISSIVE(IndexIVF, FaissIndex*, quantizer) /** * = 0: use the quantizer as index in a kmeans training * = 1: just pass on the training set to the train() of the quantizer * = 2: kmeans training on a flat index + add the centroids to the quantizer */ DEFINE_GETTER(IndexIVF, char, quantizer_trains_alone) /// whether object owns the quantizer DEFINE_GETTER(IndexIVF, int, own_fields) DEFINE_SETTER(IndexIVF, int, own_fields) using faiss::IndexIVF; int faiss_IndexIVF_merge_from( FaissIndexIVF* index, FaissIndexIVF* other, idx_t add_id) { try { reinterpret_cast(index)->merge_from( *reinterpret_cast(other), add_id); } CATCH_AND_HANDLE } int faiss_IndexIVF_copy_subset_to( const FaissIndexIVF* index, FaissIndexIVF* other, int subset_type, idx_t a1, idx_t a2) { try { reinterpret_cast(index)->copy_subset_to( *reinterpret_cast(other), static_cast(subset_type), a1, a2); } CATCH_AND_HANDLE } int faiss_IndexIVF_search_preassigned( const FaissIndexIVF* index, idx_t n, const float* x, idx_t k, const idx_t* assign, const float* centroid_dis, float* distances, idx_t* labels, int store_pairs) { try { reinterpret_cast(index)->search_preassigned( n, x, k, assign, centroid_dis, distances, labels, store_pairs); } CATCH_AND_HANDLE } size_t faiss_IndexIVF_get_list_size( const FaissIndexIVF* index, size_t list_no) { return reinterpret_cast(index)->get_list_size(list_no); } int faiss_IndexIVF_make_direct_map( FaissIndexIVF* index, int new_maintain_direct_map) { try { reinterpret_cast(index)->make_direct_map( static_cast(new_maintain_direct_map)); } CATCH_AND_HANDLE } double faiss_IndexIVF_imbalance_factor(const FaissIndexIVF* index) { return reinterpret_cast(index) ->invlists->imbalance_factor(); } /// display some stats about the inverted lists void faiss_IndexIVF_print_stats(const FaissIndexIVF* index) { reinterpret_cast(index)->invlists->print_stats(); } /// get inverted lists ids void faiss_IndexIVF_invlists_get_ids( const FaissIndexIVF* index, size_t list_no, idx_t* invlist) { const idx_t* list = reinterpret_cast(index)->invlists->get_ids( list_no); size_t list_size = reinterpret_cast(index)->get_list_size(list_no); memcpy(invlist, list, list_size * sizeof(idx_t)); } int faiss_IndexIVF_train_encoder( FaissIndexIVF* index, idx_t n, const float* x, const idx_t* assign) { try { reinterpret_cast(index)->train_encoder(n, x, assign); } CATCH_AND_HANDLE } void faiss_IndexIVFStats_reset(FaissIndexIVFStats* stats) { reinterpret_cast(stats)->reset(); } FaissIndexIVFStats* faiss_get_indexIVF_stats() { return reinterpret_cast(&faiss::indexIVF_stats); }