diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14d77d0..6d8d979 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,7 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] + branches: [ master, "change/faiss-v1.8.0" ] env: CARGO_TERM_COLOR: always diff --git a/faiss-sys/faiss b/faiss-sys/faiss index 066188e..9d36235 160000 --- a/faiss-sys/faiss +++ b/faiss-sys/faiss @@ -1 +1 @@ -Subproject commit 066188e4a61103811aae91e3530ef68d4125b832 +Subproject commit 9d36235468d8fb8a53d4fc5e7d98bd2ec6823e4b diff --git a/faiss-sys/gen_bindings.sh b/faiss-sys/gen_bindings.sh index e176f75..dd110d8 100755 --- a/faiss-sys/gen_bindings.sh +++ b/faiss-sys/gen_bindings.sh @@ -4,19 +4,19 @@ # Ensure that the submodule is updated and checked out in the intended revision if ! which bindgen > /dev/null; then echo "ERROR: `bindgen` not found. Please install using cargo:" - echo " cargo install bindgen" + echo " cargo install bindgen-cli --version=^0.69" exit 1 fi repo_url=https://github.com/facebookresearch/faiss -repo_rev=v1.7.2 +repo_rev=v1.8.0 cuda_root=/opt/cuda if [ ! -d faiss ]; then git clone "$repo_url" faiss --branch "$repo_rev" --depth 1 fi -bindgen_opt='--size_t-is-usize --whitelist-function faiss_.* --whitelist-type idx_t|Faiss.* --opaque-type FILE' +bindgen_opt='--allowlist-function faiss_.* --allowlist-type idx_t|Faiss.* --opaque-type FILE' headers=`ls faiss/c_api/*_c.h faiss/c_api/impl/*_c.h faiss/c_api/utils/*_c.h` echo '// Auto-generated, do not edit!' > c_api.h @@ -24,7 +24,7 @@ for header in $headers; do echo "#include \""$header"\"" >> c_api.h; done -cmd="bindgen --rust-target 1.33 $bindgen_opt c_api.h -o src/bindings.rs" +cmd="bindgen --rust-target 1.59 $bindgen_opt c_api.h -o src/bindings.rs" echo ${cmd} ${cmd} @@ -33,7 +33,7 @@ for header in $headers; do echo "#include \""$header"\"" >> c_api.h; done -cmd="bindgen --rust-target 1.33 $bindgen_opt c_api.h -o src/bindings_gpu.rs -- -Ifaiss/c_api -I$cuda_root/include" +cmd="bindgen --rust-target 1.59 $bindgen_opt c_api.h -o src/bindings_gpu.rs -- -Ifaiss/c_api -I$cuda_root/include" echo ${cmd} ${cmd} diff --git a/faiss-sys/src/bindings.rs b/faiss-sys/src/bindings.rs index 89657ae..6ee7406 100644 --- a/faiss-sys/src/bindings.rs +++ b/faiss-sys/src/bindings.rs @@ -1,6 +1,5 @@ -/* automatically generated by rust-bindgen 0.59.2 */ +/* automatically generated by rust-bindgen 0.69.4 */ -pub type __int64_t = ::std::os::raw::c_long; pub type faiss_idx_t = i64; pub type idx_t = faiss_idx_t; #[repr(C)] @@ -31,11 +30,25 @@ pub const FaissMetricType_METRIC_Canberra: FaissMetricType = 20; pub const FaissMetricType_METRIC_BrayCurtis: FaissMetricType = 21; #[doc = " some additional metrics defined in scipy.spatial.distance"] pub const FaissMetricType_METRIC_JensenShannon: FaissMetricType = 22; -#[doc = " Some algorithms support both an inner product version and a L2 search"] -#[doc = " version."] +#[doc = " Some algorithms support both an inner product version and a L2 search\n version."] pub type FaissMetricType = ::std::os::raw::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] +pub struct FaissSearchParameters_H { + _unused: [u8; 0], +} +pub type FaissSearchParameters = FaissSearchParameters_H; +extern "C" { + pub fn faiss_SearchParameters_free(obj: *mut FaissSearchParameters); +} +extern "C" { + pub fn faiss_SearchParameters_new( + p_sp: *mut *mut FaissSearchParameters, + sel: *mut FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct FaissIndex_H { _unused: [u8; 0], } @@ -62,11 +75,7 @@ extern "C" { pub fn faiss_Index_set_verbose(arg1: *mut FaissIndex, arg2: ::std::os::raw::c_int); } extern "C" { - #[doc = " Perform training on a representative set of vectors"] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param x training vectors, size n * d"] + #[doc = " Perform training on a representative set of vectors\n\n @param index opaque pointer to index object\n @param n nb of training vectors\n @param x training vectors, size n * d"] pub fn faiss_Index_train( index: *mut FaissIndex, n: idx_t, @@ -74,13 +83,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Add n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " Vectors are implicitly assigned labels ntotal .. ntotal + n - 1"] - #[doc = " This function slices the input vectors in chunks smaller than"] - #[doc = " blocksize_add and calls add_core."] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input matrix, size n * d"] + #[doc = " Add n vectors of dimension d to the index.\n\n Vectors are implicitly assigned labels ntotal .. ntotal + n - 1\n This function slices the input vectors in chunks smaller than\n blocksize_add and calls add_core.\n @param index opaque pointer to index object\n @param x input matrix, size n * d"] pub fn faiss_Index_add( index: *mut FaissIndex, n: idx_t, @@ -88,13 +91,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Same as add, but stores xids instead of sequential ids."] - #[doc = ""] - #[doc = " The default implementation fails with an assertion, as it is"] - #[doc = " not supported by all indexes."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param xids if non-null, ids to store for the vectors (size n)"] + #[doc = " Same as add, but stores xids instead of sequential ids.\n\n The default implementation fails with an assertion, as it is\n not supported by all indexes.\n\n @param index opaque pointer to index object\n @param xids if non-null, ids to store for the vectors (size n)"] pub fn faiss_Index_add_with_ids( index: *mut FaissIndex, n: idx_t, @@ -103,15 +100,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " query n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " return at most k vectors. If there are not enough results for a"] - #[doc = " query, the result array is padded with -1s."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param labels output labels of the NNs, size n*k"] - #[doc = " @param distances output pairwise distances, size n*k"] + #[doc = " query n vectors of dimension d to the index.\n\n return at most k vectors. If there are not enough results for a\n query, the result array is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] pub fn faiss_Index_search( index: *const FaissIndex, n: idx_t, @@ -122,16 +111,19 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " query n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " return all vectors with distance < radius. Note that many"] - #[doc = " indexes do not implement the range_search (only the k-NN search"] - #[doc = " is mandatory)."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param radius search radius"] - #[doc = " @param result result table"] + #[doc = " query n vectors of dimension d with search parameters to the index.\n\n return at most k vectors. If there are not enough results for a query,\n the result is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param params input params to modify how search is done\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] + pub fn faiss_Index_search_with_params( + index: *const FaissIndex, + n: idx_t, + x: *const f32, + k: idx_t, + params: *const FaissSearchParameters, + distances: *mut f32, + labels: *mut idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return all vectors with distance < radius. Note that many\n indexes do not implement the range_search (only the k-NN search\n is mandatory).\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param radius search radius\n @param result result table"] pub fn faiss_Index_range_search( index: *const FaissIndex, n: idx_t, @@ -141,12 +133,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " return the indexes of the k vectors closest to the query x."] - #[doc = ""] - #[doc = " This function is identical as search but only return labels of neighbors."] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param labels output labels of the NNs, size n*k"] + #[doc = " return the indexes of the k vectors closest to the query x.\n\n This function is identical as search but only return labels of neighbors.\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k"] pub fn faiss_Index_assign( index: *mut FaissIndex, n: idx_t, @@ -156,14 +143,11 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " removes all elements from the database."] - #[doc = " @param index opaque pointer to index object"] + #[doc = " removes all elements from the database.\n @param index opaque pointer to index object"] pub fn faiss_Index_reset(index: *mut FaissIndex) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " removes IDs from the index. Not supported by all indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param nremove output for the number of IDs removed"] + #[doc = " removes IDs from the index. Not supported by all indexes\n @param index opaque pointer to index object\n @param nremove output for the number of IDs removed"] pub fn faiss_Index_remove_ids( index: *mut FaissIndex, sel: *const FaissIDSelector, @@ -171,12 +155,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)"] - #[doc = ""] - #[doc = " this function may not be defined for some indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param key id of the vector to reconstruct"] - #[doc = " @param recons reconstructed vector (size d)"] + #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param key id of the vector to reconstruct\n @param recons reconstructed vector (size d)"] pub fn faiss_Index_reconstruct( index: *const FaissIndex, key: idx_t, @@ -184,11 +163,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Reconstruct vectors i0 to i0 + ni - 1"] - #[doc = ""] - #[doc = " this function may not be defined for some indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param recons reconstructed vector (size ni * d)"] + #[doc = " Reconstruct vectors i0 to i0 + ni - 1\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param recons reconstructed vector (size ni * d)"] pub fn faiss_Index_reconstruct_n( index: *const FaissIndex, i0: idx_t, @@ -197,17 +172,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Computes a residual vector after indexing encoding."] - #[doc = ""] - #[doc = " The residual vector is the difference between a vector and the"] - #[doc = " reconstruction that can be decoded from its representation in"] - #[doc = " the index. The residual can be used for multiple-stage indexing"] - #[doc = " methods, like IndexIVF's methods."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vector, size d"] - #[doc = " @param residual output residual vector, size d"] - #[doc = " @param key encoded index, as returned by search and assign"] + #[doc = " Computes a residual vector after indexing encoding.\n\n The residual vector is the difference between a vector and the\n reconstruction that can be decoded from its representation in\n the index. The residual can be used for multiple-stage indexing\n methods, like IndexIVF's methods.\n\n @param index opaque pointer to index object\n @param x input vector, size d\n @param residual output residual vector, size d\n @param key encoded index, as returned by search and assign"] pub fn faiss_Index_compute_residual( index: *const FaissIndex, x: *const f32, @@ -216,18 +181,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Computes a residual vector after indexing encoding."] - #[doc = ""] - #[doc = " The residual vector is the difference between a vector and the"] - #[doc = " reconstruction that can be decoded from its representation in"] - #[doc = " the index. The residual can be used for multiple-stage indexing"] - #[doc = " methods, like IndexIVF's methods."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param n number of vectors"] - #[doc = " @param x input vector, size (n x d)"] - #[doc = " @param residuals output residual vectors, size (n x d)"] - #[doc = " @param keys encoded index, as returned by search and assign"] + #[doc = " Computes a residual vector after indexing encoding.\n\n The residual vector is the difference between a vector and the\n reconstruction that can be decoded from its representation in\n the index. The residual can be used for multiple-stage indexing\n methods, like IndexIVF's methods.\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param x input vector, size (n x d)\n @param residuals output residual vectors, size (n x d)\n @param keys encoded index, as returned by search and assign"] pub fn faiss_Index_compute_residual_n( index: *const FaissIndex, n: idx_t, @@ -236,6 +190,31 @@ extern "C" { keys: *const idx_t, ) -> ::std::os::raw::c_int; } +extern "C" { + #[doc = " The size of the produced codes in bytes.\n\n @param index opaque pointer to index object\n @param size the returned size in bytes"] + pub fn faiss_Index_sa_code_size( + index: *const FaissIndex, + size: *mut usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " encode a set of vectors\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param x input vectors, size n * d\n @param bytes output encoded vectors, size n * sa_code_size()"] + pub fn faiss_Index_sa_encode( + index: *const FaissIndex, + n: idx_t, + x: *const f32, + bytes: *mut u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " decode a set of vectors\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param bytes input encoded vectors, size n * sa_code_size()\n @param x output vectors, size n * d"] + pub fn faiss_Index_sa_decode( + index: *const FaissIndex, + n: idx_t, + bytes: *const u8, + x: *mut f32, + ) -> ::std::os::raw::c_int; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct FaissParameterRange_H { @@ -248,8 +227,7 @@ extern "C" { ) -> *const ::std::os::raw::c_char; } extern "C" { - #[doc = " Getter for the values in the range. The output values are invalidated"] - #[doc = " upon any other modification of the range."] + #[doc = " Getter for the values in the range. The output values are invalidated\n upon any other modification of the range."] pub fn faiss_ParameterRange_values( arg1: *mut FaissParameterRange, arg2: *mut *mut f64, @@ -274,9 +252,7 @@ extern "C" { pub fn faiss_ParameterSpace_n_combinations(arg1: *const FaissParameterSpace) -> usize; } extern "C" { - #[doc = " get string representation of the combination"] - #[doc = " by writing it to the given character buffer."] - #[doc = " A buffer size of 1000 ensures that the full name is collected."] + #[doc = " get string representation of the combination\n by writing it to the given character buffer.\n A buffer size of 1000 ensures that the full name is collected."] pub fn faiss_ParameterSpace_combination_name( arg1: *const FaissParameterSpace, arg2: usize, @@ -321,8 +297,7 @@ extern "C" { arg3: *mut *mut FaissParameterRange, ) -> ::std::os::raw::c_int; } -#[doc = " Class for the clustering parameters. Can be passed to the"] -#[doc = " constructor of the Clustering object."] +#[doc = " Class for the clustering parameters. Can be passed to the\n constructor of the Clustering object."] #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct FaissClusteringParameters { @@ -338,8 +313,7 @@ pub struct FaissClusteringParameters { pub int_centroids: ::std::os::raw::c_int, #[doc = "< (bool) update index after each iteration?"] pub update_index: ::std::os::raw::c_int, - #[doc = "< (bool) use the centroids provided as input and do"] - #[doc = "< not change them during iterations"] + #[doc = "< (bool) use the centroids provided as input and do\n< not change them during iterations"] pub frozen_centroids: ::std::os::raw::c_int, #[doc = "< otherwise you get a warning"] pub min_points_per_centroid: ::std::os::raw::c_int, @@ -352,6 +326,9 @@ pub struct FaissClusteringParameters { } #[test] fn bindgen_test_layout_FaissClusteringParameters() { + const UNINIT: ::std::mem::MaybeUninit = + ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); assert_eq!( ::std::mem::size_of::(), 48usize, @@ -363,7 +340,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { concat!("Alignment of ", stringify!(FaissClusteringParameters)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).niter as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).niter) as usize - ptr as usize }, 0usize, concat!( "Offset of field: ", @@ -373,7 +350,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nredo as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nredo) as usize - ptr as usize }, 4usize, concat!( "Offset of field: ", @@ -383,9 +360,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).verbose as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).verbose) as usize - ptr as usize }, 8usize, concat!( "Offset of field: ", @@ -395,9 +370,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).spherical as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).spherical) as usize - ptr as usize }, 12usize, concat!( "Offset of field: ", @@ -407,9 +380,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).int_centroids as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).int_centroids) as usize - ptr as usize }, 16usize, concat!( "Offset of field: ", @@ -419,9 +390,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).update_index as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).update_index) as usize - ptr as usize }, 20usize, concat!( "Offset of field: ", @@ -431,10 +400,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).frozen_centroids as *const _ - as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).frozen_centroids) as usize - ptr as usize }, 24usize, concat!( "Offset of field: ", @@ -444,10 +410,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).min_points_per_centroid - as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).min_points_per_centroid) as usize - ptr as usize }, 28usize, concat!( "Offset of field: ", @@ -457,10 +420,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).max_points_per_centroid - as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).max_points_per_centroid) as usize - ptr as usize }, 32usize, concat!( "Offset of field: ", @@ -470,7 +430,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).seed as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).seed) as usize - ptr as usize }, 36usize, concat!( "Offset of field: ", @@ -480,10 +440,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).decode_block_size as *const _ - as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).decode_block_size) as usize - ptr as usize }, 40usize, concat!( "Offset of field: ", @@ -618,15 +575,7 @@ extern "C" { pub fn faiss_Clustering_free(clustering: *mut FaissClustering); } extern "C" { - #[doc = " simplified interface"] - #[doc = ""] - #[doc = " @param d dimension of the data"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param k nb of output centroids"] - #[doc = " @param x training set (size n * d)"] - #[doc = " @param centroids output centroids (size k * d)"] - #[doc = " @param q_error final quantization error"] - #[doc = " @return error code"] + #[doc = " simplified interface\n\n @param d dimension of the data\n @param n nb of training vectors\n @param k nb of output centroids\n @param x training set (size n * d)\n @param centroids output centroids (size k * d)\n @param q_error final quantization error\n @return error code"] pub fn faiss_kmeans_clustering( d: usize, n: usize, @@ -636,6 +585,118 @@ extern "C" { q_error: *mut f32, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIndexBinary_H { + _unused: [u8; 0], +} +pub type FaissIndexBinary = FaissIndexBinary_H; +extern "C" { + pub fn faiss_IndexBinary_free(obj: *mut FaissIndexBinary); +} +extern "C" { + pub fn faiss_IndexBinary_d(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_is_trained(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_ntotal(arg1: *const FaissIndexBinary) -> idx_t; +} +extern "C" { + pub fn faiss_IndexBinary_metric_type(arg1: *const FaissIndexBinary) -> FaissMetricType; +} +extern "C" { + pub fn faiss_IndexBinary_verbose(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_set_verbose(arg1: *mut FaissIndexBinary, arg2: ::std::os::raw::c_int); +} +extern "C" { + #[doc = " Perform training on a representative set of vectors\n\n @param index opaque pointer to index object\n @param n nb of training vectors\n @param x training vectors, size n * d"] + pub fn faiss_IndexBinary_train( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Add n vectors of dimension d to the index.\n\n Vectors are implicitly assigned labels ntotal .. ntotal + n - 1\n This function slices the input vectors in chunks smaller than\n blocksize_add and calls add_core.\n @param index opaque pointer to index object\n @param x input matrix, size n * d"] + pub fn faiss_IndexBinary_add( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Same as add, but stores xids instead of sequential ids.\n\n The default implementation fails with an assertion, as it is\n not supported by all indexes.\n\n @param index opaque pointer to index object\n @param xids if non-null, ids to store for the vectors (size n)"] + pub fn faiss_IndexBinary_add_with_ids( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + xids: *const idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return at most k vectors. If there are not enough results for a\n query, the result array is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] + pub fn faiss_IndexBinary_search( + index: *const FaissIndexBinary, + n: idx_t, + x: *const u8, + k: idx_t, + distances: *mut i32, + labels: *mut idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return all vectors with distance < radius. Note that many\n indexes do not implement the range_search (only the k-NN search\n is mandatory).\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param radius search radius\n @param result result table"] + pub fn faiss_IndexBinary_range_search( + index: *const FaissIndexBinary, + n: idx_t, + x: *const u8, + radius: ::std::os::raw::c_int, + result: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " return the indexes of the k vectors closest to the query x.\n\n This function is identical as search but only return labels of neighbors.\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k"] + pub fn faiss_IndexBinary_assign( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + labels: *mut idx_t, + k: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " removes all elements from the database.\n @param index opaque pointer to index object"] + pub fn faiss_IndexBinary_reset(index: *mut FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " removes IDs from the index. Not supported by all indexes\n @param index opaque pointer to index object\n @param nremove output for the number of IDs removed"] + pub fn faiss_IndexBinary_remove_ids( + index: *mut FaissIndexBinary, + sel: *const FaissIDSelector, + n_removed: *mut usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param key id of the vector to reconstruct\n @param recons reconstructed vector (size d)"] + pub fn faiss_IndexBinary_reconstruct( + index: *const FaissIndexBinary, + key: idx_t, + recons: *mut u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Reconstruct vectors i0 to i0 + ni - 1\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param recons reconstructed vector (size ni * d)"] + pub fn faiss_IndexBinary_reconstruct_n( + index: *const FaissIndexBinary, + i0: idx_t, + ni: idx_t, + recons: *mut u8, + ) -> ::std::os::raw::c_int; +} pub type FaissIndexFlat = FaissIndex_H; extern "C" { #[doc = " Opaque type for IndexFlat"] @@ -649,12 +710,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " get a pointer to the index's internal data (the `xb` field). The outputs"] - #[doc = " become invalid after any data addition or removal operation."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_xb output, the pointer to the beginning of `xb`."] - #[doc = " @param p_size output, the current size of `sb` in number of float values."] + #[doc = " get a pointer to the index's internal data (the `xb` field). The outputs\n become invalid after any data addition or removal operation.\n\n @param index opaque pointer to index object\n @param p_xb output, the pointer to the beginning of `xb`.\n @param p_size output, the current size of `sb` in number of float values."] pub fn faiss_IndexFlat_xb(index: *mut FaissIndexFlat, p_xb: *mut *mut f32, p_size: *mut usize); } extern "C" { @@ -664,14 +720,7 @@ extern "C" { pub fn faiss_IndexFlat_free(obj: *mut FaissIndexFlat); } extern "C" { - #[doc = " compute distance with a subset of vectors"] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x query vectors, size n * d"] - #[doc = " @param labels indices of the vectors that should be compared"] - #[doc = " for each query vector, size n * k"] - #[doc = " @param distances"] - #[doc = " corresponding output distances, size n * k"] + #[doc = " compute distance with a subset of vectors\n\n @param index opaque pointer to index object\n @param x query vectors, size n * d\n @param labels indices of the vectors that should be compared\n for each query vector, size n * k\n @param distances\n corresponding output distances, size n * k"] pub fn faiss_IndexFlat_compute_distance_subset( index: *mut FaissIndex, n: idx_t, @@ -717,10 +766,7 @@ extern "C" { } pub type FaissIndexRefineFlat = FaissIndex_H; extern "C" { - #[doc = " Opaque type for IndexRefineFlat"] - #[doc = ""] - #[doc = " Index that queries in a base_index (a fast one) and refines the"] - #[doc = " results with an exact search, hopefully improving the results."] + #[doc = " Opaque type for IndexRefineFlat\n\n Index that queries in a base_index (a fast one) and refines the\n results with an exact search, hopefully improving the results."] pub fn faiss_IndexRefineFlat_new( p_index: *mut *mut FaissIndexRefineFlat, base_index: *mut FaissIndex, @@ -757,9 +803,7 @@ extern "C" { pub fn faiss_IndexFlat1D_free(obj: *mut FaissIndexFlat1D); } extern "C" { - #[doc = " Opaque type for IndexFlat1D"] - #[doc = ""] - #[doc = " optimized version for 1D \"vectors\""] + #[doc = " Opaque type for IndexFlat1D\n\n optimized version for 1D \"vectors\""] pub fn faiss_IndexFlat1D_new(p_index: *mut *mut FaissIndexFlat1D) -> ::std::os::raw::c_int; } extern "C" { @@ -837,13 +881,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Update a subset of vectors."] - #[doc = ""] - #[doc = " The index must have a direct_map"] - #[doc = ""] - #[doc = " @param nv nb of vectors to update"] - #[doc = " @param idx vector indices to update, size nv"] - #[doc = " @param v vectors of new values, size nv*d"] + #[doc = " Update a subset of vectors.\n\n The index must have a direct_map\n\n @param nv nb of vectors to update\n @param idx vector indices to update, size nv\n @param v vectors of new values, size nv*d"] pub fn faiss_IndexIVFFlat_update_vectors( index: *mut FaissIndexIVFFlat, nv: ::std::os::raw::c_int, @@ -851,151 +889,490 @@ extern "C" { v: *const f32, ) -> ::std::os::raw::c_int; } -pub type FaissIndexIVF = FaissIndex_H; extern "C" { - pub fn faiss_IndexIVF_free(obj: *mut FaissIndexIVF); + pub fn faiss_RangeSearchResult_nq(arg1: *const FaissRangeSearchResult) -> usize; } extern "C" { - pub fn faiss_IndexIVF_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIVF; + pub fn faiss_RangeSearchResult_new( + p_rsr: *mut *mut FaissRangeSearchResult, + nq: idx_t, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_nlist(arg1: *const FaissIndexIVF) -> usize; + pub fn faiss_RangeSearchResult_new_with( + p_rsr: *mut *mut FaissRangeSearchResult, + nq: idx_t, + alloc_lims: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_nprobe(arg1: *const FaissIndexIVF) -> usize; + #[doc = " called when lims contains the nb of elements result entries\n for each query"] + pub fn faiss_RangeSearchResult_do_allocation( + rsr: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_set_nprobe(arg1: *mut FaissIndexIVF, arg2: usize); + pub fn faiss_RangeSearchResult_free(obj: *mut FaissRangeSearchResult); } extern "C" { - pub fn faiss_IndexIVF_quantizer(arg1: *const FaissIndexIVF) -> *mut FaissIndex; + pub fn faiss_RangeSearchResult_buffer_size(arg1: *const FaissRangeSearchResult) -> usize; } extern "C" { - pub fn faiss_IndexIVF_quantizer_trains_alone( - arg1: *const FaissIndexIVF, - ) -> ::std::os::raw::c_char; + #[doc = " getter for lims: size (nq + 1)"] + pub fn faiss_RangeSearchResult_lims(rsr: *mut FaissRangeSearchResult, lims: *mut *mut usize); } extern "C" { - pub fn faiss_IndexIVF_own_fields(arg1: *const FaissIndexIVF) -> ::std::os::raw::c_int; + #[doc = " getter for labels and respective distances (not sorted):\n result for query i is labels[lims[i]:lims[i+1]]"] + pub fn faiss_RangeSearchResult_labels( + rsr: *mut FaissRangeSearchResult, + labels: *mut *mut idx_t, + distances: *mut *mut f32, + ); } extern "C" { - pub fn faiss_IndexIVF_set_own_fields(arg1: *mut FaissIndexIVF, arg2: ::std::os::raw::c_int); + pub fn faiss_IDSelector_free(obj: *mut FaissIDSelector); } extern "C" { - #[doc = " moves the entries from another dataset to self. On output,"] - #[doc = " other is empty. add_id is added to all moved ids (for"] - #[doc = " sequential ids, this would be this->ntotal"] - pub fn faiss_IndexIVF_merge_from( - index: *mut FaissIndexIVF, - other: *mut FaissIndexIVF, - add_id: idx_t, + #[doc = " Encapsulates a set of ids to remove."] + pub fn faiss_IDSelector_is_member( + sel: *const FaissIDSelector, + id: idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorRange_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorRange = FaissIDSelectorRange_H; extern "C" { - #[doc = " copy a subset of the entries index to the other index"] - #[doc = ""] - #[doc = " if subset_type == 0: copies ids in [a1, a2)"] - #[doc = " if subset_type == 1: copies ids if id % a1 == a2"] - #[doc = " if subset_type == 2: copies inverted lists such that a1"] - #[doc = " elements are left before and a2 elements are after"] - pub fn faiss_IndexIVF_copy_subset_to( - index: *const FaissIndexIVF, - other: *mut FaissIndexIVF, - subset_type: ::std::os::raw::c_int, - a1: idx_t, - a2: idx_t, + pub fn faiss_IDSelectorRange_free(obj: *mut FaissIDSelectorRange); +} +extern "C" { + pub fn faiss_IDSelectorRange_imin(arg1: *const FaissIDSelectorRange) -> idx_t; +} +extern "C" { + pub fn faiss_IDSelectorRange_imax(arg1: *const FaissIDSelectorRange) -> idx_t; +} +extern "C" { + #[doc = " remove ids between [imni, imax)"] + pub fn faiss_IDSelectorRange_new( + p_sel: *mut *mut FaissIDSelectorRange, + imin: idx_t, + imax: idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorBatch_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorBatch = FaissIDSelectorBatch_H; extern "C" { - #[doc = " search a set of vectors, that are pre-quantized by the IVF"] - #[doc = " quantizer. Fill in the corresponding heaps with the query"] - #[doc = " results. search() calls this."] - #[doc = ""] - #[doc = " @param n nb of vectors to query"] - #[doc = " @param x query vectors, size nx * d"] - #[doc = " @param assign coarse quantization indices, size nx * nprobe"] - #[doc = " @param centroid_dis"] - #[doc = " distances to coarse centroids, size nx * nprobe"] - #[doc = " @param distance"] - #[doc = " output distances, size n * k"] - #[doc = " @param labels output labels, size n * k"] - #[doc = " @param store_pairs store inv list index + inv list offset"] - #[doc = " instead in upper/lower 32 bit of result,"] - #[doc = " instead of ids (used for reranking)."] - pub fn faiss_IndexIVF_search_preassigned( - index: *const FaissIndexIVF, - n: idx_t, - x: *const f32, - k: idx_t, - assign: *const idx_t, - centroid_dis: *const f32, - distances: *mut f32, - labels: *mut idx_t, - store_pairs: ::std::os::raw::c_int, + pub fn faiss_IDSelectorBatch_nbits(arg1: *const FaissIDSelectorBatch) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IDSelectorBatch_mask(arg1: *const FaissIDSelectorBatch) -> idx_t; +} +extern "C" { + #[doc = " Remove ids from a set. Repetitions of ids in the indices set\n passed to the constructor does not hurt performance. The hash\n function used for the bloom filter and GCC's implementation of\n unordered_set are just the least significant bits of the id. This\n works fine for random ids or ids in sequences but will produce many\n hash collisions if lsb's are always the same"] + pub fn faiss_IDSelectorBatch_new( + p_sel: *mut *mut FaissIDSelectorBatch, + n: usize, + indices: *const idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorNot_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorNot = FaissIDSelectorNot_H; extern "C" { - pub fn faiss_IndexIVF_get_list_size(index: *const FaissIndexIVF, list_no: usize) -> usize; + pub fn faiss_IDSelectorNot_new( + p_sel: *mut *mut FaissIDSelectorNot, + sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorAnd_H { + _unused: [u8; 0], } +pub type FaissIDSelectorAnd = FaissIDSelectorAnd_H; extern "C" { - #[doc = " initialize a direct map"] - #[doc = ""] - #[doc = " @param new_maintain_direct_map if true, create a direct map,"] - #[doc = " else clear it"] - pub fn faiss_IndexIVF_make_direct_map( - index: *mut FaissIndexIVF, - new_maintain_direct_map: ::std::os::raw::c_int, + pub fn faiss_IDSelectorAnd_new( + p_sel: *mut *mut FaissIDSelectorAnd, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorOr_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorOr = FaissIDSelectorOr_H; extern "C" { - #[doc = " Check the inverted lists' imbalance factor."] - #[doc = ""] - #[doc = " 1= perfectly balanced, >1: imbalanced"] - pub fn faiss_IndexIVF_imbalance_factor(index: *const FaissIndexIVF) -> f64; + pub fn faiss_IDSelectorOr_new( + p_sel: *mut *mut FaissIDSelectorOr, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorXOr_H { + _unused: [u8; 0], } +pub type FaissIDSelectorXOr = FaissIDSelectorXOr_H; extern "C" { - #[doc = " display some stats about the inverted lists of the index"] - pub fn faiss_IndexIVF_print_stats(index: *const FaissIndexIVF); + pub fn faiss_IDSelectorXOr_new( + p_sel: *mut *mut FaissIDSelectorXOr, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissBufferList_H { + _unused: [u8; 0], } +pub type FaissBufferList = FaissBufferList_H; extern "C" { - #[doc = " Get the IDs in an inverted list. IDs are written to `invlist`, which must be"] - #[doc = " large enough"] - #[doc = " to accommodate the full list."] - #[doc = ""] - #[doc = " @param list_no the list ID"] - #[doc = " @param invlist output pointer to a slice of memory, at least as long as the"] - #[doc = " list's size"] - #[doc = " @see faiss_IndexIVF_get_list_size(size_t)"] - pub fn faiss_IndexIVF_invlists_get_ids( - index: *const FaissIndexIVF, - list_no: usize, - invlist: *mut idx_t, - ); + pub fn faiss_BufferList_free(obj: *mut FaissBufferList); +} +extern "C" { + pub fn faiss_BufferList_buffer_size(arg1: *const FaissBufferList) -> usize; } +extern "C" { + pub fn faiss_BufferList_wp(arg1: *const FaissBufferList) -> usize; +} +#[doc = " List of temporary buffers used to store results before they are\n copied to the RangeSearchResult object."] #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct FaissIndexIVFStats { - pub nq: usize, - pub nlist: usize, - pub ndis: usize, - pub nheap_updates: usize, - pub quantization_time: f64, - pub search_time: f64, +pub struct FaissBuffer { + pub ids: *mut idx_t, + pub dis: *mut f32, } #[test] -fn bindgen_test_layout_FaissIndexIVFStats() { - assert_eq!( - ::std::mem::size_of::(), - 48usize, - concat!("Size of: ", stringify!(FaissIndexIVFStats)) - ); +fn bindgen_test_layout_FaissBuffer() { + const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(FaissBuffer)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(FaissBuffer)) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).ids) as usize - ptr as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(FaissBuffer), + "::", + stringify!(ids) + ) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).dis) as usize - ptr as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(FaissBuffer), + "::", + stringify!(dis) + ) + ); +} +extern "C" { + pub fn faiss_BufferList_append_buffer(bl: *mut FaissBufferList) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_BufferList_new( + p_bl: *mut *mut FaissBufferList, + buffer_size: usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_BufferList_add( + bl: *mut FaissBufferList, + id: idx_t, + dis: f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to\n tables dest_ids, dest_dis"] + pub fn faiss_BufferList_copy_range( + bl: *mut FaissBufferList, + ofs: usize, + n: usize, + dest_ids: *mut idx_t, + dest_dis: *mut f32, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissRangeSearchPartialResult_H { + _unused: [u8; 0], +} +pub type FaissRangeSearchPartialResult = FaissRangeSearchPartialResult_H; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissRangeQueryResult_H { + _unused: [u8; 0], +} +pub type FaissRangeQueryResult = FaissRangeQueryResult_H; +extern "C" { + pub fn faiss_RangeQueryResult_qno(arg1: *const FaissRangeQueryResult) -> idx_t; +} +extern "C" { + pub fn faiss_RangeQueryResult_nres(arg1: *const FaissRangeQueryResult) -> usize; +} +extern "C" { + pub fn faiss_RangeQueryResult_pres( + arg1: *const FaissRangeQueryResult, + ) -> *mut FaissRangeSearchPartialResult; +} +extern "C" { + #[doc = " result structure for a single query"] + pub fn faiss_RangeQueryResult_add( + qr: *mut FaissRangeQueryResult, + dis: f32, + id: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_res( + arg1: *const FaissRangeSearchPartialResult, + ) -> *mut FaissRangeSearchResult; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_new( + p_res: *mut *mut FaissRangeSearchPartialResult, + res_in: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_finalize( + res: *mut FaissRangeSearchPartialResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " called by range_search before do_allocation"] + pub fn faiss_RangeSearchPartialResult_set_lims( + res: *mut FaissRangeSearchPartialResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_new_result( + res: *mut FaissRangeSearchPartialResult, + qno: idx_t, + qr: *mut *mut FaissRangeQueryResult, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissDistanceComputer_H { + _unused: [u8; 0], +} +pub type FaissDistanceComputer = FaissDistanceComputer_H; +extern "C" { + #[doc = " called before computing distances"] + pub fn faiss_DistanceComputer_set_query( + dc: *mut FaissDistanceComputer, + x: *const f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Compute distance of vector i to current query.\n This function corresponds to the function call operator:\n DistanceComputer::operator()"] + pub fn faiss_DistanceComputer_vector_to_query_dis( + dc: *mut FaissDistanceComputer, + i: idx_t, + qd: *mut f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " compute distance between two stored vectors"] + pub fn faiss_DistanceComputer_symmetric_dis( + dc: *mut FaissDistanceComputer, + i: idx_t, + j: idx_t, + vd: *mut f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_DistanceComputer_free(obj: *mut FaissDistanceComputer); +} +pub type FaissSearchParametersIVF = FaissSearchParameters_H; +extern "C" { + pub fn faiss_SearchParametersIVF_free(obj: *mut FaissSearchParametersIVF); +} +extern "C" { + pub fn faiss_SearchParametersIVF_cast( + arg1: *mut FaissSearchParameters, + ) -> *mut FaissSearchParametersIVF; +} +extern "C" { + pub fn faiss_SearchParametersIVF_new( + p_sp: *mut *mut FaissSearchParametersIVF, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_SearchParametersIVF_new_with( + p_sp: *mut *mut FaissSearchParametersIVF, + sel: *mut FaissIDSelector, + nprobe: usize, + max_codes: usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_SearchParametersIVF_sel( + arg1: *const FaissSearchParametersIVF, + ) -> *const FaissIDSelector; +} +extern "C" { + pub fn faiss_SearchParametersIVF_nprobe(arg1: *const FaissSearchParametersIVF) -> usize; +} +extern "C" { + pub fn faiss_SearchParametersIVF_set_nprobe(arg1: *mut FaissSearchParametersIVF, arg2: usize); +} +extern "C" { + pub fn faiss_SearchParametersIVF_max_codes(arg1: *const FaissSearchParametersIVF) -> usize; +} +extern "C" { + pub fn faiss_SearchParametersIVF_set_max_codes( + arg1: *mut FaissSearchParametersIVF, + arg2: usize, + ); +} +pub type FaissIndexIVF = FaissIndex_H; +extern "C" { + pub fn faiss_IndexIVF_free(obj: *mut FaissIndexIVF); +} +extern "C" { + pub fn faiss_IndexIVF_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIVF; +} +extern "C" { + pub fn faiss_IndexIVF_nlist(arg1: *const FaissIndexIVF) -> usize; +} +extern "C" { + pub fn faiss_IndexIVF_nprobe(arg1: *const FaissIndexIVF) -> usize; +} +extern "C" { + pub fn faiss_IndexIVF_set_nprobe(arg1: *mut FaissIndexIVF, arg2: usize); +} +extern "C" { + pub fn faiss_IndexIVF_quantizer(arg1: *const FaissIndexIVF) -> *mut FaissIndex; +} +extern "C" { + pub fn faiss_IndexIVF_quantizer_trains_alone( + arg1: *const FaissIndexIVF, + ) -> ::std::os::raw::c_char; +} +extern "C" { + pub fn faiss_IndexIVF_own_fields(arg1: *const FaissIndexIVF) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexIVF_set_own_fields(arg1: *mut FaissIndexIVF, arg2: ::std::os::raw::c_int); +} +extern "C" { + #[doc = " moves the entries from another dataset to self. On output,\n other is empty. add_id is added to all moved ids (for\n sequential ids, this would be this->ntotal"] + pub fn faiss_IndexIVF_merge_from( + index: *mut FaissIndexIVF, + other: *mut FaissIndexIVF, + add_id: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " copy a subset of the entries index to the other index\n\n if subset_type == 0: copies ids in [a1, a2)\n if subset_type == 1: copies ids if id % a1 == a2\n if subset_type == 2: copies inverted lists such that a1\n elements are left before and a2 elements are after"] + pub fn faiss_IndexIVF_copy_subset_to( + index: *const FaissIndexIVF, + other: *mut FaissIndexIVF, + subset_type: ::std::os::raw::c_int, + a1: idx_t, + a2: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " search a set of vectors, that are pre-quantized by the IVF\n quantizer. Fill in the corresponding heaps with the query\n results. search() calls this.\n\n @param n nb of vectors to query\n @param x query vectors, size nx * d\n @param assign coarse quantization indices, size nx * nprobe\n @param centroid_dis\n distances to coarse centroids, size nx * nprobe\n @param distance\n output distances, size n * k\n @param labels output labels, size n * k\n @param store_pairs store inv list index + inv list offset\n instead in upper/lower 32 bit of result,\n instead of ids (used for reranking)."] + pub fn faiss_IndexIVF_search_preassigned( + index: *const FaissIndexIVF, + n: idx_t, + x: *const f32, + k: idx_t, + assign: *const idx_t, + centroid_dis: *const f32, + distances: *mut f32, + labels: *mut idx_t, + store_pairs: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexIVF_get_list_size(index: *const FaissIndexIVF, list_no: usize) -> usize; +} +extern "C" { + #[doc = " initialize a direct map\n\n @param new_maintain_direct_map if true, create a direct map,\n else clear it"] + pub fn faiss_IndexIVF_make_direct_map( + index: *mut FaissIndexIVF, + new_maintain_direct_map: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Check the inverted lists' imbalance factor.\n\n 1= perfectly balanced, >1: imbalanced"] + pub fn faiss_IndexIVF_imbalance_factor(index: *const FaissIndexIVF) -> f64; +} +extern "C" { + #[doc = " display some stats about the inverted lists of the index"] + pub fn faiss_IndexIVF_print_stats(index: *const FaissIndexIVF); +} +extern "C" { + #[doc = " Get the IDs in an inverted list. IDs are written to `invlist`, which must be\n large enough\n to accommodate the full list.\n\n @param list_no the list ID\n @param invlist output pointer to a slice of memory, at least as long as the\n list's size\n @see faiss_IndexIVF_get_list_size(size_t)"] + pub fn faiss_IndexIVF_invlists_get_ids( + index: *const FaissIndexIVF, + list_no: usize, + invlist: *mut idx_t, + ); +} +extern "C" { + pub fn faiss_IndexIVF_train_encoder( + index: *mut FaissIndexIVF, + n: idx_t, + x: *const f32, + assign: *const idx_t, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIndexIVFStats { + pub nq: usize, + pub nlist: usize, + pub ndis: usize, + pub nheap_updates: usize, + pub quantization_time: f64, + pub search_time: f64, +} +#[test] +fn bindgen_test_layout_FaissIndexIVFStats() { + const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::(), + 48usize, + concat!("Size of: ", stringify!(FaissIndexIVFStats)) + ); assert_eq!( ::std::mem::align_of::(), 8usize, concat!("Alignment of ", stringify!(FaissIndexIVFStats)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nq as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nq) as usize - ptr as usize }, 0usize, concat!( "Offset of field: ", @@ -1005,7 +1382,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nlist as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nlist) as usize - ptr as usize }, 8usize, concat!( "Offset of field: ", @@ -1015,7 +1392,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).ndis as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).ndis) as usize - ptr as usize }, 16usize, concat!( "Offset of field: ", @@ -1025,9 +1402,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).nheap_updates as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).nheap_updates) as usize - ptr as usize }, 24usize, concat!( "Offset of field: ", @@ -1037,9 +1412,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).quantization_time as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).quantization_time) as usize - ptr as usize }, 32usize, concat!( "Offset of field: ", @@ -1049,7 +1422,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).search_time as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).search_time) as usize - ptr as usize }, 40usize, concat!( "Offset of field: ", @@ -1123,11 +1496,7 @@ extern "C" { pub fn faiss_VectorTransform_d_out(arg1: *const FaissVectorTransform) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Perform training on a representative set of vectors"] - #[doc = ""] - #[doc = " @param vt opaque pointer to VectorTransform object"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param x training vectors, size n * d"] + #[doc = " Perform training on a representative set of vectors\n\n @param vt opaque pointer to VectorTransform object\n @param n nb of training vectors\n @param x training vectors, size n * d"] pub fn faiss_VectorTransform_train( vt: *mut FaissVectorTransform, n: idx_t, @@ -1135,9 +1504,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " apply the random rotation, return new allocated matrix"] - #[doc = " @param x size n * d_in"] - #[doc = " @return size n * d_out"] + #[doc = " apply the random rotation, return new allocated matrix\n @param x size n * d_in\n @return size n * d_out"] pub fn faiss_VectorTransform_apply( vt: *const FaissVectorTransform, n: idx_t, @@ -1145,9 +1512,7 @@ extern "C" { ) -> *mut f32; } extern "C" { - #[doc = " apply transformation and result is pre-allocated"] - #[doc = " @param x size n * d_in"] - #[doc = " @param xt size n * d_out"] + #[doc = " apply transformation and result is pre-allocated\n @param x size n * d_in\n @param xt size n * d_out"] pub fn faiss_VectorTransform_apply_noalloc( vt: *const FaissVectorTransform, n: idx_t, @@ -1156,8 +1521,7 @@ extern "C" { ); } extern "C" { - #[doc = " reverse transformation. May not be implemented or may return"] - #[doc = " approximate result"] + #[doc = " reverse transformation. May not be implemented or may return\n approximate result"] pub fn faiss_VectorTransform_reverse_transform( vt: *const FaissVectorTransform, n: idx_t, @@ -1170,8 +1534,7 @@ extern "C" { pub fn faiss_LinearTransform_free(obj: *mut FaissLinearTransform); } extern "C" { - #[doc = " compute x = A^T * (x - b)"] - #[doc = " is reverse transform if A has orthonormal lines"] + #[doc = " compute x = A^T * (x - b)\n is reverse transform if A has orthonormal lines"] pub fn faiss_LinearTransform_transform_transpose( vt: *const FaissLinearTransform, n: idx_t, @@ -1339,8 +1702,7 @@ extern "C" { ); } extern "C" { - #[doc = " Index that applies a LinearTransform transform on vectors before"] - #[doc = " handing them over to a sub-index"] + #[doc = " Index that applies a LinearTransform transform on vectors before\n handing them over to a sub-index"] pub fn faiss_IndexPreTransform_new( p_index: *mut *mut FaissIndexPreTransform, ) -> ::std::os::raw::c_int; @@ -1519,13 +1881,6 @@ extern "C" { precomputed_idx: *const idx_t, ) -> ::std::os::raw::c_int; } -extern "C" { - pub fn faiss_IndexIVFScalarQuantizer_train_residual( - index: *mut FaissIndexIVFScalarQuantizer, - n: idx_t, - x: *const f32, - ) -> ::std::os::raw::c_int; -} pub type FaissIndexShards = FaissIndex_H; extern "C" { pub fn faiss_IndexShards_free(obj: *mut FaissIndexShards); @@ -1553,425 +1908,204 @@ extern "C" { #[doc = " Index that concatenates the results from several sub-indexes"] pub fn faiss_IndexShards_new( p_index: *mut *mut FaissIndexShards, - d: idx_t, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_new_with_options( - p_index: *mut *mut FaissIndexShards, - d: idx_t, - threaded: ::std::os::raw::c_int, - successive_ids: ::std::os::raw::c_int, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_add_shard( - index: *mut FaissIndexShards, - shard: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_remove_shard( - index: *mut FaissIndexShards, - shard: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_at( - index: *mut FaissIndexShards, - i: ::std::os::raw::c_int, - ) -> *mut FaissIndex; -} -pub type FaissIndexIDMap = FaissIndex_H; -extern "C" { - pub fn faiss_IndexIDMap_own_fields(arg1: *const FaissIndexIDMap) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap_set_own_fields(arg1: *mut FaissIndexIDMap, arg2: ::std::os::raw::c_int); -} -extern "C" { - #[doc = " Index that translates search results to ids"] - pub fn faiss_IndexIDMap_new( - p_index: *mut *mut FaissIndexIDMap, - index: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap; -} -extern "C" { - #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_id_map output, the pointer to the beginning of `id_map`."] - #[doc = " @param p_size output, the current length of `id_map`."] - pub fn faiss_IndexIDMap_id_map( - index: *mut FaissIndexIDMap, - p_id_map: *mut *mut idx_t, - p_size: *mut usize, - ); -} -extern "C" { - #[doc = " get a pointer to the sub-index (the `index` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - pub fn faiss_IndexIDMap_sub_index(index: *mut FaissIndexIDMap) -> *mut FaissIndex; -} -pub type FaissIndexIDMap2 = FaissIndex_H; -extern "C" { - pub fn faiss_IndexIDMap2_own_fields(arg1: *const FaissIndexIDMap2) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap2_set_own_fields( - arg1: *mut FaissIndexIDMap2, - arg2: ::std::os::raw::c_int, - ); -} -extern "C" { - #[doc = " same as IndexIDMap but also provides an efficient reconstruction"] - #[doc = "implementation via a 2-way index"] - pub fn faiss_IndexIDMap2_new( - p_index: *mut *mut FaissIndexIDMap2, - index: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " make the rev_map from scratch"] - pub fn faiss_IndexIDMap2_construct_rev_map( - index: *mut FaissIndexIDMap2, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap2_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap2; -} -extern "C" { - #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_id_map output, the pointer to the beginning of `id_map`."] - #[doc = " @param p_size output, the current length of `id_map`."] - pub fn faiss_IndexIDMap2_id_map( - index: *mut FaissIndexIDMap2, - p_id_map: *mut *mut idx_t, - p_size: *mut usize, - ); -} -extern "C" { - #[doc = " get a pointer to the sub-index (the `index` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - pub fn faiss_IndexIDMap2_sub_index(index: *mut FaissIndexIDMap2) -> *mut FaissIndex; -} -pub type FILE = [u64; 27usize]; -extern "C" { - #[doc = " Clone an index. This is equivalent to `faiss::clone_index`"] - pub fn faiss_clone_index( - arg1: *const FaissIndex, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -#[doc = " No error"] -pub const FaissErrorCode_OK: FaissErrorCode = 0; -#[doc = " Any exception other than Faiss or standard C++ library exceptions"] -pub const FaissErrorCode_UNKNOWN_EXCEPT: FaissErrorCode = -1; -#[doc = " Faiss library exception"] -pub const FaissErrorCode_FAISS_EXCEPT: FaissErrorCode = -2; -#[doc = " Standard C++ library exception"] -pub const FaissErrorCode_STD_EXCEPT: FaissErrorCode = -4; -#[doc = " An error code which depends on the exception thrown from the previous"] -#[doc = " operation. See `faiss_get_last_error` to retrieve the error message."] -pub type FaissErrorCode = ::std::os::raw::c_int; -extern "C" { - #[doc = " Get the error message of the last failed operation performed by Faiss."] - #[doc = " The given pointer is only invalid until another Faiss function is"] - #[doc = " called."] - pub fn faiss_get_last_error() -> *const ::std::os::raw::c_char; -} -extern "C" { - pub fn faiss_RangeSearchResult_nq(arg1: *const FaissRangeSearchResult) -> usize; -} -extern "C" { - pub fn faiss_RangeSearchResult_new( - p_rsr: *mut *mut FaissRangeSearchResult, - nq: idx_t, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_RangeSearchResult_new_with( - p_rsr: *mut *mut FaissRangeSearchResult, - nq: idx_t, - alloc_lims: ::std::os::raw::c_int, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " called when lims contains the nb of elements result entries"] - #[doc = " for each query"] - pub fn faiss_RangeSearchResult_do_allocation( - rsr: *mut FaissRangeSearchResult, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_RangeSearchResult_free(obj: *mut FaissRangeSearchResult); -} -extern "C" { - pub fn faiss_RangeSearchResult_buffer_size(arg1: *const FaissRangeSearchResult) -> usize; -} -extern "C" { - #[doc = " getter for lims: size (nq + 1)"] - pub fn faiss_RangeSearchResult_lims(rsr: *mut FaissRangeSearchResult, lims: *mut *mut usize); -} -extern "C" { - #[doc = " getter for labels and respective distances (not sorted):"] - #[doc = " result for query i is labels[lims[i]:lims[i+1]]"] - pub fn faiss_RangeSearchResult_labels( - rsr: *mut FaissRangeSearchResult, - labels: *mut *mut idx_t, - distances: *mut *mut f32, - ); -} -extern "C" { - pub fn faiss_IDSelector_free(obj: *mut FaissIDSelector); -} -extern "C" { - #[doc = " Encapsulates a set of ids to remove."] - pub fn faiss_IDSelector_is_member( - sel: *const FaissIDSelector, - id: idx_t, - ) -> ::std::os::raw::c_int; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissIDSelectorRange_H { - _unused: [u8; 0], -} -pub type FaissIDSelectorRange = FaissIDSelectorRange_H; -extern "C" { - pub fn faiss_IDSelectorRange_free(obj: *mut FaissIDSelectorRange); -} -extern "C" { - pub fn faiss_IDSelectorRange_imin(arg1: *const FaissIDSelectorRange) -> idx_t; -} -extern "C" { - pub fn faiss_IDSelectorRange_imax(arg1: *const FaissIDSelectorRange) -> idx_t; -} -extern "C" { - #[doc = " remove ids between [imni, imax)"] - pub fn faiss_IDSelectorRange_new( - p_sel: *mut *mut FaissIDSelectorRange, - imin: idx_t, - imax: idx_t, - ) -> ::std::os::raw::c_int; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissIDSelectorBatch_H { - _unused: [u8; 0], + d: idx_t, + ) -> ::std::os::raw::c_int; } -pub type FaissIDSelectorBatch = FaissIDSelectorBatch_H; extern "C" { - pub fn faiss_IDSelectorBatch_nbits(arg1: *const FaissIDSelectorBatch) -> ::std::os::raw::c_int; + pub fn faiss_IndexShards_new_with_options( + p_index: *mut *mut FaissIndexShards, + d: idx_t, + threaded: ::std::os::raw::c_int, + successive_ids: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IDSelectorBatch_mask(arg1: *const FaissIDSelectorBatch) -> idx_t; + pub fn faiss_IndexShards_add_shard( + index: *mut FaissIndexShards, + shard: *mut FaissIndex, + ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Remove ids from a set. Repetitions of ids in the indices set"] - #[doc = " passed to the constructor does not hurt performance. The hash"] - #[doc = " function used for the bloom filter and GCC's implementation of"] - #[doc = " unordered_set are just the least significant bits of the id. This"] - #[doc = " works fine for random ids or ids in sequences but will produce many"] - #[doc = " hash collisions if lsb's are always the same"] - pub fn faiss_IDSelectorBatch_new( - p_sel: *mut *mut FaissIDSelectorBatch, - n: usize, - indices: *const idx_t, + pub fn faiss_IndexShards_remove_shard( + index: *mut FaissIndexShards, + shard: *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissBufferList_H { - _unused: [u8; 0], +extern "C" { + pub fn faiss_IndexShards_at( + index: *mut FaissIndexShards, + i: ::std::os::raw::c_int, + ) -> *mut FaissIndex; } -pub type FaissBufferList = FaissBufferList_H; +pub type FaissIndexIDMap = FaissIndex_H; extern "C" { - pub fn faiss_BufferList_free(obj: *mut FaissBufferList); + pub fn faiss_IndexIDMap_own_fields(arg1: *const FaissIndexIDMap) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_BufferList_buffer_size(arg1: *const FaissBufferList) -> usize; + pub fn faiss_IndexIDMap_set_own_fields(arg1: *mut FaissIndexIDMap, arg2: ::std::os::raw::c_int); } extern "C" { - pub fn faiss_BufferList_wp(arg1: *const FaissBufferList) -> usize; + #[doc = " Index that translates search results to ids"] + pub fn faiss_IndexIDMap_new( + p_index: *mut *mut FaissIndexIDMap, + index: *mut FaissIndex, + ) -> ::std::os::raw::c_int; } -#[doc = " List of temporary buffers used to store results before they are"] -#[doc = " copied to the RangeSearchResult object."] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissBuffer { - pub ids: *mut idx_t, - pub dis: *mut f32, +extern "C" { + pub fn faiss_IndexIDMap_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap; } -#[test] -fn bindgen_test_layout_FaissBuffer() { - assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(FaissBuffer)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(FaissBuffer)) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).ids as *const _ as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(FaissBuffer), - "::", - stringify!(ids) - ) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).dis as *const _ as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(FaissBuffer), - "::", - stringify!(dis) - ) +extern "C" { + #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object\n @param p_id_map output, the pointer to the beginning of `id_map`.\n @param p_size output, the current length of `id_map`."] + pub fn faiss_IndexIDMap_id_map( + index: *mut FaissIndexIDMap, + p_id_map: *mut *mut idx_t, + p_size: *mut usize, ); } extern "C" { - pub fn faiss_BufferList_append_buffer(bl: *mut FaissBufferList) -> ::std::os::raw::c_int; + #[doc = " get a pointer to the sub-index (the `index` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object"] + pub fn faiss_IndexIDMap_sub_index(index: *mut FaissIndexIDMap) -> *mut FaissIndex; } +pub type FaissIndexIDMap2 = FaissIndex_H; extern "C" { - pub fn faiss_BufferList_new( - p_bl: *mut *mut FaissBufferList, - buffer_size: usize, - ) -> ::std::os::raw::c_int; + pub fn faiss_IndexIDMap2_own_fields(arg1: *const FaissIndexIDMap2) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_BufferList_add( - bl: *mut FaissBufferList, - id: idx_t, - dis: f32, - ) -> ::std::os::raw::c_int; + pub fn faiss_IndexIDMap2_set_own_fields( + arg1: *mut FaissIndexIDMap2, + arg2: ::std::os::raw::c_int, + ); } extern "C" { - #[doc = " copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to"] - #[doc = " tables dest_ids, dest_dis"] - pub fn faiss_BufferList_copy_range( - bl: *mut FaissBufferList, - ofs: usize, - n: usize, - dest_ids: *mut idx_t, - dest_dis: *mut f32, + #[doc = " same as IndexIDMap but also provides an efficient reconstruction\nimplementation via a 2-way index"] + pub fn faiss_IndexIDMap2_new( + p_index: *mut *mut FaissIndexIDMap2, + index: *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissRangeSearchPartialResult_H { - _unused: [u8; 0], +extern "C" { + #[doc = " make the rev_map from scratch"] + pub fn faiss_IndexIDMap2_construct_rev_map( + index: *mut FaissIndexIDMap2, + ) -> ::std::os::raw::c_int; } -pub type FaissRangeSearchPartialResult = FaissRangeSearchPartialResult_H; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissRangeQueryResult_H { - _unused: [u8; 0], +extern "C" { + pub fn faiss_IndexIDMap2_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap2; } -pub type FaissRangeQueryResult = FaissRangeQueryResult_H; extern "C" { - pub fn faiss_RangeQueryResult_qno(arg1: *const FaissRangeQueryResult) -> idx_t; + #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object\n @param p_id_map output, the pointer to the beginning of `id_map`.\n @param p_size output, the current length of `id_map`."] + pub fn faiss_IndexIDMap2_id_map( + index: *mut FaissIndexIDMap2, + p_id_map: *mut *mut idx_t, + p_size: *mut usize, + ); } extern "C" { - pub fn faiss_RangeQueryResult_nres(arg1: *const FaissRangeQueryResult) -> usize; + #[doc = " get a pointer to the sub-index (the `index` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object"] + pub fn faiss_IndexIDMap2_sub_index(index: *mut FaissIndexIDMap2) -> *mut FaissIndex; } +pub type FILE = [u64; 27usize]; extern "C" { - pub fn faiss_RangeQueryResult_pres( - arg1: *const FaissRangeQueryResult, - ) -> *mut FaissRangeSearchPartialResult; + #[doc = " Clone an index. This is equivalent to `faiss::clone_index`"] + pub fn faiss_clone_index( + arg1: *const FaissIndex, + p_out: *mut *mut FaissIndex, + ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " result structure for a single query"] - pub fn faiss_RangeQueryResult_add( - qr: *mut FaissRangeQueryResult, - dis: f32, - id: idx_t, + #[doc = " Clone a binary index. This is equivalent to `faiss::clone_index_binary`"] + pub fn faiss_clone_index_binary( + arg1: *const FaissIndexBinary, + p_out: *mut *mut FaissIndexBinary, ) -> ::std::os::raw::c_int; } +#[doc = " No error"] +pub const FaissErrorCode_OK: FaissErrorCode = 0; +#[doc = " Any exception other than Faiss or standard C++ library exceptions"] +pub const FaissErrorCode_UNKNOWN_EXCEPT: FaissErrorCode = -1; +#[doc = " Faiss library exception"] +pub const FaissErrorCode_FAISS_EXCEPT: FaissErrorCode = -2; +#[doc = " Standard C++ library exception"] +pub const FaissErrorCode_STD_EXCEPT: FaissErrorCode = -4; +#[doc = " An error code which depends on the exception thrown from the previous\n operation. See `faiss_get_last_error` to retrieve the error message."] +pub type FaissErrorCode = ::std::os::raw::c_int; extern "C" { - pub fn faiss_RangeSearchPartialResult_res( - arg1: *const FaissRangeSearchPartialResult, - ) -> *mut FaissRangeSearchResult; + #[doc = " Get the error message of the last failed operation performed by Faiss.\n The given pointer is only invalid until another Faiss function is\n called."] + pub fn faiss_get_last_error() -> *const ::std::os::raw::c_char; } extern "C" { - pub fn faiss_RangeSearchPartialResult_new( - p_res: *mut *mut FaissRangeSearchPartialResult, - res_in: *mut FaissRangeSearchResult, + #[doc = " Build an index with the sequence of processing steps described in\n the string."] + pub fn faiss_index_factory( + p_index: *mut *mut FaissIndex, + d: ::std::os::raw::c_int, + description: *const ::std::os::raw::c_char, + metric: FaissMetricType, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_RangeSearchPartialResult_finalize( - res: *mut FaissRangeSearchPartialResult, + #[doc = " Build a binary index with the sequence of processing steps described in\n the string."] + pub fn faiss_index_binary_factory( + p_index: *mut *mut FaissIndexBinary, + d: ::std::os::raw::c_int, + description: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " called by range_search before do_allocation"] - pub fn faiss_RangeSearchPartialResult_set_lims( - res: *mut FaissRangeSearchPartialResult, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index` when a file descriptor is\n provided."] + pub fn faiss_write_index(idx: *const FaissIndex, f: *mut FILE) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index` when a file path is provided."] + pub fn faiss_write_index_fname( + idx: *const FaissIndex, + fname: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_RangeSearchPartialResult_new_result( - res: *mut FaissRangeSearchPartialResult, - qno: idx_t, - qr: *mut *mut FaissRangeQueryResult, + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index` when a file descriptor is given."] + pub fn faiss_read_index( + f: *mut FILE, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissDistanceComputer_H { - _unused: [u8; 0], +extern "C" { + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index` when a file path is given."] + pub fn faiss_read_index_fname( + fname: *const ::std::os::raw::c_char, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndex, + ) -> ::std::os::raw::c_int; } -pub type FaissDistanceComputer = FaissDistanceComputer_H; extern "C" { - #[doc = " called before computing distances"] - pub fn faiss_DistanceComputer_set_query( - dc: *mut FaissDistanceComputer, - x: *const f32, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index_binary` when a file descriptor is\n provided."] + pub fn faiss_write_index_binary( + idx: *const FaissIndexBinary, + f: *mut FILE, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Compute distance of vector i to current query."] - #[doc = " This function corresponds to the function call operator:"] - #[doc = " DistanceComputer::operator()"] - pub fn faiss_DistanceComputer_vector_to_query_dis( - dc: *mut FaissDistanceComputer, - i: idx_t, - qd: *mut f32, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index_binary` when a file path is\n provided."] + pub fn faiss_write_index_binary_fname( + idx: *const FaissIndexBinary, + fname: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " compute distance between two stored vectors"] - pub fn faiss_DistanceComputer_symmetric_dis( - dc: *mut FaissDistanceComputer, - i: idx_t, - j: idx_t, - vd: *mut f32, + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index_binary` when a file descriptor is\n given."] + pub fn faiss_read_index_binary( + f: *mut FILE, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndexBinary, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_DistanceComputer_free(obj: *mut FaissDistanceComputer); + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index_binary` when a file path is given."] + pub fn faiss_read_index_binary_fname( + fname: *const ::std::os::raw::c_char, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndexBinary, + ) -> ::std::os::raw::c_int; } extern "C" { #[doc = " Compute pairwise distances between sets of vectors"] @@ -1988,11 +2122,7 @@ extern "C" { ); } extern "C" { - #[doc = " Compute pairwise distances between sets of vectors"] - #[doc = " arguments from \"faiss_pairwise_L2sqr\""] - #[doc = " ldq equal -1 by default"] - #[doc = " ldb equal -1 by default"] - #[doc = " ldd equal -1 by default"] + #[doc = " Compute pairwise distances between sets of vectors\n arguments from \"faiss_pairwise_L2sqr\"\n ldq equal -1 by default\n ldb equal -1 by default\n ldd equal -1 by default"] pub fn faiss_pairwise_L2sqr_with_defaults( d: i64, nq: i64, @@ -2033,13 +2163,11 @@ extern "C" { pub fn faiss_fvec_renorm_L2(d: usize, nx: usize, x: *mut f32); } extern "C" { - #[doc = " Setter of threshold value on nx above which we switch to BLAS to compute"] - #[doc = " distances"] + #[doc = " Setter of threshold value on nx above which we switch to BLAS to compute\n distances"] pub fn faiss_set_distance_compute_blas_threshold(value: ::std::os::raw::c_int); } extern "C" { - #[doc = " Getter of threshold value on nx above which we switch to BLAS to compute"] - #[doc = " distances"] + #[doc = " Getter of threshold value on nx above which we switch to BLAS to compute\n distances"] pub fn faiss_get_distance_compute_blas_threshold() -> ::std::os::raw::c_int; } extern "C" { @@ -2059,54 +2187,10 @@ extern "C" { pub fn faiss_get_distance_compute_blas_database_bs() -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Setter of number of results we switch to a reservoir to collect results"] - #[doc = " rather than a heap"] + #[doc = " Setter of number of results we switch to a reservoir to collect results\n rather than a heap"] pub fn faiss_set_distance_compute_min_k_reservoir(value: ::std::os::raw::c_int); } extern "C" { - #[doc = " Getter of number of results we switch to a reservoir to collect results"] - #[doc = " rather than a heap"] + #[doc = " Getter of number of results we switch to a reservoir to collect results\n rather than a heap"] pub fn faiss_get_distance_compute_min_k_reservoir() -> ::std::os::raw::c_int; } -extern "C" { - #[doc = " Build and index with the sequence of processing steps described in"] - #[doc = " the string."] - pub fn faiss_index_factory( - p_index: *mut *mut FaissIndex, - d: ::std::os::raw::c_int, - description: *const ::std::os::raw::c_char, - metric: FaissMetricType, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Write index to a file."] - #[doc = " This is equivalent to `faiss::write_index` when a file descriptor is"] - #[doc = " provided."] - pub fn faiss_write_index(idx: *const FaissIndex, f: *mut FILE) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Write index to a file."] - #[doc = " This is equivalent to `faiss::write_index` when a file path is provided."] - pub fn faiss_write_index_fname( - idx: *const FaissIndex, - fname: *const ::std::os::raw::c_char, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Read index from a file."] - #[doc = " This is equivalent to `faiss:read_index` when a file descriptor is given."] - pub fn faiss_read_index( - f: *mut FILE, - io_flags: ::std::os::raw::c_int, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Read index from a file."] - #[doc = " This is equivalent to `faiss:read_index` when a file path is given."] - pub fn faiss_read_index_fname( - fname: *const ::std::os::raw::c_char, - io_flags: ::std::os::raw::c_int, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} diff --git a/faiss-sys/src/bindings_gpu.rs b/faiss-sys/src/bindings_gpu.rs index b6d2fe0..84202a3 100644 --- a/faiss-sys/src/bindings_gpu.rs +++ b/faiss-sys/src/bindings_gpu.rs @@ -1,6 +1,5 @@ -/* automatically generated by rust-bindgen 0.59.2 */ +/* automatically generated by rust-bindgen 0.69.4 */ -pub type __int64_t = ::std::os::raw::c_long; pub type faiss_idx_t = i64; pub type idx_t = faiss_idx_t; #[repr(C)] @@ -31,11 +30,25 @@ pub const FaissMetricType_METRIC_Canberra: FaissMetricType = 20; pub const FaissMetricType_METRIC_BrayCurtis: FaissMetricType = 21; #[doc = " some additional metrics defined in scipy.spatial.distance"] pub const FaissMetricType_METRIC_JensenShannon: FaissMetricType = 22; -#[doc = " Some algorithms support both an inner product version and a L2 search"] -#[doc = " version."] +#[doc = " Some algorithms support both an inner product version and a L2 search\n version."] pub type FaissMetricType = ::std::os::raw::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] +pub struct FaissSearchParameters_H { + _unused: [u8; 0], +} +pub type FaissSearchParameters = FaissSearchParameters_H; +extern "C" { + pub fn faiss_SearchParameters_free(obj: *mut FaissSearchParameters); +} +extern "C" { + pub fn faiss_SearchParameters_new( + p_sp: *mut *mut FaissSearchParameters, + sel: *mut FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct FaissIndex_H { _unused: [u8; 0], } @@ -62,11 +75,7 @@ extern "C" { pub fn faiss_Index_set_verbose(arg1: *mut FaissIndex, arg2: ::std::os::raw::c_int); } extern "C" { - #[doc = " Perform training on a representative set of vectors"] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param x training vectors, size n * d"] + #[doc = " Perform training on a representative set of vectors\n\n @param index opaque pointer to index object\n @param n nb of training vectors\n @param x training vectors, size n * d"] pub fn faiss_Index_train( index: *mut FaissIndex, n: idx_t, @@ -74,13 +83,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Add n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " Vectors are implicitly assigned labels ntotal .. ntotal + n - 1"] - #[doc = " This function slices the input vectors in chunks smaller than"] - #[doc = " blocksize_add and calls add_core."] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input matrix, size n * d"] + #[doc = " Add n vectors of dimension d to the index.\n\n Vectors are implicitly assigned labels ntotal .. ntotal + n - 1\n This function slices the input vectors in chunks smaller than\n blocksize_add and calls add_core.\n @param index opaque pointer to index object\n @param x input matrix, size n * d"] pub fn faiss_Index_add( index: *mut FaissIndex, n: idx_t, @@ -88,13 +91,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Same as add, but stores xids instead of sequential ids."] - #[doc = ""] - #[doc = " The default implementation fails with an assertion, as it is"] - #[doc = " not supported by all indexes."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param xids if non-null, ids to store for the vectors (size n)"] + #[doc = " Same as add, but stores xids instead of sequential ids.\n\n The default implementation fails with an assertion, as it is\n not supported by all indexes.\n\n @param index opaque pointer to index object\n @param xids if non-null, ids to store for the vectors (size n)"] pub fn faiss_Index_add_with_ids( index: *mut FaissIndex, n: idx_t, @@ -103,15 +100,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " query n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " return at most k vectors. If there are not enough results for a"] - #[doc = " query, the result array is padded with -1s."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param labels output labels of the NNs, size n*k"] - #[doc = " @param distances output pairwise distances, size n*k"] + #[doc = " query n vectors of dimension d to the index.\n\n return at most k vectors. If there are not enough results for a\n query, the result array is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] pub fn faiss_Index_search( index: *const FaissIndex, n: idx_t, @@ -122,16 +111,19 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " query n vectors of dimension d to the index."] - #[doc = ""] - #[doc = " return all vectors with distance < radius. Note that many"] - #[doc = " indexes do not implement the range_search (only the k-NN search"] - #[doc = " is mandatory)."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param radius search radius"] - #[doc = " @param result result table"] + #[doc = " query n vectors of dimension d with search parameters to the index.\n\n return at most k vectors. If there are not enough results for a query,\n the result is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param params input params to modify how search is done\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] + pub fn faiss_Index_search_with_params( + index: *const FaissIndex, + n: idx_t, + x: *const f32, + k: idx_t, + params: *const FaissSearchParameters, + distances: *mut f32, + labels: *mut idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return all vectors with distance < radius. Note that many\n indexes do not implement the range_search (only the k-NN search\n is mandatory).\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param radius search radius\n @param result result table"] pub fn faiss_Index_range_search( index: *const FaissIndex, n: idx_t, @@ -141,12 +133,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " return the indexes of the k vectors closest to the query x."] - #[doc = ""] - #[doc = " This function is identical as search but only return labels of neighbors."] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vectors to search, size n * d"] - #[doc = " @param labels output labels of the NNs, size n*k"] + #[doc = " return the indexes of the k vectors closest to the query x.\n\n This function is identical as search but only return labels of neighbors.\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k"] pub fn faiss_Index_assign( index: *mut FaissIndex, n: idx_t, @@ -156,14 +143,11 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " removes all elements from the database."] - #[doc = " @param index opaque pointer to index object"] + #[doc = " removes all elements from the database.\n @param index opaque pointer to index object"] pub fn faiss_Index_reset(index: *mut FaissIndex) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " removes IDs from the index. Not supported by all indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param nremove output for the number of IDs removed"] + #[doc = " removes IDs from the index. Not supported by all indexes\n @param index opaque pointer to index object\n @param nremove output for the number of IDs removed"] pub fn faiss_Index_remove_ids( index: *mut FaissIndex, sel: *const FaissIDSelector, @@ -171,12 +155,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)"] - #[doc = ""] - #[doc = " this function may not be defined for some indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param key id of the vector to reconstruct"] - #[doc = " @param recons reconstructed vector (size d)"] + #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param key id of the vector to reconstruct\n @param recons reconstructed vector (size d)"] pub fn faiss_Index_reconstruct( index: *const FaissIndex, key: idx_t, @@ -184,11 +163,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Reconstruct vectors i0 to i0 + ni - 1"] - #[doc = ""] - #[doc = " this function may not be defined for some indexes"] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param recons reconstructed vector (size ni * d)"] + #[doc = " Reconstruct vectors i0 to i0 + ni - 1\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param recons reconstructed vector (size ni * d)"] pub fn faiss_Index_reconstruct_n( index: *const FaissIndex, i0: idx_t, @@ -197,17 +172,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Computes a residual vector after indexing encoding."] - #[doc = ""] - #[doc = " The residual vector is the difference between a vector and the"] - #[doc = " reconstruction that can be decoded from its representation in"] - #[doc = " the index. The residual can be used for multiple-stage indexing"] - #[doc = " methods, like IndexIVF's methods."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x input vector, size d"] - #[doc = " @param residual output residual vector, size d"] - #[doc = " @param key encoded index, as returned by search and assign"] + #[doc = " Computes a residual vector after indexing encoding.\n\n The residual vector is the difference between a vector and the\n reconstruction that can be decoded from its representation in\n the index. The residual can be used for multiple-stage indexing\n methods, like IndexIVF's methods.\n\n @param index opaque pointer to index object\n @param x input vector, size d\n @param residual output residual vector, size d\n @param key encoded index, as returned by search and assign"] pub fn faiss_Index_compute_residual( index: *const FaissIndex, x: *const f32, @@ -216,18 +181,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Computes a residual vector after indexing encoding."] - #[doc = ""] - #[doc = " The residual vector is the difference between a vector and the"] - #[doc = " reconstruction that can be decoded from its representation in"] - #[doc = " the index. The residual can be used for multiple-stage indexing"] - #[doc = " methods, like IndexIVF's methods."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param n number of vectors"] - #[doc = " @param x input vector, size (n x d)"] - #[doc = " @param residuals output residual vectors, size (n x d)"] - #[doc = " @param keys encoded index, as returned by search and assign"] + #[doc = " Computes a residual vector after indexing encoding.\n\n The residual vector is the difference between a vector and the\n reconstruction that can be decoded from its representation in\n the index. The residual can be used for multiple-stage indexing\n methods, like IndexIVF's methods.\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param x input vector, size (n x d)\n @param residuals output residual vectors, size (n x d)\n @param keys encoded index, as returned by search and assign"] pub fn faiss_Index_compute_residual_n( index: *const FaissIndex, n: idx_t, @@ -236,6 +190,31 @@ extern "C" { keys: *const idx_t, ) -> ::std::os::raw::c_int; } +extern "C" { + #[doc = " The size of the produced codes in bytes.\n\n @param index opaque pointer to index object\n @param size the returned size in bytes"] + pub fn faiss_Index_sa_code_size( + index: *const FaissIndex, + size: *mut usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " encode a set of vectors\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param x input vectors, size n * d\n @param bytes output encoded vectors, size n * sa_code_size()"] + pub fn faiss_Index_sa_encode( + index: *const FaissIndex, + n: idx_t, + x: *const f32, + bytes: *mut u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " decode a set of vectors\n\n @param index opaque pointer to index object\n @param n number of vectors\n @param bytes input encoded vectors, size n * sa_code_size()\n @param x output vectors, size n * d"] + pub fn faiss_Index_sa_decode( + index: *const FaissIndex, + n: idx_t, + bytes: *const u8, + x: *mut f32, + ) -> ::std::os::raw::c_int; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct FaissParameterRange_H { @@ -248,8 +227,7 @@ extern "C" { ) -> *const ::std::os::raw::c_char; } extern "C" { - #[doc = " Getter for the values in the range. The output values are invalidated"] - #[doc = " upon any other modification of the range."] + #[doc = " Getter for the values in the range. The output values are invalidated\n upon any other modification of the range."] pub fn faiss_ParameterRange_values( arg1: *mut FaissParameterRange, arg2: *mut *mut f64, @@ -274,9 +252,7 @@ extern "C" { pub fn faiss_ParameterSpace_n_combinations(arg1: *const FaissParameterSpace) -> usize; } extern "C" { - #[doc = " get string representation of the combination"] - #[doc = " by writing it to the given character buffer."] - #[doc = " A buffer size of 1000 ensures that the full name is collected."] + #[doc = " get string representation of the combination\n by writing it to the given character buffer.\n A buffer size of 1000 ensures that the full name is collected."] pub fn faiss_ParameterSpace_combination_name( arg1: *const FaissParameterSpace, arg2: usize, @@ -321,8 +297,7 @@ extern "C" { arg3: *mut *mut FaissParameterRange, ) -> ::std::os::raw::c_int; } -#[doc = " Class for the clustering parameters. Can be passed to the"] -#[doc = " constructor of the Clustering object."] +#[doc = " Class for the clustering parameters. Can be passed to the\n constructor of the Clustering object."] #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct FaissClusteringParameters { @@ -338,8 +313,7 @@ pub struct FaissClusteringParameters { pub int_centroids: ::std::os::raw::c_int, #[doc = "< (bool) update index after each iteration?"] pub update_index: ::std::os::raw::c_int, - #[doc = "< (bool) use the centroids provided as input and do"] - #[doc = "< not change them during iterations"] + #[doc = "< (bool) use the centroids provided as input and do\n< not change them during iterations"] pub frozen_centroids: ::std::os::raw::c_int, #[doc = "< otherwise you get a warning"] pub min_points_per_centroid: ::std::os::raw::c_int, @@ -352,6 +326,9 @@ pub struct FaissClusteringParameters { } #[test] fn bindgen_test_layout_FaissClusteringParameters() { + const UNINIT: ::std::mem::MaybeUninit = + ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); assert_eq!( ::std::mem::size_of::(), 48usize, @@ -363,7 +340,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { concat!("Alignment of ", stringify!(FaissClusteringParameters)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).niter as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).niter) as usize - ptr as usize }, 0usize, concat!( "Offset of field: ", @@ -373,7 +350,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nredo as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nredo) as usize - ptr as usize }, 4usize, concat!( "Offset of field: ", @@ -383,9 +360,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).verbose as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).verbose) as usize - ptr as usize }, 8usize, concat!( "Offset of field: ", @@ -395,9 +370,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).spherical as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).spherical) as usize - ptr as usize }, 12usize, concat!( "Offset of field: ", @@ -407,9 +380,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).int_centroids as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).int_centroids) as usize - ptr as usize }, 16usize, concat!( "Offset of field: ", @@ -419,9 +390,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).update_index as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).update_index) as usize - ptr as usize }, 20usize, concat!( "Offset of field: ", @@ -431,10 +400,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).frozen_centroids as *const _ - as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).frozen_centroids) as usize - ptr as usize }, 24usize, concat!( "Offset of field: ", @@ -444,10 +410,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).min_points_per_centroid - as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).min_points_per_centroid) as usize - ptr as usize }, 28usize, concat!( "Offset of field: ", @@ -457,10 +420,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).max_points_per_centroid - as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).max_points_per_centroid) as usize - ptr as usize }, 32usize, concat!( "Offset of field: ", @@ -470,7 +430,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).seed as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).seed) as usize - ptr as usize }, 36usize, concat!( "Offset of field: ", @@ -480,10 +440,7 @@ fn bindgen_test_layout_FaissClusteringParameters() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).decode_block_size as *const _ - as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).decode_block_size) as usize - ptr as usize }, 40usize, concat!( "Offset of field: ", @@ -618,15 +575,7 @@ extern "C" { pub fn faiss_Clustering_free(clustering: *mut FaissClustering); } extern "C" { - #[doc = " simplified interface"] - #[doc = ""] - #[doc = " @param d dimension of the data"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param k nb of output centroids"] - #[doc = " @param x training set (size n * d)"] - #[doc = " @param centroids output centroids (size k * d)"] - #[doc = " @param q_error final quantization error"] - #[doc = " @return error code"] + #[doc = " simplified interface\n\n @param d dimension of the data\n @param n nb of training vectors\n @param k nb of output centroids\n @param x training set (size n * d)\n @param centroids output centroids (size k * d)\n @param q_error final quantization error\n @return error code"] pub fn faiss_kmeans_clustering( d: usize, n: usize, @@ -636,6 +585,118 @@ extern "C" { q_error: *mut f32, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIndexBinary_H { + _unused: [u8; 0], +} +pub type FaissIndexBinary = FaissIndexBinary_H; +extern "C" { + pub fn faiss_IndexBinary_free(obj: *mut FaissIndexBinary); +} +extern "C" { + pub fn faiss_IndexBinary_d(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_is_trained(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_ntotal(arg1: *const FaissIndexBinary) -> idx_t; +} +extern "C" { + pub fn faiss_IndexBinary_metric_type(arg1: *const FaissIndexBinary) -> FaissMetricType; +} +extern "C" { + pub fn faiss_IndexBinary_verbose(arg1: *const FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexBinary_set_verbose(arg1: *mut FaissIndexBinary, arg2: ::std::os::raw::c_int); +} +extern "C" { + #[doc = " Perform training on a representative set of vectors\n\n @param index opaque pointer to index object\n @param n nb of training vectors\n @param x training vectors, size n * d"] + pub fn faiss_IndexBinary_train( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Add n vectors of dimension d to the index.\n\n Vectors are implicitly assigned labels ntotal .. ntotal + n - 1\n This function slices the input vectors in chunks smaller than\n blocksize_add and calls add_core.\n @param index opaque pointer to index object\n @param x input matrix, size n * d"] + pub fn faiss_IndexBinary_add( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Same as add, but stores xids instead of sequential ids.\n\n The default implementation fails with an assertion, as it is\n not supported by all indexes.\n\n @param index opaque pointer to index object\n @param xids if non-null, ids to store for the vectors (size n)"] + pub fn faiss_IndexBinary_add_with_ids( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + xids: *const idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return at most k vectors. If there are not enough results for a\n query, the result array is padded with -1s.\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k\n @param distances output pairwise distances, size n*k"] + pub fn faiss_IndexBinary_search( + index: *const FaissIndexBinary, + n: idx_t, + x: *const u8, + k: idx_t, + distances: *mut i32, + labels: *mut idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " query n vectors of dimension d to the index.\n\n return all vectors with distance < radius. Note that many\n indexes do not implement the range_search (only the k-NN search\n is mandatory).\n\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param radius search radius\n @param result result table"] + pub fn faiss_IndexBinary_range_search( + index: *const FaissIndexBinary, + n: idx_t, + x: *const u8, + radius: ::std::os::raw::c_int, + result: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " return the indexes of the k vectors closest to the query x.\n\n This function is identical as search but only return labels of neighbors.\n @param index opaque pointer to index object\n @param x input vectors to search, size n * d\n @param labels output labels of the NNs, size n*k"] + pub fn faiss_IndexBinary_assign( + index: *mut FaissIndexBinary, + n: idx_t, + x: *const u8, + labels: *mut idx_t, + k: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " removes all elements from the database.\n @param index opaque pointer to index object"] + pub fn faiss_IndexBinary_reset(index: *mut FaissIndexBinary) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " removes IDs from the index. Not supported by all indexes\n @param index opaque pointer to index object\n @param nremove output for the number of IDs removed"] + pub fn faiss_IndexBinary_remove_ids( + index: *mut FaissIndexBinary, + sel: *const FaissIDSelector, + n_removed: *mut usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Reconstruct a stored vector (or an approximation if lossy coding)\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param key id of the vector to reconstruct\n @param recons reconstructed vector (size d)"] + pub fn faiss_IndexBinary_reconstruct( + index: *const FaissIndexBinary, + key: idx_t, + recons: *mut u8, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Reconstruct vectors i0 to i0 + ni - 1\n\n this function may not be defined for some indexes\n @param index opaque pointer to index object\n @param recons reconstructed vector (size ni * d)"] + pub fn faiss_IndexBinary_reconstruct_n( + index: *const FaissIndexBinary, + i0: idx_t, + ni: idx_t, + recons: *mut u8, + ) -> ::std::os::raw::c_int; +} pub type FaissIndexFlat = FaissIndex_H; extern "C" { #[doc = " Opaque type for IndexFlat"] @@ -649,12 +710,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " get a pointer to the index's internal data (the `xb` field). The outputs"] - #[doc = " become invalid after any data addition or removal operation."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_xb output, the pointer to the beginning of `xb`."] - #[doc = " @param p_size output, the current size of `sb` in number of float values."] + #[doc = " get a pointer to the index's internal data (the `xb` field). The outputs\n become invalid after any data addition or removal operation.\n\n @param index opaque pointer to index object\n @param p_xb output, the pointer to the beginning of `xb`.\n @param p_size output, the current size of `sb` in number of float values."] pub fn faiss_IndexFlat_xb(index: *mut FaissIndexFlat, p_xb: *mut *mut f32, p_size: *mut usize); } extern "C" { @@ -664,14 +720,7 @@ extern "C" { pub fn faiss_IndexFlat_free(obj: *mut FaissIndexFlat); } extern "C" { - #[doc = " compute distance with a subset of vectors"] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param x query vectors, size n * d"] - #[doc = " @param labels indices of the vectors that should be compared"] - #[doc = " for each query vector, size n * k"] - #[doc = " @param distances"] - #[doc = " corresponding output distances, size n * k"] + #[doc = " compute distance with a subset of vectors\n\n @param index opaque pointer to index object\n @param x query vectors, size n * d\n @param labels indices of the vectors that should be compared\n for each query vector, size n * k\n @param distances\n corresponding output distances, size n * k"] pub fn faiss_IndexFlat_compute_distance_subset( index: *mut FaissIndex, n: idx_t, @@ -717,10 +766,7 @@ extern "C" { } pub type FaissIndexRefineFlat = FaissIndex_H; extern "C" { - #[doc = " Opaque type for IndexRefineFlat"] - #[doc = ""] - #[doc = " Index that queries in a base_index (a fast one) and refines the"] - #[doc = " results with an exact search, hopefully improving the results."] + #[doc = " Opaque type for IndexRefineFlat\n\n Index that queries in a base_index (a fast one) and refines the\n results with an exact search, hopefully improving the results."] pub fn faiss_IndexRefineFlat_new( p_index: *mut *mut FaissIndexRefineFlat, base_index: *mut FaissIndex, @@ -757,9 +803,7 @@ extern "C" { pub fn faiss_IndexFlat1D_free(obj: *mut FaissIndexFlat1D); } extern "C" { - #[doc = " Opaque type for IndexFlat1D"] - #[doc = ""] - #[doc = " optimized version for 1D \"vectors\""] + #[doc = " Opaque type for IndexFlat1D\n\n optimized version for 1D \"vectors\""] pub fn faiss_IndexFlat1D_new(p_index: *mut *mut FaissIndexFlat1D) -> ::std::os::raw::c_int; } extern "C" { @@ -837,13 +881,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Update a subset of vectors."] - #[doc = ""] - #[doc = " The index must have a direct_map"] - #[doc = ""] - #[doc = " @param nv nb of vectors to update"] - #[doc = " @param idx vector indices to update, size nv"] - #[doc = " @param v vectors of new values, size nv*d"] + #[doc = " Update a subset of vectors.\n\n The index must have a direct_map\n\n @param nv nb of vectors to update\n @param idx vector indices to update, size nv\n @param v vectors of new values, size nv*d"] pub fn faiss_IndexIVFFlat_update_vectors( index: *mut FaissIndexIVFFlat, nv: ::std::os::raw::c_int, @@ -851,151 +889,490 @@ extern "C" { v: *const f32, ) -> ::std::os::raw::c_int; } -pub type FaissIndexIVF = FaissIndex_H; extern "C" { - pub fn faiss_IndexIVF_free(obj: *mut FaissIndexIVF); + pub fn faiss_RangeSearchResult_nq(arg1: *const FaissRangeSearchResult) -> usize; } extern "C" { - pub fn faiss_IndexIVF_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIVF; + pub fn faiss_RangeSearchResult_new( + p_rsr: *mut *mut FaissRangeSearchResult, + nq: idx_t, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_nlist(arg1: *const FaissIndexIVF) -> usize; + pub fn faiss_RangeSearchResult_new_with( + p_rsr: *mut *mut FaissRangeSearchResult, + nq: idx_t, + alloc_lims: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_nprobe(arg1: *const FaissIndexIVF) -> usize; + #[doc = " called when lims contains the nb of elements result entries\n for each query"] + pub fn faiss_RangeSearchResult_do_allocation( + rsr: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IndexIVF_set_nprobe(arg1: *mut FaissIndexIVF, arg2: usize); + pub fn faiss_RangeSearchResult_free(obj: *mut FaissRangeSearchResult); } extern "C" { - pub fn faiss_IndexIVF_quantizer(arg1: *const FaissIndexIVF) -> *mut FaissIndex; + pub fn faiss_RangeSearchResult_buffer_size(arg1: *const FaissRangeSearchResult) -> usize; } extern "C" { - pub fn faiss_IndexIVF_quantizer_trains_alone( - arg1: *const FaissIndexIVF, - ) -> ::std::os::raw::c_char; + #[doc = " getter for lims: size (nq + 1)"] + pub fn faiss_RangeSearchResult_lims(rsr: *mut FaissRangeSearchResult, lims: *mut *mut usize); } extern "C" { - pub fn faiss_IndexIVF_own_fields(arg1: *const FaissIndexIVF) -> ::std::os::raw::c_int; + #[doc = " getter for labels and respective distances (not sorted):\n result for query i is labels[lims[i]:lims[i+1]]"] + pub fn faiss_RangeSearchResult_labels( + rsr: *mut FaissRangeSearchResult, + labels: *mut *mut idx_t, + distances: *mut *mut f32, + ); } extern "C" { - pub fn faiss_IndexIVF_set_own_fields(arg1: *mut FaissIndexIVF, arg2: ::std::os::raw::c_int); + pub fn faiss_IDSelector_free(obj: *mut FaissIDSelector); } extern "C" { - #[doc = " moves the entries from another dataset to self. On output,"] - #[doc = " other is empty. add_id is added to all moved ids (for"] - #[doc = " sequential ids, this would be this->ntotal"] - pub fn faiss_IndexIVF_merge_from( - index: *mut FaissIndexIVF, - other: *mut FaissIndexIVF, - add_id: idx_t, + #[doc = " Encapsulates a set of ids to remove."] + pub fn faiss_IDSelector_is_member( + sel: *const FaissIDSelector, + id: idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorRange_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorRange = FaissIDSelectorRange_H; extern "C" { - #[doc = " copy a subset of the entries index to the other index"] - #[doc = ""] - #[doc = " if subset_type == 0: copies ids in [a1, a2)"] - #[doc = " if subset_type == 1: copies ids if id % a1 == a2"] - #[doc = " if subset_type == 2: copies inverted lists such that a1"] - #[doc = " elements are left before and a2 elements are after"] - pub fn faiss_IndexIVF_copy_subset_to( - index: *const FaissIndexIVF, - other: *mut FaissIndexIVF, - subset_type: ::std::os::raw::c_int, - a1: idx_t, - a2: idx_t, + pub fn faiss_IDSelectorRange_free(obj: *mut FaissIDSelectorRange); +} +extern "C" { + pub fn faiss_IDSelectorRange_imin(arg1: *const FaissIDSelectorRange) -> idx_t; +} +extern "C" { + pub fn faiss_IDSelectorRange_imax(arg1: *const FaissIDSelectorRange) -> idx_t; +} +extern "C" { + #[doc = " remove ids between [imni, imax)"] + pub fn faiss_IDSelectorRange_new( + p_sel: *mut *mut FaissIDSelectorRange, + imin: idx_t, + imax: idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorBatch_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorBatch = FaissIDSelectorBatch_H; extern "C" { - #[doc = " search a set of vectors, that are pre-quantized by the IVF"] - #[doc = " quantizer. Fill in the corresponding heaps with the query"] - #[doc = " results. search() calls this."] - #[doc = ""] - #[doc = " @param n nb of vectors to query"] - #[doc = " @param x query vectors, size nx * d"] - #[doc = " @param assign coarse quantization indices, size nx * nprobe"] - #[doc = " @param centroid_dis"] - #[doc = " distances to coarse centroids, size nx * nprobe"] - #[doc = " @param distance"] - #[doc = " output distances, size n * k"] - #[doc = " @param labels output labels, size n * k"] - #[doc = " @param store_pairs store inv list index + inv list offset"] - #[doc = " instead in upper/lower 32 bit of result,"] - #[doc = " instead of ids (used for reranking)."] - pub fn faiss_IndexIVF_search_preassigned( - index: *const FaissIndexIVF, - n: idx_t, - x: *const f32, - k: idx_t, - assign: *const idx_t, - centroid_dis: *const f32, - distances: *mut f32, - labels: *mut idx_t, - store_pairs: ::std::os::raw::c_int, + pub fn faiss_IDSelectorBatch_nbits(arg1: *const FaissIDSelectorBatch) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IDSelectorBatch_mask(arg1: *const FaissIDSelectorBatch) -> idx_t; +} +extern "C" { + #[doc = " Remove ids from a set. Repetitions of ids in the indices set\n passed to the constructor does not hurt performance. The hash\n function used for the bloom filter and GCC's implementation of\n unordered_set are just the least significant bits of the id. This\n works fine for random ids or ids in sequences but will produce many\n hash collisions if lsb's are always the same"] + pub fn faiss_IDSelectorBatch_new( + p_sel: *mut *mut FaissIDSelectorBatch, + n: usize, + indices: *const idx_t, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorNot_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorNot = FaissIDSelectorNot_H; extern "C" { - pub fn faiss_IndexIVF_get_list_size(index: *const FaissIndexIVF, list_no: usize) -> usize; + pub fn faiss_IDSelectorNot_new( + p_sel: *mut *mut FaissIDSelectorNot, + sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorAnd_H { + _unused: [u8; 0], } +pub type FaissIDSelectorAnd = FaissIDSelectorAnd_H; extern "C" { - #[doc = " initialize a direct map"] - #[doc = ""] - #[doc = " @param new_maintain_direct_map if true, create a direct map,"] - #[doc = " else clear it"] - pub fn faiss_IndexIVF_make_direct_map( - index: *mut FaissIndexIVF, - new_maintain_direct_map: ::std::os::raw::c_int, + pub fn faiss_IDSelectorAnd_new( + p_sel: *mut *mut FaissIDSelectorAnd, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, ) -> ::std::os::raw::c_int; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorOr_H { + _unused: [u8; 0], +} +pub type FaissIDSelectorOr = FaissIDSelectorOr_H; extern "C" { - #[doc = " Check the inverted lists' imbalance factor."] - #[doc = ""] - #[doc = " 1= perfectly balanced, >1: imbalanced"] - pub fn faiss_IndexIVF_imbalance_factor(index: *const FaissIndexIVF) -> f64; + pub fn faiss_IDSelectorOr_new( + p_sel: *mut *mut FaissIDSelectorOr, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIDSelectorXOr_H { + _unused: [u8; 0], } +pub type FaissIDSelectorXOr = FaissIDSelectorXOr_H; extern "C" { - #[doc = " display some stats about the inverted lists of the index"] - pub fn faiss_IndexIVF_print_stats(index: *const FaissIndexIVF); + pub fn faiss_IDSelectorXOr_new( + p_sel: *mut *mut FaissIDSelectorXOr, + lhs_sel: *const FaissIDSelector, + rhs_sel: *const FaissIDSelector, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissBufferList_H { + _unused: [u8; 0], } +pub type FaissBufferList = FaissBufferList_H; extern "C" { - #[doc = " Get the IDs in an inverted list. IDs are written to `invlist`, which must be"] - #[doc = " large enough"] - #[doc = " to accommodate the full list."] - #[doc = ""] - #[doc = " @param list_no the list ID"] - #[doc = " @param invlist output pointer to a slice of memory, at least as long as the"] - #[doc = " list's size"] - #[doc = " @see faiss_IndexIVF_get_list_size(size_t)"] - pub fn faiss_IndexIVF_invlists_get_ids( - index: *const FaissIndexIVF, - list_no: usize, - invlist: *mut idx_t, - ); + pub fn faiss_BufferList_free(obj: *mut FaissBufferList); +} +extern "C" { + pub fn faiss_BufferList_buffer_size(arg1: *const FaissBufferList) -> usize; } +extern "C" { + pub fn faiss_BufferList_wp(arg1: *const FaissBufferList) -> usize; +} +#[doc = " List of temporary buffers used to store results before they are\n copied to the RangeSearchResult object."] #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct FaissIndexIVFStats { - pub nq: usize, - pub nlist: usize, - pub ndis: usize, - pub nheap_updates: usize, - pub quantization_time: f64, - pub search_time: f64, +pub struct FaissBuffer { + pub ids: *mut idx_t, + pub dis: *mut f32, } #[test] -fn bindgen_test_layout_FaissIndexIVFStats() { - assert_eq!( - ::std::mem::size_of::(), - 48usize, - concat!("Size of: ", stringify!(FaissIndexIVFStats)) - ); +fn bindgen_test_layout_FaissBuffer() { + const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(FaissBuffer)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(FaissBuffer)) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).ids) as usize - ptr as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(FaissBuffer), + "::", + stringify!(ids) + ) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).dis) as usize - ptr as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(FaissBuffer), + "::", + stringify!(dis) + ) + ); +} +extern "C" { + pub fn faiss_BufferList_append_buffer(bl: *mut FaissBufferList) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_BufferList_new( + p_bl: *mut *mut FaissBufferList, + buffer_size: usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_BufferList_add( + bl: *mut FaissBufferList, + id: idx_t, + dis: f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to\n tables dest_ids, dest_dis"] + pub fn faiss_BufferList_copy_range( + bl: *mut FaissBufferList, + ofs: usize, + n: usize, + dest_ids: *mut idx_t, + dest_dis: *mut f32, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissRangeSearchPartialResult_H { + _unused: [u8; 0], +} +pub type FaissRangeSearchPartialResult = FaissRangeSearchPartialResult_H; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissRangeQueryResult_H { + _unused: [u8; 0], +} +pub type FaissRangeQueryResult = FaissRangeQueryResult_H; +extern "C" { + pub fn faiss_RangeQueryResult_qno(arg1: *const FaissRangeQueryResult) -> idx_t; +} +extern "C" { + pub fn faiss_RangeQueryResult_nres(arg1: *const FaissRangeQueryResult) -> usize; +} +extern "C" { + pub fn faiss_RangeQueryResult_pres( + arg1: *const FaissRangeQueryResult, + ) -> *mut FaissRangeSearchPartialResult; +} +extern "C" { + #[doc = " result structure for a single query"] + pub fn faiss_RangeQueryResult_add( + qr: *mut FaissRangeQueryResult, + dis: f32, + id: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_res( + arg1: *const FaissRangeSearchPartialResult, + ) -> *mut FaissRangeSearchResult; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_new( + p_res: *mut *mut FaissRangeSearchPartialResult, + res_in: *mut FaissRangeSearchResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_finalize( + res: *mut FaissRangeSearchPartialResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " called by range_search before do_allocation"] + pub fn faiss_RangeSearchPartialResult_set_lims( + res: *mut FaissRangeSearchPartialResult, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_RangeSearchPartialResult_new_result( + res: *mut FaissRangeSearchPartialResult, + qno: idx_t, + qr: *mut *mut FaissRangeQueryResult, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissDistanceComputer_H { + _unused: [u8; 0], +} +pub type FaissDistanceComputer = FaissDistanceComputer_H; +extern "C" { + #[doc = " called before computing distances"] + pub fn faiss_DistanceComputer_set_query( + dc: *mut FaissDistanceComputer, + x: *const f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Compute distance of vector i to current query.\n This function corresponds to the function call operator:\n DistanceComputer::operator()"] + pub fn faiss_DistanceComputer_vector_to_query_dis( + dc: *mut FaissDistanceComputer, + i: idx_t, + qd: *mut f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " compute distance between two stored vectors"] + pub fn faiss_DistanceComputer_symmetric_dis( + dc: *mut FaissDistanceComputer, + i: idx_t, + j: idx_t, + vd: *mut f32, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_DistanceComputer_free(obj: *mut FaissDistanceComputer); +} +pub type FaissSearchParametersIVF = FaissSearchParameters_H; +extern "C" { + pub fn faiss_SearchParametersIVF_free(obj: *mut FaissSearchParametersIVF); +} +extern "C" { + pub fn faiss_SearchParametersIVF_cast( + arg1: *mut FaissSearchParameters, + ) -> *mut FaissSearchParametersIVF; +} +extern "C" { + pub fn faiss_SearchParametersIVF_new( + p_sp: *mut *mut FaissSearchParametersIVF, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_SearchParametersIVF_new_with( + p_sp: *mut *mut FaissSearchParametersIVF, + sel: *mut FaissIDSelector, + nprobe: usize, + max_codes: usize, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_SearchParametersIVF_sel( + arg1: *const FaissSearchParametersIVF, + ) -> *const FaissIDSelector; +} +extern "C" { + pub fn faiss_SearchParametersIVF_nprobe(arg1: *const FaissSearchParametersIVF) -> usize; +} +extern "C" { + pub fn faiss_SearchParametersIVF_set_nprobe(arg1: *mut FaissSearchParametersIVF, arg2: usize); +} +extern "C" { + pub fn faiss_SearchParametersIVF_max_codes(arg1: *const FaissSearchParametersIVF) -> usize; +} +extern "C" { + pub fn faiss_SearchParametersIVF_set_max_codes( + arg1: *mut FaissSearchParametersIVF, + arg2: usize, + ); +} +pub type FaissIndexIVF = FaissIndex_H; +extern "C" { + pub fn faiss_IndexIVF_free(obj: *mut FaissIndexIVF); +} +extern "C" { + pub fn faiss_IndexIVF_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIVF; +} +extern "C" { + pub fn faiss_IndexIVF_nlist(arg1: *const FaissIndexIVF) -> usize; +} +extern "C" { + pub fn faiss_IndexIVF_nprobe(arg1: *const FaissIndexIVF) -> usize; +} +extern "C" { + pub fn faiss_IndexIVF_set_nprobe(arg1: *mut FaissIndexIVF, arg2: usize); +} +extern "C" { + pub fn faiss_IndexIVF_quantizer(arg1: *const FaissIndexIVF) -> *mut FaissIndex; +} +extern "C" { + pub fn faiss_IndexIVF_quantizer_trains_alone( + arg1: *const FaissIndexIVF, + ) -> ::std::os::raw::c_char; +} +extern "C" { + pub fn faiss_IndexIVF_own_fields(arg1: *const FaissIndexIVF) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexIVF_set_own_fields(arg1: *mut FaissIndexIVF, arg2: ::std::os::raw::c_int); +} +extern "C" { + #[doc = " moves the entries from another dataset to self. On output,\n other is empty. add_id is added to all moved ids (for\n sequential ids, this would be this->ntotal"] + pub fn faiss_IndexIVF_merge_from( + index: *mut FaissIndexIVF, + other: *mut FaissIndexIVF, + add_id: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " copy a subset of the entries index to the other index\n\n if subset_type == 0: copies ids in [a1, a2)\n if subset_type == 1: copies ids if id % a1 == a2\n if subset_type == 2: copies inverted lists such that a1\n elements are left before and a2 elements are after"] + pub fn faiss_IndexIVF_copy_subset_to( + index: *const FaissIndexIVF, + other: *mut FaissIndexIVF, + subset_type: ::std::os::raw::c_int, + a1: idx_t, + a2: idx_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " search a set of vectors, that are pre-quantized by the IVF\n quantizer. Fill in the corresponding heaps with the query\n results. search() calls this.\n\n @param n nb of vectors to query\n @param x query vectors, size nx * d\n @param assign coarse quantization indices, size nx * nprobe\n @param centroid_dis\n distances to coarse centroids, size nx * nprobe\n @param distance\n output distances, size n * k\n @param labels output labels, size n * k\n @param store_pairs store inv list index + inv list offset\n instead in upper/lower 32 bit of result,\n instead of ids (used for reranking)."] + pub fn faiss_IndexIVF_search_preassigned( + index: *const FaissIndexIVF, + n: idx_t, + x: *const f32, + k: idx_t, + assign: *const idx_t, + centroid_dis: *const f32, + distances: *mut f32, + labels: *mut idx_t, + store_pairs: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn faiss_IndexIVF_get_list_size(index: *const FaissIndexIVF, list_no: usize) -> usize; +} +extern "C" { + #[doc = " initialize a direct map\n\n @param new_maintain_direct_map if true, create a direct map,\n else clear it"] + pub fn faiss_IndexIVF_make_direct_map( + index: *mut FaissIndexIVF, + new_maintain_direct_map: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Check the inverted lists' imbalance factor.\n\n 1= perfectly balanced, >1: imbalanced"] + pub fn faiss_IndexIVF_imbalance_factor(index: *const FaissIndexIVF) -> f64; +} +extern "C" { + #[doc = " display some stats about the inverted lists of the index"] + pub fn faiss_IndexIVF_print_stats(index: *const FaissIndexIVF); +} +extern "C" { + #[doc = " Get the IDs in an inverted list. IDs are written to `invlist`, which must be\n large enough\n to accommodate the full list.\n\n @param list_no the list ID\n @param invlist output pointer to a slice of memory, at least as long as the\n list's size\n @see faiss_IndexIVF_get_list_size(size_t)"] + pub fn faiss_IndexIVF_invlists_get_ids( + index: *const FaissIndexIVF, + list_no: usize, + invlist: *mut idx_t, + ); +} +extern "C" { + pub fn faiss_IndexIVF_train_encoder( + index: *mut FaissIndexIVF, + n: idx_t, + x: *const f32, + assign: *const idx_t, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct FaissIndexIVFStats { + pub nq: usize, + pub nlist: usize, + pub ndis: usize, + pub nheap_updates: usize, + pub quantization_time: f64, + pub search_time: f64, +} +#[test] +fn bindgen_test_layout_FaissIndexIVFStats() { + const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::(), + 48usize, + concat!("Size of: ", stringify!(FaissIndexIVFStats)) + ); assert_eq!( ::std::mem::align_of::(), 8usize, concat!("Alignment of ", stringify!(FaissIndexIVFStats)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nq as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nq) as usize - ptr as usize }, 0usize, concat!( "Offset of field: ", @@ -1005,7 +1382,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).nlist as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).nlist) as usize - ptr as usize }, 8usize, concat!( "Offset of field: ", @@ -1015,7 +1392,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).ndis as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).ndis) as usize - ptr as usize }, 16usize, concat!( "Offset of field: ", @@ -1025,9 +1402,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).nheap_updates as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).nheap_updates) as usize - ptr as usize }, 24usize, concat!( "Offset of field: ", @@ -1037,9 +1412,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).quantization_time as *const _ as usize - }, + unsafe { ::std::ptr::addr_of!((*ptr).quantization_time) as usize - ptr as usize }, 32usize, concat!( "Offset of field: ", @@ -1049,7 +1422,7 @@ fn bindgen_test_layout_FaissIndexIVFStats() { ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).search_time as *const _ as usize }, + unsafe { ::std::ptr::addr_of!((*ptr).search_time) as usize - ptr as usize }, 40usize, concat!( "Offset of field: ", @@ -1123,11 +1496,7 @@ extern "C" { pub fn faiss_VectorTransform_d_out(arg1: *const FaissVectorTransform) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Perform training on a representative set of vectors"] - #[doc = ""] - #[doc = " @param vt opaque pointer to VectorTransform object"] - #[doc = " @param n nb of training vectors"] - #[doc = " @param x training vectors, size n * d"] + #[doc = " Perform training on a representative set of vectors\n\n @param vt opaque pointer to VectorTransform object\n @param n nb of training vectors\n @param x training vectors, size n * d"] pub fn faiss_VectorTransform_train( vt: *mut FaissVectorTransform, n: idx_t, @@ -1135,9 +1504,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " apply the random rotation, return new allocated matrix"] - #[doc = " @param x size n * d_in"] - #[doc = " @return size n * d_out"] + #[doc = " apply the random rotation, return new allocated matrix\n @param x size n * d_in\n @return size n * d_out"] pub fn faiss_VectorTransform_apply( vt: *const FaissVectorTransform, n: idx_t, @@ -1145,9 +1512,7 @@ extern "C" { ) -> *mut f32; } extern "C" { - #[doc = " apply transformation and result is pre-allocated"] - #[doc = " @param x size n * d_in"] - #[doc = " @param xt size n * d_out"] + #[doc = " apply transformation and result is pre-allocated\n @param x size n * d_in\n @param xt size n * d_out"] pub fn faiss_VectorTransform_apply_noalloc( vt: *const FaissVectorTransform, n: idx_t, @@ -1156,8 +1521,7 @@ extern "C" { ); } extern "C" { - #[doc = " reverse transformation. May not be implemented or may return"] - #[doc = " approximate result"] + #[doc = " reverse transformation. May not be implemented or may return\n approximate result"] pub fn faiss_VectorTransform_reverse_transform( vt: *const FaissVectorTransform, n: idx_t, @@ -1170,8 +1534,7 @@ extern "C" { pub fn faiss_LinearTransform_free(obj: *mut FaissLinearTransform); } extern "C" { - #[doc = " compute x = A^T * (x - b)"] - #[doc = " is reverse transform if A has orthonormal lines"] + #[doc = " compute x = A^T * (x - b)\n is reverse transform if A has orthonormal lines"] pub fn faiss_LinearTransform_transform_transpose( vt: *const FaissLinearTransform, n: idx_t, @@ -1339,8 +1702,7 @@ extern "C" { ); } extern "C" { - #[doc = " Index that applies a LinearTransform transform on vectors before"] - #[doc = " handing them over to a sub-index"] + #[doc = " Index that applies a LinearTransform transform on vectors before\n handing them over to a sub-index"] pub fn faiss_IndexPreTransform_new( p_index: *mut *mut FaissIndexPreTransform, ) -> ::std::os::raw::c_int; @@ -1519,13 +1881,6 @@ extern "C" { precomputed_idx: *const idx_t, ) -> ::std::os::raw::c_int; } -extern "C" { - pub fn faiss_IndexIVFScalarQuantizer_train_residual( - index: *mut FaissIndexIVFScalarQuantizer, - n: idx_t, - x: *const f32, - ) -> ::std::os::raw::c_int; -} pub type FaissIndexShards = FaissIndex_H; extern "C" { pub fn faiss_IndexShards_free(obj: *mut FaissIndexShards); @@ -1553,425 +1908,204 @@ extern "C" { #[doc = " Index that concatenates the results from several sub-indexes"] pub fn faiss_IndexShards_new( p_index: *mut *mut FaissIndexShards, - d: idx_t, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_new_with_options( - p_index: *mut *mut FaissIndexShards, - d: idx_t, - threaded: ::std::os::raw::c_int, - successive_ids: ::std::os::raw::c_int, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_add_shard( - index: *mut FaissIndexShards, - shard: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_remove_shard( - index: *mut FaissIndexShards, - shard: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexShards_at( - index: *mut FaissIndexShards, - i: ::std::os::raw::c_int, - ) -> *mut FaissIndex; -} -pub type FaissIndexIDMap = FaissIndex_H; -extern "C" { - pub fn faiss_IndexIDMap_own_fields(arg1: *const FaissIndexIDMap) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap_set_own_fields(arg1: *mut FaissIndexIDMap, arg2: ::std::os::raw::c_int); -} -extern "C" { - #[doc = " Index that translates search results to ids"] - pub fn faiss_IndexIDMap_new( - p_index: *mut *mut FaissIndexIDMap, - index: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap; -} -extern "C" { - #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_id_map output, the pointer to the beginning of `id_map`."] - #[doc = " @param p_size output, the current length of `id_map`."] - pub fn faiss_IndexIDMap_id_map( - index: *mut FaissIndexIDMap, - p_id_map: *mut *mut idx_t, - p_size: *mut usize, - ); -} -extern "C" { - #[doc = " get a pointer to the sub-index (the `index` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - pub fn faiss_IndexIDMap_sub_index(index: *mut FaissIndexIDMap) -> *mut FaissIndex; -} -pub type FaissIndexIDMap2 = FaissIndex_H; -extern "C" { - pub fn faiss_IndexIDMap2_own_fields(arg1: *const FaissIndexIDMap2) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap2_set_own_fields( - arg1: *mut FaissIndexIDMap2, - arg2: ::std::os::raw::c_int, - ); -} -extern "C" { - #[doc = " same as IndexIDMap but also provides an efficient reconstruction"] - #[doc = "implementation via a 2-way index"] - pub fn faiss_IndexIDMap2_new( - p_index: *mut *mut FaissIndexIDMap2, - index: *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " make the rev_map from scratch"] - pub fn faiss_IndexIDMap2_construct_rev_map( - index: *mut FaissIndexIDMap2, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_IndexIDMap2_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap2; -} -extern "C" { - #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - #[doc = " @param p_id_map output, the pointer to the beginning of `id_map`."] - #[doc = " @param p_size output, the current length of `id_map`."] - pub fn faiss_IndexIDMap2_id_map( - index: *mut FaissIndexIDMap2, - p_id_map: *mut *mut idx_t, - p_size: *mut usize, - ); -} -extern "C" { - #[doc = " get a pointer to the sub-index (the `index` field)."] - #[doc = " The outputs of this function become invalid after any operation that can"] - #[doc = " modify the index."] - #[doc = ""] - #[doc = " @param index opaque pointer to index object"] - pub fn faiss_IndexIDMap2_sub_index(index: *mut FaissIndexIDMap2) -> *mut FaissIndex; -} -pub type FILE = [u64; 27usize]; -extern "C" { - #[doc = " Clone an index. This is equivalent to `faiss::clone_index`"] - pub fn faiss_clone_index( - arg1: *const FaissIndex, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -#[doc = " No error"] -pub const FaissErrorCode_OK: FaissErrorCode = 0; -#[doc = " Any exception other than Faiss or standard C++ library exceptions"] -pub const FaissErrorCode_UNKNOWN_EXCEPT: FaissErrorCode = -1; -#[doc = " Faiss library exception"] -pub const FaissErrorCode_FAISS_EXCEPT: FaissErrorCode = -2; -#[doc = " Standard C++ library exception"] -pub const FaissErrorCode_STD_EXCEPT: FaissErrorCode = -4; -#[doc = " An error code which depends on the exception thrown from the previous"] -#[doc = " operation. See `faiss_get_last_error` to retrieve the error message."] -pub type FaissErrorCode = ::std::os::raw::c_int; -extern "C" { - #[doc = " Get the error message of the last failed operation performed by Faiss."] - #[doc = " The given pointer is only invalid until another Faiss function is"] - #[doc = " called."] - pub fn faiss_get_last_error() -> *const ::std::os::raw::c_char; -} -extern "C" { - pub fn faiss_RangeSearchResult_nq(arg1: *const FaissRangeSearchResult) -> usize; -} -extern "C" { - pub fn faiss_RangeSearchResult_new( - p_rsr: *mut *mut FaissRangeSearchResult, - nq: idx_t, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_RangeSearchResult_new_with( - p_rsr: *mut *mut FaissRangeSearchResult, - nq: idx_t, - alloc_lims: ::std::os::raw::c_int, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " called when lims contains the nb of elements result entries"] - #[doc = " for each query"] - pub fn faiss_RangeSearchResult_do_allocation( - rsr: *mut FaissRangeSearchResult, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn faiss_RangeSearchResult_free(obj: *mut FaissRangeSearchResult); -} -extern "C" { - pub fn faiss_RangeSearchResult_buffer_size(arg1: *const FaissRangeSearchResult) -> usize; -} -extern "C" { - #[doc = " getter for lims: size (nq + 1)"] - pub fn faiss_RangeSearchResult_lims(rsr: *mut FaissRangeSearchResult, lims: *mut *mut usize); -} -extern "C" { - #[doc = " getter for labels and respective distances (not sorted):"] - #[doc = " result for query i is labels[lims[i]:lims[i+1]]"] - pub fn faiss_RangeSearchResult_labels( - rsr: *mut FaissRangeSearchResult, - labels: *mut *mut idx_t, - distances: *mut *mut f32, - ); -} -extern "C" { - pub fn faiss_IDSelector_free(obj: *mut FaissIDSelector); -} -extern "C" { - #[doc = " Encapsulates a set of ids to remove."] - pub fn faiss_IDSelector_is_member( - sel: *const FaissIDSelector, - id: idx_t, - ) -> ::std::os::raw::c_int; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissIDSelectorRange_H { - _unused: [u8; 0], -} -pub type FaissIDSelectorRange = FaissIDSelectorRange_H; -extern "C" { - pub fn faiss_IDSelectorRange_free(obj: *mut FaissIDSelectorRange); -} -extern "C" { - pub fn faiss_IDSelectorRange_imin(arg1: *const FaissIDSelectorRange) -> idx_t; -} -extern "C" { - pub fn faiss_IDSelectorRange_imax(arg1: *const FaissIDSelectorRange) -> idx_t; -} -extern "C" { - #[doc = " remove ids between [imni, imax)"] - pub fn faiss_IDSelectorRange_new( - p_sel: *mut *mut FaissIDSelectorRange, - imin: idx_t, - imax: idx_t, - ) -> ::std::os::raw::c_int; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissIDSelectorBatch_H { - _unused: [u8; 0], + d: idx_t, + ) -> ::std::os::raw::c_int; } -pub type FaissIDSelectorBatch = FaissIDSelectorBatch_H; extern "C" { - pub fn faiss_IDSelectorBatch_nbits(arg1: *const FaissIDSelectorBatch) -> ::std::os::raw::c_int; + pub fn faiss_IndexShards_new_with_options( + p_index: *mut *mut FaissIndexShards, + d: idx_t, + threaded: ::std::os::raw::c_int, + successive_ids: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_IDSelectorBatch_mask(arg1: *const FaissIDSelectorBatch) -> idx_t; + pub fn faiss_IndexShards_add_shard( + index: *mut FaissIndexShards, + shard: *mut FaissIndex, + ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Remove ids from a set. Repetitions of ids in the indices set"] - #[doc = " passed to the constructor does not hurt performance. The hash"] - #[doc = " function used for the bloom filter and GCC's implementation of"] - #[doc = " unordered_set are just the least significant bits of the id. This"] - #[doc = " works fine for random ids or ids in sequences but will produce many"] - #[doc = " hash collisions if lsb's are always the same"] - pub fn faiss_IDSelectorBatch_new( - p_sel: *mut *mut FaissIDSelectorBatch, - n: usize, - indices: *const idx_t, + pub fn faiss_IndexShards_remove_shard( + index: *mut FaissIndexShards, + shard: *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissBufferList_H { - _unused: [u8; 0], +extern "C" { + pub fn faiss_IndexShards_at( + index: *mut FaissIndexShards, + i: ::std::os::raw::c_int, + ) -> *mut FaissIndex; } -pub type FaissBufferList = FaissBufferList_H; +pub type FaissIndexIDMap = FaissIndex_H; extern "C" { - pub fn faiss_BufferList_free(obj: *mut FaissBufferList); + pub fn faiss_IndexIDMap_own_fields(arg1: *const FaissIndexIDMap) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_BufferList_buffer_size(arg1: *const FaissBufferList) -> usize; + pub fn faiss_IndexIDMap_set_own_fields(arg1: *mut FaissIndexIDMap, arg2: ::std::os::raw::c_int); } extern "C" { - pub fn faiss_BufferList_wp(arg1: *const FaissBufferList) -> usize; + #[doc = " Index that translates search results to ids"] + pub fn faiss_IndexIDMap_new( + p_index: *mut *mut FaissIndexIDMap, + index: *mut FaissIndex, + ) -> ::std::os::raw::c_int; } -#[doc = " List of temporary buffers used to store results before they are"] -#[doc = " copied to the RangeSearchResult object."] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissBuffer { - pub ids: *mut idx_t, - pub dis: *mut f32, +extern "C" { + pub fn faiss_IndexIDMap_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap; } -#[test] -fn bindgen_test_layout_FaissBuffer() { - assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(FaissBuffer)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(FaissBuffer)) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).ids as *const _ as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(FaissBuffer), - "::", - stringify!(ids) - ) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).dis as *const _ as usize }, - 8usize, - concat!( - "Offset of field: ", - stringify!(FaissBuffer), - "::", - stringify!(dis) - ) +extern "C" { + #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object\n @param p_id_map output, the pointer to the beginning of `id_map`.\n @param p_size output, the current length of `id_map`."] + pub fn faiss_IndexIDMap_id_map( + index: *mut FaissIndexIDMap, + p_id_map: *mut *mut idx_t, + p_size: *mut usize, ); } extern "C" { - pub fn faiss_BufferList_append_buffer(bl: *mut FaissBufferList) -> ::std::os::raw::c_int; + #[doc = " get a pointer to the sub-index (the `index` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object"] + pub fn faiss_IndexIDMap_sub_index(index: *mut FaissIndexIDMap) -> *mut FaissIndex; } +pub type FaissIndexIDMap2 = FaissIndex_H; extern "C" { - pub fn faiss_BufferList_new( - p_bl: *mut *mut FaissBufferList, - buffer_size: usize, - ) -> ::std::os::raw::c_int; + pub fn faiss_IndexIDMap2_own_fields(arg1: *const FaissIndexIDMap2) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_BufferList_add( - bl: *mut FaissBufferList, - id: idx_t, - dis: f32, - ) -> ::std::os::raw::c_int; + pub fn faiss_IndexIDMap2_set_own_fields( + arg1: *mut FaissIndexIDMap2, + arg2: ::std::os::raw::c_int, + ); } extern "C" { - #[doc = " copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to"] - #[doc = " tables dest_ids, dest_dis"] - pub fn faiss_BufferList_copy_range( - bl: *mut FaissBufferList, - ofs: usize, - n: usize, - dest_ids: *mut idx_t, - dest_dis: *mut f32, + #[doc = " same as IndexIDMap but also provides an efficient reconstruction\nimplementation via a 2-way index"] + pub fn faiss_IndexIDMap2_new( + p_index: *mut *mut FaissIndexIDMap2, + index: *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissRangeSearchPartialResult_H { - _unused: [u8; 0], +extern "C" { + #[doc = " make the rev_map from scratch"] + pub fn faiss_IndexIDMap2_construct_rev_map( + index: *mut FaissIndexIDMap2, + ) -> ::std::os::raw::c_int; } -pub type FaissRangeSearchPartialResult = FaissRangeSearchPartialResult_H; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissRangeQueryResult_H { - _unused: [u8; 0], +extern "C" { + pub fn faiss_IndexIDMap2_cast(arg1: *mut FaissIndex) -> *mut FaissIndexIDMap2; } -pub type FaissRangeQueryResult = FaissRangeQueryResult_H; extern "C" { - pub fn faiss_RangeQueryResult_qno(arg1: *const FaissRangeQueryResult) -> idx_t; + #[doc = " get a pointer to the index map's internal ID vector (the `id_map` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object\n @param p_id_map output, the pointer to the beginning of `id_map`.\n @param p_size output, the current length of `id_map`."] + pub fn faiss_IndexIDMap2_id_map( + index: *mut FaissIndexIDMap2, + p_id_map: *mut *mut idx_t, + p_size: *mut usize, + ); } extern "C" { - pub fn faiss_RangeQueryResult_nres(arg1: *const FaissRangeQueryResult) -> usize; + #[doc = " get a pointer to the sub-index (the `index` field).\n The outputs of this function become invalid after any operation that can\n modify the index.\n\n @param index opaque pointer to index object"] + pub fn faiss_IndexIDMap2_sub_index(index: *mut FaissIndexIDMap2) -> *mut FaissIndex; } +pub type FILE = [u64; 27usize]; extern "C" { - pub fn faiss_RangeQueryResult_pres( - arg1: *const FaissRangeQueryResult, - ) -> *mut FaissRangeSearchPartialResult; + #[doc = " Clone an index. This is equivalent to `faiss::clone_index`"] + pub fn faiss_clone_index( + arg1: *const FaissIndex, + p_out: *mut *mut FaissIndex, + ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " result structure for a single query"] - pub fn faiss_RangeQueryResult_add( - qr: *mut FaissRangeQueryResult, - dis: f32, - id: idx_t, + #[doc = " Clone a binary index. This is equivalent to `faiss::clone_index_binary`"] + pub fn faiss_clone_index_binary( + arg1: *const FaissIndexBinary, + p_out: *mut *mut FaissIndexBinary, ) -> ::std::os::raw::c_int; } +#[doc = " No error"] +pub const FaissErrorCode_OK: FaissErrorCode = 0; +#[doc = " Any exception other than Faiss or standard C++ library exceptions"] +pub const FaissErrorCode_UNKNOWN_EXCEPT: FaissErrorCode = -1; +#[doc = " Faiss library exception"] +pub const FaissErrorCode_FAISS_EXCEPT: FaissErrorCode = -2; +#[doc = " Standard C++ library exception"] +pub const FaissErrorCode_STD_EXCEPT: FaissErrorCode = -4; +#[doc = " An error code which depends on the exception thrown from the previous\n operation. See `faiss_get_last_error` to retrieve the error message."] +pub type FaissErrorCode = ::std::os::raw::c_int; extern "C" { - pub fn faiss_RangeSearchPartialResult_res( - arg1: *const FaissRangeSearchPartialResult, - ) -> *mut FaissRangeSearchResult; + #[doc = " Get the error message of the last failed operation performed by Faiss.\n The given pointer is only invalid until another Faiss function is\n called."] + pub fn faiss_get_last_error() -> *const ::std::os::raw::c_char; } extern "C" { - pub fn faiss_RangeSearchPartialResult_new( - p_res: *mut *mut FaissRangeSearchPartialResult, - res_in: *mut FaissRangeSearchResult, + #[doc = " Build an index with the sequence of processing steps described in\n the string."] + pub fn faiss_index_factory( + p_index: *mut *mut FaissIndex, + d: ::std::os::raw::c_int, + description: *const ::std::os::raw::c_char, + metric: FaissMetricType, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_RangeSearchPartialResult_finalize( - res: *mut FaissRangeSearchPartialResult, + #[doc = " Build a binary index with the sequence of processing steps described in\n the string."] + pub fn faiss_index_binary_factory( + p_index: *mut *mut FaissIndexBinary, + d: ::std::os::raw::c_int, + description: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " called by range_search before do_allocation"] - pub fn faiss_RangeSearchPartialResult_set_lims( - res: *mut FaissRangeSearchPartialResult, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index` when a file descriptor is\n provided."] + pub fn faiss_write_index(idx: *const FaissIndex, f: *mut FILE) -> ::std::os::raw::c_int; +} +extern "C" { + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index` when a file path is provided."] + pub fn faiss_write_index_fname( + idx: *const FaissIndex, + fname: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_RangeSearchPartialResult_new_result( - res: *mut FaissRangeSearchPartialResult, - qno: idx_t, - qr: *mut *mut FaissRangeQueryResult, + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index` when a file descriptor is given."] + pub fn faiss_read_index( + f: *mut FILE, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndex, ) -> ::std::os::raw::c_int; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct FaissDistanceComputer_H { - _unused: [u8; 0], +extern "C" { + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index` when a file path is given."] + pub fn faiss_read_index_fname( + fname: *const ::std::os::raw::c_char, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndex, + ) -> ::std::os::raw::c_int; } -pub type FaissDistanceComputer = FaissDistanceComputer_H; extern "C" { - #[doc = " called before computing distances"] - pub fn faiss_DistanceComputer_set_query( - dc: *mut FaissDistanceComputer, - x: *const f32, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index_binary` when a file descriptor is\n provided."] + pub fn faiss_write_index_binary( + idx: *const FaissIndexBinary, + f: *mut FILE, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Compute distance of vector i to current query."] - #[doc = " This function corresponds to the function call operator:"] - #[doc = " DistanceComputer::operator()"] - pub fn faiss_DistanceComputer_vector_to_query_dis( - dc: *mut FaissDistanceComputer, - i: idx_t, - qd: *mut f32, + #[doc = " Write index to a file.\n This is equivalent to `faiss::write_index_binary` when a file path is\n provided."] + pub fn faiss_write_index_binary_fname( + idx: *const FaissIndexBinary, + fname: *const ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " compute distance between two stored vectors"] - pub fn faiss_DistanceComputer_symmetric_dis( - dc: *mut FaissDistanceComputer, - i: idx_t, - j: idx_t, - vd: *mut f32, + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index_binary` when a file descriptor is\n given."] + pub fn faiss_read_index_binary( + f: *mut FILE, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndexBinary, ) -> ::std::os::raw::c_int; } extern "C" { - pub fn faiss_DistanceComputer_free(obj: *mut FaissDistanceComputer); + #[doc = " Read index from a file.\n This is equivalent to `faiss:read_index_binary` when a file path is given."] + pub fn faiss_read_index_binary_fname( + fname: *const ::std::os::raw::c_char, + io_flags: ::std::os::raw::c_int, + p_out: *mut *mut FaissIndexBinary, + ) -> ::std::os::raw::c_int; } extern "C" { #[doc = " Compute pairwise distances between sets of vectors"] @@ -1988,11 +2122,7 @@ extern "C" { ); } extern "C" { - #[doc = " Compute pairwise distances between sets of vectors"] - #[doc = " arguments from \"faiss_pairwise_L2sqr\""] - #[doc = " ldq equal -1 by default"] - #[doc = " ldb equal -1 by default"] - #[doc = " ldd equal -1 by default"] + #[doc = " Compute pairwise distances between sets of vectors\n arguments from \"faiss_pairwise_L2sqr\"\n ldq equal -1 by default\n ldb equal -1 by default\n ldd equal -1 by default"] pub fn faiss_pairwise_L2sqr_with_defaults( d: i64, nq: i64, @@ -2033,13 +2163,11 @@ extern "C" { pub fn faiss_fvec_renorm_L2(d: usize, nx: usize, x: *mut f32); } extern "C" { - #[doc = " Setter of threshold value on nx above which we switch to BLAS to compute"] - #[doc = " distances"] + #[doc = " Setter of threshold value on nx above which we switch to BLAS to compute\n distances"] pub fn faiss_set_distance_compute_blas_threshold(value: ::std::os::raw::c_int); } extern "C" { - #[doc = " Getter of threshold value on nx above which we switch to BLAS to compute"] - #[doc = " distances"] + #[doc = " Getter of threshold value on nx above which we switch to BLAS to compute\n distances"] pub fn faiss_get_distance_compute_blas_threshold() -> ::std::os::raw::c_int; } extern "C" { @@ -2059,57 +2187,13 @@ extern "C" { pub fn faiss_get_distance_compute_blas_database_bs() -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Setter of number of results we switch to a reservoir to collect results"] - #[doc = " rather than a heap"] + #[doc = " Setter of number of results we switch to a reservoir to collect results\n rather than a heap"] pub fn faiss_set_distance_compute_min_k_reservoir(value: ::std::os::raw::c_int); } extern "C" { - #[doc = " Getter of number of results we switch to a reservoir to collect results"] - #[doc = " rather than a heap"] + #[doc = " Getter of number of results we switch to a reservoir to collect results\n rather than a heap"] pub fn faiss_get_distance_compute_min_k_reservoir() -> ::std::os::raw::c_int; } -extern "C" { - #[doc = " Build and index with the sequence of processing steps described in"] - #[doc = " the string."] - pub fn faiss_index_factory( - p_index: *mut *mut FaissIndex, - d: ::std::os::raw::c_int, - description: *const ::std::os::raw::c_char, - metric: FaissMetricType, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Write index to a file."] - #[doc = " This is equivalent to `faiss::write_index` when a file descriptor is"] - #[doc = " provided."] - pub fn faiss_write_index(idx: *const FaissIndex, f: *mut FILE) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Write index to a file."] - #[doc = " This is equivalent to `faiss::write_index` when a file path is provided."] - pub fn faiss_write_index_fname( - idx: *const FaissIndex, - fname: *const ::std::os::raw::c_char, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Read index from a file."] - #[doc = " This is equivalent to `faiss:read_index` when a file descriptor is given."] - pub fn faiss_read_index( - f: *mut FILE, - io_flags: ::std::os::raw::c_int, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} -extern "C" { - #[doc = " Read index from a file."] - #[doc = " This is equivalent to `faiss:read_index` when a file path is given."] - pub fn faiss_read_index_fname( - fname: *const ::std::os::raw::c_char, - io_flags: ::std::os::raw::c_int, - p_out: *mut *mut FaissIndex, - ) -> ::std::os::raw::c_int; -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct CUstream_st { @@ -2136,20 +2220,14 @@ extern "C" { pub fn faiss_gpu_profiler_stop() -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Synchronizes the CPU against all devices (equivalent to"] - #[doc = " cudaDeviceSynchronize for each device)"] + #[doc = " Synchronizes the CPU against all devices (equivalent to\n cudaDeviceSynchronize for each device)"] pub fn faiss_gpu_sync_all_devices() -> ::std::os::raw::c_int; } -#[doc = " The user indices are only stored on the CPU; the GPU returns"] -#[doc = " (inverted list, offset) to the CPU which is then translated to"] -#[doc = " the real user index."] +#[doc = " The user indices are only stored on the CPU; the GPU returns\n (inverted list, offset) to the CPU which is then translated to\n the real user index."] pub const FaissIndicesOptions_INDICES_CPU: FaissIndicesOptions = 0; -#[doc = " The indices are not stored at all, on either the CPU or"] -#[doc = " GPU. Only (inverted list, offset) is returned to the user as the"] -#[doc = " index."] +#[doc = " The indices are not stored at all, on either the CPU or\n GPU. Only (inverted list, offset) is returned to the user as the\n index."] pub const FaissIndicesOptions_INDICES_IVF: FaissIndicesOptions = 1; -#[doc = " Indices are stored as 32 bit integers on the GPU, but returned"] -#[doc = " as 64 bit integers"] +#[doc = " Indices are stored as 32 bit integers on the GPU, but returned\n as 64 bit integers"] pub const FaissIndicesOptions_INDICES_32_BIT: FaissIndicesOptions = 2; #[doc = " Indices are stored as 64 bit integers on the GPU"] pub const FaissIndicesOptions_INDICES_64_BIT: FaissIndicesOptions = 3; @@ -2299,9 +2377,7 @@ extern "C" { pub fn faiss_GpuResources_free(obj: *mut FaissGpuResources); } extern "C" { - #[doc = " Call to pre-allocate resources for a particular device. If this is"] - #[doc = " not called, then resources will be allocated at the first time"] - #[doc = " of demand"] + #[doc = " Call to pre-allocate resources for a particular device. If this is\n not called, then resources will be allocated at the first time\n of demand"] pub fn faiss_GpuResources_initializeForDevice( arg1: *mut FaissGpuResources, arg2: ::std::os::raw::c_int, @@ -2316,8 +2392,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Returns the stream that we order all computation on for the"] - #[doc = " given device"] + #[doc = " Returns the stream that we order all computation on for the\n given device"] pub fn faiss_GpuResources_getDefaultStream( arg1: *mut FaissGpuResources, arg2: ::std::os::raw::c_int, @@ -2355,8 +2430,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Synchronizes the CPU with respect to the default stream for the"] - #[doc = " given device"] + #[doc = " Synchronizes the CPU with respect to the default stream for the\n given device"] pub fn faiss_GpuResources_syncDefaultStream( arg1: *mut FaissGpuResources, arg2: ::std::os::raw::c_int, @@ -2450,23 +2524,20 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Disable allocation of temporary memory; all temporary memory"] - #[doc = " requests will call cudaMalloc / cudaFree at the point of use"] + #[doc = " Disable allocation of temporary memory; all temporary memory\n requests will call cudaMalloc / cudaFree at the point of use"] pub fn faiss_StandardGpuResources_noTempMemory( arg1: *mut FaissStandardGpuResources, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Specify that we wish to use a certain fixed size of memory on"] - #[doc = " all devices as temporary memory"] + #[doc = " Specify that we wish to use a certain fixed size of memory on\n all devices as temporary memory"] pub fn faiss_StandardGpuResources_setTempMemory( arg1: *mut FaissStandardGpuResources, size: usize, ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Set amount of pinned memory to allocate, for async GPU <-> CPU"] - #[doc = " transfers"] + #[doc = " Set amount of pinned memory to allocate, for async GPU <-> CPU\n transfers"] pub fn faiss_StandardGpuResources_setPinnedMemory( arg1: *mut FaissStandardGpuResources, size: usize, @@ -2481,8 +2552,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { - #[doc = " Called to change the work ordering streams to the null stream"] - #[doc = " for all devices"] + #[doc = " Called to change the work ordering streams to the null stream\n for all devices"] pub fn faiss_StandardGpuResources_setDefaultNullStreamAllDevices( arg1: *mut FaissStandardGpuResources, ) -> ::std::os::raw::c_int; diff --git a/faiss-sys/src/lib.rs b/faiss-sys/src/lib.rs index c0505fd..2d13b0c 100644 --- a/faiss-sys/src/lib.rs +++ b/faiss-sys/src/lib.rs @@ -31,6 +31,21 @@ mod tests { assert!(!last_error.is_null()); } } + #[test] + fn flat_index_binary() { + const D: usize = 8; + unsafe { + let description = + CString::new::<&str>("BFlat".as_ref()).unwrap(); + let mut index_ptr = ::std::ptr::null_mut(); + let code = faiss_index_binary_factory( + &mut index_ptr, + (D & 0x7FFF_FFFF) as i32, + description.as_ptr(), + ); + assert_eq!(code, 0); + } + } #[test] fn flat_index() { diff --git a/src/index/io.rs b/src/index/io.rs index f32ea4c..4a5456d 100644 --- a/src/index/io.rs +++ b/src/index/io.rs @@ -2,7 +2,10 @@ use crate::error::{Error, Result}; use crate::faiss_try; -use crate::index::{CpuIndex, FromInnerPtr, IndexImpl, NativeIndex}; +use crate::index::{ + CpuIndex, FromInnerPtr, IndexImpl, NativeIndex, + CpuIndexBinary, FromInnerPtrBinary, BinaryIndexImpl, NativeIndexBinary +}; use faiss_sys::*; use std::ffi::CString; use std::os::raw::c_int; @@ -31,6 +34,28 @@ where } } + +/// Write a binary index to a file. +/// +/// # Error +/// +/// This function returns an error if the description contains any byte with the value `\0` (since +/// it cannot be converted to a C string), or if the internal index writing operation fails. +pub fn write_index_binary(index: &I, file_name: P) -> Result<()> +where + I: NativeIndexBinary, + I: CpuIndexBinary, + P: AsRef, +{ + unsafe { + let f = file_name.as_ref(); + let f = CString::new(f).map_err(|_| Error::BadFilePath)?; + + faiss_try(faiss_write_index_binary_fname(index.inner_ptr(), f.as_ptr()))?; + Ok(()) + } +} + /// Read an index from a file. /// /// # Error @@ -54,6 +79,30 @@ where } } + +/// Read a binary index from a file. +/// +/// # Error +/// +/// This function returns an error if the description contains any byte with the value `\0` (since +/// it cannot be converted to a C string), or if the internal index reading operation fails. +pub fn read_index_binary

(file_name: P) -> Result +where + P: AsRef, +{ + unsafe { + let f = file_name.as_ref(); + let f = CString::new(f).map_err(|_| Error::BadFilePath)?; + let mut inner = ptr::null_mut(); + faiss_try(faiss_read_index_binary_fname( + f.as_ptr(), + IoFlags::MEM_RESIDENT.into(), + &mut inner, + ))?; + Ok(BinaryIndexImpl::from_inner_ptr(inner)) + } +} + /// Read an index from a file with I/O flags. /// /// You can memory map some index types with this. @@ -79,6 +128,33 @@ where } } + +/// Read a binary index from a file with I/O flags. +/// +/// You can memory map some index types with this. +/// +/// # Error +/// +/// This function returns an error if the description contains any byte with the value `\0` (since +/// it cannot be converted to a C string), or if the internal index reading operation fails. +pub fn read_index_binary_with_flags

(file_name: P, io_flags: IoFlags) -> Result +where + P: AsRef, +{ + unsafe { + let f = file_name.as_ref(); + let f = CString::new(f).map_err(|_| Error::BadFilePath)?; + let mut inner = ptr::null_mut(); + faiss_try(faiss_read_index_binary_fname( + f.as_ptr(), + io_flags.0 as c_int, + &mut inner, + ))?; + Ok(BinaryIndexImpl::from_inner_ptr(inner)) + } +} + + #[cfg(test)] mod tests { use super::*; diff --git a/src/index/mod.rs b/src/index/mod.rs index a427d34..cf54dda 100644 --- a/src/index/mod.rs +++ b/src/index/mod.rs @@ -126,6 +126,69 @@ impl PartialOrd for Idx { } } + +/// Interface for a Faiss binary index. Most methods in this trait match the ones in +/// the native library, whereas some others serve as getters to the index' +/// parameters. +/// +/// Although all methods appear to be available for all binary index implementations, +/// some methods may not be supported. For instance, a [`BinaryFlatIndex`] stores +/// vectors sequentially, and so does not support `add_with_ids` nor +/// `remove_ids`. Users are advised to read the Faiss wiki pages in order +/// to understand which index algorithms support which operations. +/// +/// [`BinaryFlatIndex`]: flat/struct.BinaryFlatIndex.html +pub trait IndexBinary { + + /// Whether the BinaryIndex does not require training, or if training is done already + fn is_trained(&self) -> bool; + + /// The total number of vectors indexed + fn ntotal(&self) -> u64; + + /// The dimensionality of the indexed vectors + fn d(&self) -> u32; + + /// The metric type assumed by the index + fn metric_type(&self) -> MetricType; + + /// Add new data vectors to the index. + /// This assumes a C-contiguous memory slice of vectors, where the total + /// number of vectors is `x.len() / d`. + fn add(&mut self, x: &[u8]) -> Result<()>; + + /// Add new data vectors to the index with IDs. + /// This assumes a C-contiguous memory slice of vectors, where the total + /// number of vectors is `x.len() / d`. + /// Not all index types may support this operation. + fn add_with_ids(&mut self, x: &[u8], xids: &[Idx]) -> Result<()>; + + /// Train the underlying index with the given data. + fn train(&mut self, x: &[u8]) -> Result<()>; + + /// Similar to `search`, but only provides the labels. + fn assign(&mut self, q: &[u8], k: usize) -> Result; + + /// Perform a search for the `k` closest vectors to the given query vectors. + fn search(&mut self, q: &[u8], k: usize) -> Result; + + /// Perform a ranged search for the vectors closest to the given query vectors + /// by the given radius. + fn range_search(&mut self, q: &[u8], radius: i32) -> Result; + + /// Clear the entire index. + fn reset(&mut self) -> Result<()>; + + /// Remove data vectors represented by IDs. + fn remove_ids(&mut self, sel: &IdSelector) -> Result; + + /// Index verbosity level + fn verbose(&self) -> bool; + + /// Set Index verbosity level + fn set_verbose(&mut self, value: bool); +} + /// Interface for a Faiss index. Most methods in this trait match the ones in /// the native library, whereas some others serve as getters to the index' /// parameters. @@ -187,6 +250,67 @@ pub trait Index { fn set_verbose(&mut self, value: bool); } +impl IndexBinary for Box +where + BI: IndexBinary +{ + fn is_trained(&self) -> bool { + (**self).is_trained() + } + + fn ntotal(&self) -> u64 { + (**self).ntotal() + } + + fn d(&self) -> u32 { + (**self).d() + } + + fn metric_type(&self) -> MetricType { + (**self).metric_type() + } + + fn add(&mut self, x: &[u8]) -> Result<()> { + (**self).add(x) + } + + fn add_with_ids(&mut self, x: &[u8], xids: &[Idx]) -> Result<()> { + (**self).add_with_ids(x, xids) + } + + fn train(&mut self, x: &[u8]) -> Result<()> { + (**self).train(x) + } + + fn assign(&mut self, q: &[u8], k: usize) -> Result { + (**self).assign(q, k) + } + + fn search(&mut self, q: &[u8], k: usize) -> Result { + (**self).search(q, k) + } + + fn range_search(&mut self, q: &[u8], radius: i32) -> Result { + (**self).range_search(q, radius) + } + + fn reset(&mut self) -> Result<()> { + (**self).reset() + } + + fn remove_ids(&mut self, sel: &IdSelector) -> Result { + (**self).remove_ids(sel) + } + + fn verbose(&self) -> bool { + (**self).verbose() + } + + fn set_verbose(&mut self, value: bool) { + (**self).set_verbose(value) + } +} + impl Index for Box where I: Index, @@ -248,6 +372,96 @@ where } } +/// Sub-trait for native implementations of a Faiss binary index. +pub trait NativeIndexBinary: IndexBinary { + /// Retrieve a pointer to the native index object. + fn inner_ptr(&self) -> *mut FaissIndexBinary; +} + +impl NativeIndexBinary for Box { + fn inner_ptr(&self) -> *mut FaissIndexBinary { + (**self).inner_ptr() + } +} + +/// Trait for a Faiss binary index that can be safely searched over multiple threads. +/// Operations which do not modify the index are given a method taking an +/// immutable reference. This is not the default for every index type because +/// some implementations (such as the ones running on the GPU) do not allow +/// concurrent searches. +/// +/// Users of these methods should still note that batched querying is +/// considerably faster than running queries one by one, even in parallel. +pub trait ConcurrentIndexBinary: IndexBinary { + /// Similar to `search`, but only provides the labels. + fn assign(&self, q: &[u8], k: usize) -> Result; + + /// Perform a search for the `k` closest vectors to the given query vectors. + fn search(&self, q: &[u8], k: usize) -> Result; + + /// Perform a ranged search for the vectors closest to the given query vectors + /// by the given radius. + fn range_search(&self, q: &[u8], radius: i32) -> Result; +} + + +impl ConcurrentIndexBinary for Box { + fn assign(&self, q: &[u8], k: usize) -> Result { + (**self).assign(q, k) + } + + fn search(&self, q: &[u8], k: usize) -> Result { + (**self).search(q, k) + } + + fn range_search(&self, q: &[u8], radius: i32) -> Result { + (**self).range_search(q, radius) + } +} + + +/// Trait for Faiss index types known to be running on the CPU. +pub trait CpuIndexBinary: IndexBinary {} + +impl CpuIndexBinary for Box {} + +/// Trait for Faiss binary index types which can be built from a pointer +/// to a native implementation. +pub trait FromInnerPtrBinary: NativeIndexBinary { + /// Create a binary index using the given pointer to a native object. + /// + /// # Safety + /// + /// `inner_ptr` must point to a valid, non-freed CPU binary index, and cannot be + /// shared across multiple instances. The inner binary index must also be + /// compatible with the target `NativeIndexBinary` type according to the native + /// class hierarchy. For example, creating an `BinaryIndexImpl` out of a pointer + /// to `FaissIndexBinaryFlat` is valid, but creating a `FlatIndexBinary` out of a + /// plain `FaissIndexBinary` can cause undefined behavior. + unsafe fn from_inner_ptr(inner_ptr: *mut FaissIndexBinary) -> Self; +} + +/// Trait for Faiss binary index types which can be built from a pointer +/// to a native implementation. +pub trait TryFromInnerPtrBinary: NativeIndexBinary { + /// Create a binary index using the given pointer to a native object, + /// checking that the binary index behind the given pointer + /// is compatible with the target index type. + /// If the inner index is not compatible with the intended target type + /// (e.g. creating a `FlatIndexBinary` out of a `FaissIndexBinaryHNSW`), + /// an error is returned. + /// + /// # Safety + /// + /// This function is unable to check that + /// `inner_ptr` points to a valid, non-freed CPU binary index. + /// Moreover, `inner_ptr` must not be shared across multiple instances. + unsafe fn try_from_inner_ptr(inner_ptr: *mut FaissIndexBinary) -> Result + where + Self: Sized; +} + + /// Sub-trait for native implementations of a Faiss index. pub trait NativeIndex: Index { /// Retrieve a pointer to the native index object. @@ -359,6 +573,17 @@ where } } +pub fn try_clone_from_inner_ptr_binary(val: &T) -> Result +where + T: FromInnerPtrBinary, +{ + unsafe { + let mut new_index_ptr = ::std::ptr::null_mut(); + faiss_try(faiss_clone_index_binary(val.inner_ptr(), &mut new_index_ptr))?; + Ok(crate::index::FromInnerPtrBinary::from_inner_ptr(new_index_ptr)) + } +} + /// The outcome of an index assign operation. #[derive(Debug, Clone, PartialEq)] pub struct AssignSearchResult { @@ -372,6 +597,13 @@ pub struct SearchResult { pub labels: Vec, } +/// The outcome of an index search operation. +#[derive(Debug, Clone, PartialEq)] +pub struct SearchResultBinary { + pub distances: Vec, + pub labels: Vec, +} + /// The outcome of an index range search operation. #[derive(Debug, Clone, PartialEq)] pub struct RangeSearchResult { @@ -460,10 +692,21 @@ pub struct IndexImpl { inner: *mut FaissIndex, } +/// Native implementation of a Faiss binary index +/// running on the CPU. +#[derive(Debug)] +pub struct BinaryIndexImpl { + inner: *mut FaissIndexBinary, +} + unsafe impl Send for IndexImpl {} unsafe impl Sync for IndexImpl {} +unsafe impl Send for BinaryIndexImpl {} +unsafe impl Sync for BinaryIndexImpl {} + impl CpuIndex for IndexImpl {} +impl CpuIndexBinary for BinaryIndexImpl {} impl Drop for IndexImpl { fn drop(&mut self) { @@ -473,18 +716,46 @@ impl Drop for IndexImpl { } } + +impl Drop for BinaryIndexImpl { + fn drop(&mut self) { + unsafe { + faiss_IndexBinary_free(self.inner); + } + } +} + +impl BinaryIndexImpl { + pub fn inner_ptr(&self) -> *mut FaissIndexBinary { + self.inner + } +} + impl IndexImpl { pub fn inner_ptr(&self) -> *mut FaissIndex { self.inner } } + +impl NativeIndexBinary for BinaryIndexImpl { + fn inner_ptr(&self) -> *mut FaissIndexBinary { + self.inner + } +} + impl NativeIndex for IndexImpl { fn inner_ptr(&self) -> *mut FaissIndex { self.inner } } +impl FromInnerPtrBinary for BinaryIndexImpl { + unsafe fn from_inner_ptr(inner_ptr: *mut FaissIndexBinary) -> Self { + BinaryIndexImpl { inner: inner_ptr } + } +} + impl FromInnerPtr for IndexImpl { unsafe fn from_inner_ptr(inner_ptr: *mut FaissIndex) -> Self { IndexImpl { inner: inner_ptr } @@ -504,6 +775,19 @@ impl TryFromInnerPtr for IndexImpl { } } +impl TryFromInnerPtrBinary for BinaryIndexImpl { + unsafe fn try_from_inner_ptr(inner_ptr: *mut FaissIndexBinary) -> Result + where + Self: Sized, + { + if inner_ptr.is_null() { + Err(Error::BadCast) + } else { + Ok(BinaryIndexImpl { inner: inner_ptr }) + } + } +} + /// Index upcast trait. /// /// If you need to store several different types of indexes in one collection, @@ -525,6 +809,28 @@ pub trait UpcastIndex: NativeIndex { fn upcast(self) -> IndexImpl; } + +/// BinaryIndex upcast trait. +/// +/// If you need to store several different types of binary indexes in one collection, +/// you can cast all binary indexes to the common type `BinaryIndexImpl`. +/// # Examples +/// +/// ``` +/// # use faiss::{index::{BinaryIndexImpl, UpcastIndexBinary}, BinaryFlatIndex, index_binary_factory}; +/// let f1 = BinaryFlatIndex::new(128).unwrap(); +/// let f2 = index_binary_factory(128, "BFlat").unwrap(); +/// let v: Vec = vec![ +/// f1.upcast(), +/// f2, +/// ]; +/// ``` +/// +pub trait UpcastIndexBinary: NativeIndexBinary { + /// Convert an index to the base `BinaryIndexImpl` type + fn upcast(self) -> BinaryIndexImpl; +} + impl UpcastIndex for NI { fn upcast(self) -> IndexImpl { let inner_ptr = self.inner_ptr(); @@ -534,7 +840,18 @@ impl UpcastIndex for NI { } } + +impl UpcastIndexBinary for NIB { + fn upcast(self) -> BinaryIndexImpl { + let inner_ptr = self.inner_ptr(); + mem::forget(self); + + unsafe { BinaryIndexImpl::from_inner_ptr(inner_ptr) } + } +} + impl_native_index!(IndexImpl); +impl_native_binary_index!(BinaryIndexImpl); impl TryClone for IndexImpl { fn try_clone(&self) -> Result @@ -545,6 +862,16 @@ impl TryClone for IndexImpl { } } + +impl TryClone for BinaryIndexImpl { + fn try_clone(&self) -> Result + where + Self: Sized, + { + try_clone_from_inner_ptr_binary(self) + } +} + /// Use the index factory to create a native instance of a Faiss index, for `d`-dimensional /// vectors. `description` should follow the exact guidelines as the native Faiss interface /// (see the [Faiss wiki](https://github.com/facebookresearch/faiss/wiki/Faiss-indexes) for examples). @@ -572,9 +899,35 @@ where } } + +/// Use the index binary factory to create a native instance of a Faiss binary index, for `d`-dimensional +/// vectors. `description` should follow the exact guidelines as the native Faiss interface +/// (see the [Faiss wiki](https://github.com/facebookresearch/faiss/wiki/Binary-indexes) for examples). +/// +/// # Error +/// +/// This function returns an error if the description contains any byte with the value `\0` (since +/// it cannot be converted to a C string), or if the internal index factory operation fails. +pub fn index_binary_factory(d: u32, description: D) -> Result +where + D: AsRef, +{ + unsafe { + let description = + CString::new(description.as_ref()).map_err(|_| Error::IndexDescription)?; + let mut index_ptr = ::std::ptr::null_mut(); + faiss_try(faiss_index_binary_factory( + &mut index_ptr, + (d & 0x7FFF_FFFF) as i32, + description.as_ptr(), + ))?; + Ok(BinaryIndexImpl { inner: index_ptr }) + } +} + #[cfg(test)] mod tests { - use super::{index_factory, Idx, Index, TryClone}; + use super::{index_factory, Idx, Index, TryClone, index_binary_factory, IndexBinary}; use crate::metric::MetricType; #[test] @@ -584,6 +937,13 @@ mod tests { assert_eq!(index.ntotal(), 0); } + #[test] + fn index_binary_factory_flat() { + let index = index_binary_factory(64, "BFlat").unwrap(); + assert_eq!(index.is_trained(), true); // BFlat index does not need training + assert_eq!(index.ntotal(), 0); + } + #[test] fn index_factory_flat_boxed() { let index = index_factory(64, "Flat", MetricType::L2).unwrap(); diff --git a/src/index/scalar_quantizer.rs b/src/index/scalar_quantizer.rs index 2056aac..b3576ec 100644 --- a/src/index/scalar_quantizer.rs +++ b/src/index/scalar_quantizer.rs @@ -261,18 +261,6 @@ where faiss_IndexIVFScalarQuantizer_set_nprobe(self.inner_ptr(), value as usize); } } - - pub fn train_residual(&mut self, x: &[f32]) -> Result<()> { - unsafe { - let n = x.len() / self.d() as usize; - faiss_try(faiss_IndexIVFScalarQuantizer_train_residual( - self.inner_ptr(), - n as i64, - x.as_ptr(), - ))?; - Ok(()) - } - } } impl NativeIndex for IVFScalarQuantizerIndexImpl { diff --git a/src/lib.rs b/src/lib.rs index 299a4ce..a25b203 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -100,9 +100,12 @@ pub mod gpu; pub use index::flat::FlatIndex; pub use index::id_map::IdMap; -pub use index::io::{read_index, write_index}; +pub use index::io::{read_index, write_index, read_index_binary, write_index_binary}; pub use index::lsh::LshIndex; -pub use index::{index_factory, ConcurrentIndex, Idx, Index}; +pub use index::{ + index_factory, ConcurrentIndex, Idx, Index, + index_binary_factory, ConcurrentIndexBinary, IndexBinary, +}; pub use metric::MetricType; #[cfg(feature = "gpu")] diff --git a/src/macros.rs b/src/macros.rs index 049e5a2..9695552 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -176,7 +176,205 @@ macro_rules! impl_native_index { }; } + +/// A macro which provides a native binary index implementation to the given type. +macro_rules! impl_native_binary_index { + ($t:ty) => { + impl crate::index::IndexBinary for $t { + fn is_trained(&self) -> bool { + unsafe { faiss_IndexBinary_is_trained(self.inner_ptr()) != 0 } + } + + fn ntotal(&self) -> u64 { + unsafe { faiss_IndexBinary_ntotal(self.inner_ptr()) as u64 } + } + + fn d(&self) -> u32 { + unsafe { faiss_IndexBinary_d(self.inner_ptr()) as u32 } + } + + fn metric_type(&self) -> crate::metric::MetricType { + unsafe { + crate::metric::MetricType::from_code( + faiss_IndexBinary_metric_type(self.inner_ptr()) as u32 + ) + .unwrap() + } + } + + fn add(&mut self, x: &[u8]) -> Result<()> { + unsafe { + let n = x.len() / self.d() as usize; + faiss_try(faiss_IndexBinary_add(self.inner_ptr(), n as i64, x.as_ptr()))?; + Ok(()) + } + } + + fn add_with_ids(&mut self, x: &[u8], xids: &[crate::index::Idx]) -> Result<()> { + unsafe { + let n = x.len() / self.d() as usize; + faiss_try(faiss_IndexBinary_add_with_ids( + self.inner_ptr(), + n as i64, + x.as_ptr(), + xids.as_ptr() as *const _, + ))?; + Ok(()) + } + } + fn train(&mut self, x: &[u8]) -> Result<()> { + unsafe { + let n = x.len() / self.d() as usize; + faiss_try(faiss_IndexBinary_train(self.inner_ptr(), n as i64, x.as_ptr()))?; + Ok(()) + } + } + fn assign( + &mut self, + query: &[u8], + k: usize, + ) -> Result { + unsafe { + let nq = query.len() / self.d() as usize; + let mut out_labels = vec![Idx::none(); k * nq]; + faiss_try(faiss_IndexBinary_assign( + self.inner_ptr(), + nq as idx_t, + query.as_ptr(), + out_labels.as_mut_ptr() as *mut _, + k as i64, + ))?; + Ok(crate::index::AssignSearchResult { labels: out_labels }) + } + } + fn search(&mut self, query: &[u8], k: usize) -> Result { + unsafe { + let nq = query.len() / self.d() as usize; + let mut distances = vec![0_i32; k * nq]; + let mut labels = vec![Idx::none(); k * nq]; + faiss_try(faiss_IndexBinary_search( + self.inner_ptr(), + nq as idx_t, + query.as_ptr(), + k as idx_t, + distances.as_mut_ptr(), + labels.as_mut_ptr() as *mut _, + ))?; + Ok(crate::index::SearchResultBinary { distances, labels }) + } + } + fn range_search( + &mut self, + query: &[u8], + radius: i32, + ) -> Result { + unsafe { + let nq = (query.len() / self.d() as usize) as idx_t; + let mut p_res: *mut FaissRangeSearchResult = ::std::ptr::null_mut(); + faiss_try(faiss_RangeSearchResult_new(&mut p_res, nq))?; + faiss_try(faiss_IndexBinary_range_search( + self.inner_ptr(), + nq, + query.as_ptr(), + radius, + p_res, + ))?; + Ok(crate::index::RangeSearchResult { inner: p_res }) + } + } + + fn reset(&mut self) -> Result<()> { + unsafe { + faiss_try(faiss_IndexBinary_reset(self.inner_ptr()))?; + Ok(()) + } + } + + fn remove_ids(&mut self, sel: &IdSelector) -> Result { + unsafe { + let mut n_removed = 0; + faiss_try(faiss_IndexBinary_remove_ids( + self.inner_ptr(), + sel.inner_ptr(), + &mut n_removed, + ))?; + Ok(n_removed) + } + } + + fn verbose(&self) -> bool { + unsafe { faiss_IndexBinary_verbose(self.inner_ptr()) != 0 } + } + + fn set_verbose(&mut self, value: bool) { + unsafe { + faiss_IndexBinary_set_verbose(self.inner_ptr(), std::os::raw::c_int::from(value)); + } + } + } + }; +} + /// A macro which provides a concurrent index implementation to the given type. +macro_rules! impl_concurrent_binary_index { + ($t:ty) => { + impl crate::index::ConcurrentIndexBinary for $t + where + Self: crate::index::IndexBinary + crate::index::NativeIndexBinary, + { + fn assign(&self, query: &[u8], k: usize) -> Result { + unsafe { + let nq = query.len() / self.d() as usize; + let mut out_labels = vec![Idx::none(); k * nq]; + faiss_try(faiss_IndexBinary_assign( + self.inner_ptr(), + nq as idx_t, + query.as_ptr(), + out_labels.as_mut_ptr() as *mut _, + k as i64, + ))?; + Ok(AssignSearchResult { labels: out_labels }) + } + } + + fn search(&self, query: &[u8], k: usize) -> Result { + unsafe { + let nq = query.len() / self.d() as usize; + let mut distances = vec![0_i32; k * nq]; + let mut labels = vec![Idx::none(); k * nq]; + faiss_try(faiss_IndexBinary_search( + self.inner_ptr(), + nq as idx_t, + query.as_ptr(), + k as idx_t, + distances.as_mut_ptr(), + labels.as_mut_ptr() as *mut _, + ))?; + Ok(SearchResultBinary { distances, labels }) + } + } + + fn range_search(&self, query: &[u8], radius: i32) -> Result { + unsafe { + let nq = (query.len() / self.d() as usize) as idx_t; + let mut p_res: *mut FaissRangeSearchResult = ptr::null_mut(); + faiss_try(faiss_RangeSearchResult_new(&mut p_res, nq))?; + faiss_try(faiss_IndexBinary_range_search( + self.inner_ptr(), + nq, + query.as_ptr(), + radius, + p_res, + ))?; + Ok(RangeSearchResult { inner: p_res }) + } + } + } + }; +} + + +/// A macro which provides a concurrent binary index implementation to the given type. macro_rules! impl_concurrent_index { ($t:ty) => { impl crate::index::ConcurrentIndex for $t @@ -232,4 +430,4 @@ macro_rules! impl_concurrent_index { } } }; -} +} \ No newline at end of file